Puoi consentire ai workload di Google Kubernetes Engine (GKE) di gestire le risorse, come CPU e memoria, per i processi secondari utilizzando l'API cgroups di Linux . Questo documento mostra come fornire ai container l'accesso in lettura/scrittura all'API cgroups senza eseguirli in modalità con privilegi.
Quando utilizzare i cgroups scrivibili
Per impostazione predefinita, Kubernetes fornisce a tutti i container Linux l'accesso in sola lettura all'API cgroups montando il file system /sys/fs/cgroup in ogni container.
Facoltativamente, puoi consentire a GKE di montare questo file system in modalità di lettura/scrittura in pod specifici per consentire ai processi root di gestire e limitare le risorse per i processi secondari.
Questi cgroups scrivibili contribuiscono a migliorare l'affidabilità delle applicazioni come
Ray che eseguono
processi di sistema e codice utente nello stesso container. Scrivendo nel file system /sys/fs/cgroup, Ray può riservare porzioni delle risorse di un container per i processi critici. Puoi utilizzare i cgroups scrivibili per migliorare l'affidabilità di queste applicazioni senza il rischio per la sicurezza di utilizzare la modalità con privilegi per i container.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il
gcloud components updatecomando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
- Assicurati di avere un cluster Autopilot o Standard che esegue la versione 1.34.1-gke.2541000 o successive. Per creare un nuovo cluster, vedi Crea un cluster Autopilot.
- Assicurati che il cluster utilizzi cgroup v2. Per maggiori informazioni, consulta Eseguire la migrazione dei nodi a Linux cgroup v2.
Abilitare i cgroups scrivibili per i nodi
Abilita i cgroups scrivibili nei pool di nodi personalizzando la configurazione di containerd. Puoi applicare questa configurazione all'intero cluster o a pool di nodi specifici nei cluster Standard.
Nel file di configurazione di containerd, aggiungi una sezione writableCgroups e imposta il campo enabled su true. Per maggiori informazioni, consulta
Personalizzare la configurazione di containerd nei nodi GKE.
writableCgroups:
enabled: true
Specifica il file di configurazione aggiornato quando crei o aggiorni un cluster o un pool di nodi.
Utilizzare i cgroups scrivibili nei workload
Dopo aver abilitato i cgroups scrivibili per il cluster o i pool di nodi, configura i workload in modo che soddisfino tutti i seguenti requisiti:
- Seleziona un nodo con i cgroups scrivibili abilitati.
- Abilita i cgroups scrivibili per uno o più container nel pod.
Utilizza la classe di qualità del servizio (QoS) garantita soddisfacendo una delle seguenti condizioni:
- Per i workload che
specificano le risorse a livello di pod,
imposta valori uguali per
resources.requestseresources.limitsnella specifica del pod. - Per i workload che specificano le risorse per ogni container, imposta valori uguali per
resources.requestseresources.limitsnella specifica di ogni container nel pod, inclusi i container di inizializzazione.
- Per i workload che
specificano le risorse a livello di pod,
imposta valori uguali per
Per configurare questi requisiti:
Per selezionare i nodi con i cgroups scrivibili abilitati, aggiungi l'
node.gke.io/enable-writable-cgroups: "true"etichetta alspec.nodeSelectorcampo nella specifica del pod:node.gke.io/enable-writable-cgroups: "true"Per abilitare i cgroups scrivibili per il workload, aggiungi una delle seguenti etichette al campo
metadata.annotationsnella specifica del pod:Abilita per l'intero pod:
node.gke.io/enable-writable-cgroups: "true"Abilita per un container specifico nel pod:
node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"Sostituisci
CONTAINER_NAMEcon il nome del container.
Per configurare la classe QoS garantita per il pod, specifica richieste e limiti di CPU e memoria uguali per ogni container nel pod o per l'intero pod, come nell'esempio seguente:
resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"Devi specificare richieste e limiti uguali per ogni container, anche se abiliti i cgroups scrivibili solo per uno dei container nel pod.
La specifica del pod finale dovrebbe essere simile agli esempi seguenti.
Questo esempio abilita i cgroups scrivibili per tutti i container nel pod:
apiVersion: v1 kind: Pod metadata: name: writable-cgroups-pod annotations: node.gke.io/enable-writable-cgroups: "true" spec: nodeSelector: node.gke.io/enable-writable-cgroups: "true" containers: - name: container image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"Questo esempio abilita i cgroups scrivibili per un container specifico in un pod multi-container:
apiVersion: v1 kind: Pod metadata: name: writable-cgroups-per-container annotations: node.gke.io/enable-writable-cgroups.busybox-container: "true" spec: nodeSelector: node.gke.io/enable-writable-cgroups: "true" containers: - name: busybox-container image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi" - name: container-disabled image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"
Verificare che il file system cgroup sia scrivibile
Per verificare le autorizzazioni sul file system /sys/fs/cgroup per un pod o un container:
- Identifica un pod che vuoi controllare. Puoi utilizzare uno dei pod di esempio della Utilizzare i cgroups scrivibili nei workload sezione.
Crea una sessione shell nel pod:
kubectl exec -it POD_NAME -- /bin/shSostituisci
POD_NAMEcon il nome del pod.Descrivi il file system cgroup montato:
mount | grep cgroupL'output è simile al seguente:
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)In questo output,
rwindica che il file system è scrivibile. Se nell'output viene visualizzatoro, il file system è di sola lettura.