Share via


Disabilitare cgroupsv2 nel nodo Nexus Kubernetes

I gruppi di controllo o "cgroups" consentono al sistema operativo Linux di allocare risorse, condivisioni CPU, memoria, I/O e così via, a una gerarchia di processi del sistema operativo. Queste risorse possono essere isolate da altri processi e in questo modo abilitare la containerizzazione dei carichi di lavoro.

Una versione avanzata 2 dei gruppi di controllo ("cgroupsv2") è stata inclusa nel kernel Linux 4.5. La differenza principale tra la versione 1 originale cgroups e la versione 2 più recente cgroups è che solo una singola gerarchia di cgroups è consentita nella cgroups versione 2. Oltre a questa differenza di gerarchia singola, cgroups v2 apporta alcune modifiche incompatibili con le versioni precedenti dello pseudo-file system usato cgroups v1, ad esempio rimuovendo lo tasks pseudofile e la clone_children funzionalità.

Alcune applicazioni possono basarsi sul comportamento v1 precedente cgroups , ma questa documentazione spiega come disabilitare cgroups la versione 2 nelle immagini del sistema operativo Linux più recenti usate per i nodi di lavoro di Operator Nexus Kubernetes.

Nexus Kubernetes 1.27 e versioni successive

Anche se Kubernetes 1.25 ha aggiunto il supporto per cgroups la versione 2 all'interno di kubelet, affinché cgroups sia abilitata la versione 2 nel kernel Linux.

I nodi di lavoro Nexus Kubernetes eseguono versioni speciali di Microsoft Azure Linux (precedentemente denominate CBL Mariner OS) che corrispondono alla versione di Kubernetes abilitata da tale immagine. L'immagine del sistema operativo Linux per i nodi di lavoro abilitacgroups la versione 2 per impostazione predefinita in Nexus Kubernetes versione 1.27.

cgroups La versione 2 non è abilitata nelle versioni di Nexus Kubernetes precedenti alla 1.27. Non è quindi necessario eseguire i passaggi descritti in questa guida per disabilitare cgroups la versione 2.

Prerequisiti

Prima di procedere con questa guida pratica, è consigliabile:

  • Per una panoramica completa e i passaggi necessari, vedere la Guida introduttiva al cluster Nexus Kubernetes.
  • Assicurarsi di soddisfare i prerequisiti descritti per garantire un'implementazione uniforme della guida.

Applicare la disabilitazione di cgroupv2 Daemonset

Avviso

Se si esegue questo passaggio in un cluster Kubernetes che contiene già carichi di lavoro in esecuzione, tutti i carichi di lavoro in esecuzione nei nodi del cluster Kubernetes verranno terminati perché il Daemonset computer host viene riavviato. È quindi consigliabile applicarlo Daemonset a un nuovo cluster Nexus Kubernetes prima che i carichi di lavoro siano pianificati.

Copiare la definizione seguente Daemonset in un file in un computer in cui è possibile eseguire kubectl comandi nel cluster Nexus Kubernetes in cui si vuole disabilitare cgroups la versione 2.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: revert-cgroups
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: revert-cgroups
  template:
    metadata:
      labels:
        name: revert-cgroups
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: cgroup-version
                    operator: NotIn
                    values:
                      - v1
      tolerations:
        - operator: Exists
          effect: NoSchedule
      containers:
        - name: revert-cgroups
          image: mcr.microsoft.com/cbl-mariner/base/core:1.0
          command:
            - nsenter
            - --target
            - "1"
            - --mount
            - --uts
            - --ipc
            - --net
            - --pid
            - --
            - bash
            - -exc
            - |
              CGROUP_VERSION=`stat -fc %T /sys/fs/cgroup/`
              if [ "$CGROUP_VERSION" == "cgroup2fs" ]; then
                echo "Using v2, reverting..."
                sed -i 's/systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all/systemd.unified_cgroup_hierarchy=0/' /boot/grub2/grub.cfg
                reboot
              fi

              sleep infinity
          securityContext:
            privileged: true
      hostNetwork: true
      hostPID: true
      hostIPC: true
      terminationGracePeriodSeconds: 0

E applicare :Daemonset

kubectl apply -f /path/to/daemonset.yaml

Il codice precedente Daemonset si applica a tutti i nodi del ruolo di lavoro Kubernetes nel cluster, ad eccezione di quelli in cui è stata applicata un'etichetta cgroup-version=v1 . Per questi nodi di lavoro con cgroups la versione 2 abilitata, modifica Daemonset la configurazione di avvio del kernel Linux e riavvia il computer.

È possibile monitorare l'implementazione di Daemonset e i relativi effetti eseguendo lo script seguente:

#!/bin/bash

set -x

# Set the DaemonSet name and label key-value pair
DAEMONSET_NAME="revert-cgroups"
NAMESPACE="kube-system"
LABEL_KEY="cgroup-version"
LABEL_VALUE="v1"
LOG_PATTERN="sleep infinity"

# Function to check if all pods are completed
check_pods_completed() {
        local pods_completed=0

        # Get the list of DaemonSet pods
        pod_list=$(kubectl get pods -n "${NAMESPACE}" -l name="${DAEMONSET_NAME}" -o jsonpath='{range.items[*]}{.metadata.name}{"\n"}{end}')

        # Loop through each pod
        for pod in $pod_list; do

                # Get the logs from the pod
                logs=$(kubectl logs -n "${NAMESPACE}" "${pod}")

                # Check if the logs end with the specified pattern
                if [[ $logs == *"${LOG_PATTERN}"* ]]; then
                        ((pods_completed++))
                fi

        done

        # Return the number of completed pods
        echo $pods_completed
}

# Loop until all pods are completed
while true; do
        pods_completed=$(check_pods_completed)

        # Get the total number of pods
        total_pods=$(kubectl get pods -n "${NAMESPACE}" -l name=${DAEMONSET_NAME} --no-headers | wc -l)

        if [ "$pods_completed" -eq "$total_pods" ]; then
                echo "All pods are completed."
                break
        else
                echo "Waiting for pods to complete ($pods_completed/$total_pods)..."
                sleep 10
        fi
done

# Once all pods are completed, add the label to the nodes
node_list=$(kubectl get pods -n "${NAMESPACE}" -l name=${DAEMONSET_NAME} -o jsonpath='{range.items[*]}{.spec.nodeName}{"\n"}{end}' | sort -u)

for node in $node_list; do
        kubectl label nodes "${node}" ${LABEL_KEY}=${LABEL_VALUE}
        echo "Added label '${LABEL_KEY}:${LABEL_VALUE}' to node '${node}'."
done

echo "Script completed."

Lo script precedente etichetta i nodi con cgroups v2 disabilitati. Questa etichettatura rimuove i Daemonset nodi che sono già stati riavviati con le impostazioni del cgroups kernel v1.