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, den privilegierten Modus für die Container zu verwenden.
Hinweise
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 diesen Task 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
Sie können beschreibbare cgroups in Ihren Knotenpools aktivieren, indem Sie die containerd-Konfiguration anpassen. Sie können diese Konfiguration auf Ihren gesamten Cluster oder auf bestimmte Knotenpools in Standardclustern anwenden.
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
Geben Sie die aktualisierte Konfigurationsdatei an, wenn Sie einen Cluster oder einen Knotenpool erstellen oder aktualisieren.
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 beschreibbare Cgroups für einen oder mehrere Container im Pod.
Verwenden Sie die QoS-Klasse (Guaranteed Quality of Service), 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 der Pod-Spezifikation eines der folgenden Labels 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 beschreibbare 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.