Sie können GKE-Arbeitslasten (Google Kubernetes Engine) Ressourcen wie CPU und Arbeitsspeicher für untergeordnete Prozesse mithilfe der Linux-cgroups API verwalten lassen. In diesem Dokument wird beschrieben, wie Sie Containern Lese-/Schreibzugriff auf die cgroups API gewähren, ohne diese Container im privilegierten Modus auszuführen.
Wann sollten beschreibbare cgroups verwendet werden?
Standardmäßig bietet Kubernetes allen Linux-Containern schreibgeschützten Zugriff auf die cgroups API, indem das /sys/fs/cgroup-Dateisystem in jedem Container bereitgestellt wird.
Optional können Sie GKE dieses Dateisystem in bestimmten Pods im Lese-/Schreibmodus bereitstellen lassen, damit Root-Prozesse Ressourcen für untergeordnete Prozesse verwalten und einschränken können.
Diese beschreibbaren Cgroups tragen dazu bei, die Zuverlässigkeit in Anwendungen wie Ray zu verbessern, in denen Systemprozesse und Nutzercode im selben Container ausgeführt werden. Durch das Schreiben in das /sys/fs/cgroup-Dateisystem kann Ray Teile der Ressourcen eines Containers für kritische Prozesse reservieren. Sie können beschreibbare cgroups verwenden, um die Zuverlässigkeit dieser Anwendungen zu verbessern, ohne das Sicherheitsrisiko einzugehen, Container im privilegierten Modus auszuführen.
Hinweis
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Aktivieren Sie die Google Kubernetes Engine API. Google Kubernetes Engine API aktivieren
- Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl
gcloud components updateab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.
- Sie benötigen einen Autopilot- oder Standardcluster mit Version 1.34.1-gke.2541000 oder höher. Informationen zum Erstellen eines neuen Clusters finden Sie unter Autopilot-Cluster erstellen.
- Achten Sie darauf, dass Ihr Cluster cgroup v2 verwendet. Weitere Informationen finden Sie unter Knoten zu Linux-Cgroup v2 migrieren.
Schreibbare cgroups für Ihre Knoten aktivieren
Aktivieren Sie schreibbare cgroups auf Ihren Knoten, indem Sie die containerd-Konfiguration anpassen.
Fügen Sie in Ihrer containerd-Konfigurationsdatei einen writableCgroups-Abschnitt hinzu und legen Sie das Feld enabled auf true fest. Weitere Informationen finden Sie unter containerd-Konfiguration in GKE-Knoten anpassen.
writableCgroups:
enabled: true
Sie können beschreibbare Cgroups über einen der folgenden unterstützten Pfade aktivieren:
- Neuen Cluster erstellen:Geben Sie die Konfigurationsdatei beim Erstellen eines neuen Clusters mit dem Flag
--containerd-config-from-filean (verwenden Sie den Befehlgcloud container clusters createodergcloud container clusters create-auto). - Vorhandenen Cluster aktualisieren:Geben Sie die Konfigurationsdatei mit dem Flag
--containerd-config-from-filean, wenn Sie die Standardeinstellungen für Knoten auf Clusterebene aktualisieren (verwenden Sie den Befehlgcloud container clusters update). Das Aktualisieren von Knotenstandardwerten auf Clusterebene wirkt sich nicht auf vorhandene Knoten aus. In Standardclustern müssen Sie vorhandene Knotenpools aktualisieren (verwenden Sie den Befehlgcloud container clusters upgrademit dem Flag--node-pool) oder neu erstellen, damit die Konfiguration übernommen wird. - Neuen Knotenpool erstellen:Geben Sie in Standardclustern die Konfigurationsdatei mit dem Flag
--containerd-config-from-filean, wenn Sie einen neuen Knotenpool erstellen (verwenden Sie den Befehlgcloud container node-pools create).
Schreibbare cgroups in Arbeitslasten verwenden
Nachdem Sie beschreibbare Cgroups für Ihren Cluster oder Ihre Knotenpools aktiviert haben, konfigurieren Sie Ihre Arbeitslasten so, dass sie alle folgenden Anforderungen erfüllen:
- Wählen Sie einen Knoten aus, für den schreibbare cgroups aktiviert sind.
- Aktivieren Sie schreibbare cgroups für einen oder mehrere Container im Pod.
Verwenden Sie die QoS-Klasse mit garantierter Dienstqualität, indem Sie eine der folgenden Bedingungen erfüllen:
- Für Arbeitslasten, die Ressourcen auf Pod-Ebene angeben, legen Sie in der Pod-Spezifikation gleiche Werte für
resources.requestsundresources.limitsfest. - Legen Sie für Arbeitslasten, die Ressourcen für jeden Container angeben, in der Spezifikation jedes Containers im Pod, einschließlich der Init-Container, gleiche Werte für
resources.requestsundresources.limitsfest.
- Für Arbeitslasten, die Ressourcen auf Pod-Ebene angeben, legen Sie in der Pod-Spezifikation gleiche Werte für
So konfigurieren Sie diese Anforderungen:
Wenn Sie Knoten mit aktivierten beschreibbaren Cgroups auswählen möchten, fügen Sie das Label
node.gke.io/enable-writable-cgroups: "true"dem Feldspec.nodeSelectorin Ihrer Pod-Spezifikation hinzu:node.gke.io/enable-writable-cgroups: "true"Wenn Sie beschreibbare Cgroups für Ihre Arbeitslast aktivieren möchten, fügen Sie dem Feld
metadata.annotationsin Ihrer Pod-Spezifikation eine der folgenden Annotationen hinzu:Für den gesamten Pod aktivieren:
node.gke.io/enable-writable-cgroups: "true"Für einen bestimmten Container im Pod aktivieren:
node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"Ersetzen Sie
CONTAINER_NAMEdurch den Namen des Containers.
Wenn Sie die QoS-Klasse „Guaranteed“ für Ihren Pod konfigurieren möchten, geben Sie für jeden Container im Pod oder für den gesamten Pod gleiche CPU- und Arbeitsspeicheranforderungen und ‑limits an, wie im folgenden Beispiel:
resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"Sie müssen für jeden Container gleiche Anforderungen und Limits angeben, auch wenn Sie schreibbare Cgroups nur für einen der Container im Pod aktivieren.
Die endgültige Pod-Spezifikation sollte in etwa so aussehen:
In diesem Beispiel werden beschreibbare Cgroups für alle Container im Pod aktiviert:
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"In diesem Beispiel werden beschreibbare Cgroups für einen bestimmten Container in einem Pod mit mehreren Containern aktiviert:
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"
Prüfen, ob das cgroup-Dateisystem beschreibbar ist
So prüfen Sie die Berechtigungen für das /sys/fs/cgroup-Dateisystem für einen Pod oder einen Container:
- Suchen Sie den Pod, den Sie prüfen möchten. Sie können einen der Beispiel-Pods aus dem Abschnitt Schreibbare cgroups in Arbeitslasten verwenden verwenden.
Erstellen Sie eine Shell-Sitzung im Pod:
kubectl exec -it POD_NAME -- /bin/shErsetzen Sie
POD_NAMEdurch den Namen des Pods.Beschreiben Sie das bereitgestellte cgroup-Dateisystem:
mount | grep cgroupDie Ausgabe sieht etwa so aus:
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)In dieser Ausgabe gibt
rwan, dass das Dateisystem beschreibbar ist. Wenn in der Ausgaberoangezeigt wird, ist das Dateisystem schreibgeschützt.