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.