Übersicht
Ein Prozess-ID-Limit (PID) ist eine Kubernetes-Ressourcenbeschränkung für Knoten und Pods, um die Erstellung einer übermäßigen Anzahl von Prozessen zu verhindern, die sich auf die Knotenstabilität auswirken kann. Apigee Hybrid unterstützt die Kubernetes-Funktion zum Festlegen von Prozess-ID-Limits. In diesem Dokument finden Sie eine Anleitung zum Festlegen dieser Limits sowie Empfehlungen für Werte für Apigee-Dienste auf bestimmten Plattformen.
Wenn Apigee Hybrid-Nutzer ihre eigenen Cluster verwalten, kann das Festlegen von PID-Limits in Kubernetes die Systemstabilität, Sicherheit und Ressourcenverwaltung verbessern. Dies entspricht auch den Best Practices für Kubernetes.
Definitionen von Prozess-ID-Limits
Zu den Prozess-ID-Limits gehören Knoten-PID-Limits und Pod-PID-Limits.
Die Knoten-PID-Limits umfassen Kube-reservierte und systemreservierte PIDs. Die Gesamtzahl der zuweisbaren PIDs ist die maximale Anzahl von PIDs des Kernels minus die Kube-reservierten PIDs minus die systemreservierten PIDs minus die PIDs des Schwellenwerts für die Bereinigung:
Maximale ID-Anzahl des Kernels |
|
|
|
= Zuweisbar |
- Maximale ID-Anzahl des Kernels: Werden durch das Betriebssystem und seine Kerneleinstellungen bestimmt. Da Apigee Hybrid ausschließlich auf einem Linux-Kernel ausgeführt wird, werden in diesem Leitfaden Linux-basierte Grenzwerte für Kubernetes-Knoten behandelt. Die maximale Anzahl der Prozess-ID-Limits für einen Linux-Kernel beträgt 4.194.304.
- Kube-reserviert und systemreserviert: Für die Ressourcenreservierung für Kubernetes- oder Betriebssystem-System-Daemons.
- Schwellenwert für die Bereinigung: Das Limit, das den Druck auf den Knoten signalisiert. Der Knoten wird entfernt, wenn der Grenzwert erreicht ist. Weitere Informationen finden Sie unter PID-basierte Bereinigung.
- Zuweisbar: Die Anzahl der verfügbaren PIDs. Weitere Informationen finden Sie unter Kubernetes: Knoten zuweisbar. „Kube-reserviert“ und „systemreserviert“ können mit Einstellungen für das Knoten-PID-Limit konfiguriert werden.
Das Pod-PID-Limit kann für den Knoten konfiguriert und von allen Pods auf dem Knoten gemeinsam genutzt werden.
Vorbereiten der Verwaltung der Prozess-ID-Limits
Bei diesen Verfahren werden die folgenden Umgebungsvariablen verwendet:
export PROJECT_ID=MY_PROJECT_IDexport CLUSTER_NAME=MY_CLUSTER_NAME
export LOCATION=MY_CLUSTER_LOCATION
export APIGEE_NAMESPACE=MY_APIGEE_NAMESPACE # Default: apigee
Zugriff überprüfen
Bevor Sie das Prozess-ID-Limit konfigurieren, müssen Sie Zugriff zum Bearbeiten von Kubernetes-Clustern haben.
Die folgenden Schritte gelten für Installationen in GKE. Informationen zu anderen Plattformen finden Sie in der Dokumentation für Ihre Plattform.
-
Prüfen Sie, ob Sie die Rolle „roles/container.clusterAdmin“ in der IAM-Richtlinie haben:
gcloud projects get-iam-policy ${PROJECT_ID} \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:your_account_email"
- Wenn Sie keinen Zugriff haben, fügen Sie Ihrem Konto die Rolle hinzu:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member user:your_account_email \ --role roles/container.clusterAdmin
Vorhandene PID-Limits prüfen
Prüfen Sie, ob für den Knoten bereits PID-Limits festgelegt sind, bevor Sie neue Limits konfigurieren.
-
Rufen Sie einen Knoten aus dem Cluster ab, um Werte zu prüfen. Sie müssen Knoten aus den Knotenpools
apigee-data
undapigee-runtime
prüfen:kubectl get nodes -n ${APIGEE_NAMESPACE}
Die Ausgabe sollte in etwa so aussehen:
NAME STATUS ROLES AGE VERSION gke-my-hybrid-apigee-data-0a1b2c3d-efgh Ready
2d8h v1.31.5-gke.1169000 gke-my-hybrid-apigee-runtime-1b2c3d4e-fghi Ready 2d8h v1.31.5-gke.1169000 -
Exportieren Sie den Knotennamen aus der Ausgabe des vorherigen Schritts. Führen Sie diesen Schritt zuerst für einen
apigee-data
-Knoten und dann noch einmal für einenapigee-runtime
-Knoten aus:Code
export NODE_NAME=MY_NODE_NAME
Beispiel
export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
- Prüfen Sie die PID-Limits des Knotens. Verwenden Sie die folgenden Befehle, um die reservierten Werte zu prüfen. Wenn der Wert null ist, ist er nicht konfiguriert:
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.kubeReserved'
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.systemReserved'
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.evictionHard'
- Prüfen Sie das PID-Limit des Pods. Mit dem folgenden Befehl können Sie das vorhandene PID-Limit des Pods prüfen. Wenn der zurückgegebene Wert
-1
oder leer ist, ist das Limit nicht festgelegt:kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.podPidsLimit'
Prozess-ID-Limits verwalten
Knoten-PID-Limits verwalten
Bei Installationen in GKE werden die Infrastrukturressourcen von Kubernetes-Knoten intern verwaltet und Sie müssen sie nicht konfigurieren. Die aktuelle Kapazität und die zuweisbaren Ressourcen können gemäß Zuweisbare Ressourcen für Knoten in der Google Kubernetes Engine-Dokumentation eingesehen werden.
Informationen zu Nicht-GKE-Plattformen finden Sie in der entsprechenden Kubernetes-Dokumentation für die Plattform. Wenn der Cluster/Knoten vom Nutzer verwaltet wird (im Gegensatz zu „vollständig verwaltet“), können das Kube-reservierte PID-Limit und das systemreservierte PID-Limit mit Kubelet konfiguriert werden. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter Knoten-PID-Limits.
Tools
In diesem Verfahren wird Kubelet verwendet, um das Prozess-ID-Limit zu verwalten. Kubelet ist der Agent, der auf Pods und Containern ausgeführt wird und dafür sorgt, dass sie gemäß ihrer PodSpec ausgeführt werden. Wenn Sie Kubelet installieren müssen, folgen Sie der Anleitung in der Kubernetes-Dokumentation: kubeadm, kubelet und kubectl installieren.
Prozedur
-
Erstellen Sie eine Kubelet-Konfigurationsdatei mit dem Namen
kubelet-config.yaml
.apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration kubeReserved: pid: PID_VALUE # Example: 1000
Weitere Informationen zu den Konfigurationen finden Sie in der Kubernetes-Dokumentation unter Kube-reserviert.
-
Wenden Sie die Kubelet-Konfiguration an:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
Pod-PID-Limits verwalten
Limit auswählen
Wenn das PID-Limit zu niedrig eingestellt ist, kann dies verhindern, dass ein Pod gestartet wird. Wenn es zu hoch eingestellt ist, werden Ressourcenfehler möglicherweise nicht erkannt. Bei der Auswahl des geeigneten Limits ist es wichtig, das bisherige Verhalten des Knotens und alle dienstspezifischen Anforderungen zu berücksichtigen.
Für den Wert ist in GKE ein erforderlicher Bereich festgelegt: [1024, 4194304]. Auf GKE-Plattformen können Sie den Status Ihrer Kubernetes-Dienstkonten im Google Cloud console Metrics Explorer sehen. Wählen Sie die Messwerte Kubernetes-Knoten – PID-Nutzung aus und wenden Sie Filter an. Dieser Messwert zeigt die aktuelle Nutzung von Prozess-IDs und kann als Referenz bei der Auswahl eines PID-Limits dienen.
Auf Nicht-GKE-Plattformen sind möglicherweise andere Monitoring-Optionen verfügbar. Informationen zum Prüfen der Messwerte finden Sie in der Kubernetes-Dokumentation der entsprechenden Plattform.
Anforderungen an die Prozess-ID für Apigee-Pods
Apigee Hybrid verwendet zwei Knotenpools: „apigee-data“ und „apigee-runtime“. Da einige der Apigee-Komponenten in beiden Knotenpools bereitgestellt werden, muss das Pod-PID-Limit für die beiden Knotenpools gleich sein. Das Pod-PID-Limit sollte auch höher sein als die maximale Anzahl von PIDs, die für alle Apigee-Pods erforderlich sind. Das erforderliche PID-Limit für Apigee-Pods beträgt 1.000 und liegt damit unter der Mindestanzahl für GKE-Plattformen.
Empfohlenes Limit für Pod-PIDs
Auf einigen Plattformen gilt eine Mindestwertanforderung für die Pod-PID-Limits. In diesem Fall wird die Mindestwertanforderung ausgewählt.
Plattform | Mindest-Pod-PID-Limit |
---|---|
GKE in Google Cloud | 1.024 |
GKE on AWS | 1.024 |
GKE on Azure | 1.024 |
Google Distributed Cloud (nur Software) in VMware | 1.024 |
Google Distributed Cloud (nur Software) in Bare Metal | 1.024 |
EKS | 1.000 |
AKS | 1.000 |
OpenShift | 1.000 |
Rancher Kubernetes Engine (RKE) | 1.000 |
Prozedur
Die Verfahren zum Verwalten der Pod-PID-Limits sind für GKE- und Nicht-GKE-Plattformen unterschiedlich.
GKE-Plattform
GKE-Plattformen, die das Aktualisieren des PID-Limits unterstützen, umfassen:
- GKE in Google Cloud: Weitere Informationen finden Sie unter gcloud container node-pools.
- GKE in AWS: Weitere Informationen finden Sie unter gcloud container aws node-pools.
- GKE in Azure: Weitere Informationen finden Sie unter gcloud container azure node-pools.
- Google Distributed Cloud (nur Software) in VMware: siehe gcloud container vmware node-pools
- Google Distributed Cloud (nur Software) in Bare Metal: siehe gcloud container bare-metal node-pools
Das Pod-PID-Limit wird über Knotensystemkonfigurationen gesteuert. Für den Wert ist in GKE ein erforderlicher Bereich festgelegt: [1024, 4194304]. Weitere Informationen finden Sie unter NodeKubeletConfig.
-
Erstellen Sie eine Knotensystemkonfiguration mit dem Namen
node-config.yaml
mit dem angegebenen Pod-PID-Limit und folgendem Inhalt:kubeletConfig: podPidsLimit: POD_PID_VALUE # Example: 1024
-
Wenden Sie die Konfiguration auf die Knotenpools
apigee-data
undapigee-runtime
von Apigee an. Wenn Sie die Konfiguration anwenden, startet der Knoten das Roll-out mit einer der Strategien für Knotenupgrades ohne Ausfallzeit.gcloud container OPTIONAL_HOST_PLATFORM node-pools update NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --region CLUSTER_LOCATION \ --system-config-from-file=node-config.yaml \ --project PROJECT_ID
Nicht-GKE-Plattformen
Auf Nicht-GKE-Plattformen wird das Pod-PID-Limit von Kubelet gesteuert. Das Limit wird durch das Feld podPidsLimit
in der Kubelet-Konfigurationsdatei festgelegt.
-
Erstellen Sie eine Kubelet-Konfigurationsdatei mit dem Namen
kubelet-config.yaml
und folgendem Inhalt:apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration podPidsLimit: POD_PID_VALUE # Example: 1024
-
Wenden Sie die Konfiguration an. Wenn Sie „podPidsLimit“ festlegen, muss der betroffene Knoten neu gestartet werden, was zu Ausfallzeiten führen kann:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
- Prüfen Sie die Konfiguration. Eine Anleitung finden Sie unter Vorhandene PID-Limits prüfen.
Die Konfigurationsbefehle für Pod-PID-Limits und die Empfehlungen für Tools sind auf den verschiedenen Plattformen unterschiedlich. Ausführliche Befehle finden Sie in der Dokumentation der jeweiligen Plattformen. Nachfolgend finden Sie einige Dokumentationslinks zu Nicht-GKE-Plattformen. Beachten Sie, dass sich diese ändern können:
Plattform | Dokumentation |
---|---|
EKS | Verwaltete Knoten mit Startvorlagen anpassen |
AKS | Anpassen der Knotenkonfiguration für Azure Kubernetes Service-Knotenpools (AKS) |
OpenShift | Risiken beim Festlegen höherer Prozess-ID-Limits für Red Hat OpenShift Service in AWS-Pods |
Rancher Kubernetes Engine (RKE) | Mit Kubectl und kubeconfig auf einen Cluster zugreifen |
Probleme mit Prozess-ID-Limits beheben
Pod hängt im Status Pending
mit dem Fehler FailedScheduling
fest
Wenn das Knoten- oder Pod-PID-Limit dazu führt, dass ein Pod entfernt oder der Start eines Pods verhindert wird, bleibt der Pod im Status Pending
hängen und schlägt mit dem Fehler FailedScheduling
fehl.
-
Rufen Sie die Spalte „Knoten“ ab:
kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
-
Prüfen Sie, ob die Bedingung
PIDPressure
vorliegt:kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
-
Alternativ können Sie das
ApigeeDeployment
des entsprechenden Pods prüfen. Rufen Sie dasApigeeDeployment
aus dem Ergebnis ab, das dasselbe Präfix wie der Pod mit dem Fehler hat.kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE}
-
Prüfen Sie, ob im letzten
Events
PID-bezogene Fehlermeldungen enthalten sind:kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME}
- Wenn sich bestätigt, dass die Ursache das PID-Limit ist, folgen Sie der Anleitung unter Knoten-PID-Limits verwalten, um das PID-Limit auf einen höheren Wert zu aktualisieren.
„podPidsLimit
“ ist ungültig
Wenn Sie das Limit für GKE festlegen, sollte podPidsLimit
das Limit überschreiten, wird der folgende Fehler angezeigt:
ERROR: (gcloud.container.node-pools.update) ResponseError: code=400, message=Invalid podPidsLimit: value must be 1024 <= podPidsLimit <= 4194304.
Aktualisieren Sie den Wert von „podPidsLimit“ auf einen Wert innerhalb des erforderlichen Bereichs.