Auf dieser Seite wird beschrieben, wie Sie Probleme mit dem Kubernetes API-Server (kube-apiserver
) für Google Distributed Cloud beheben.
Webhook-Zeitüberschreitungen und fehlgeschlagene Webhook-Aufrufe
Diese Fehler können auf verschiedene Arten angezeigt werden. Wenn eines der folgenden Symptome auftritt, können Webhook-Aufrufe fehlschlagen:
Verbindung abgelehnt: Wenn
kube-apiserver
Zeitüberschreitungsfehler beim Aufrufen des Webhooks meldet, wird der folgende Fehler in den Logs gemeldet:failed calling webhook "server.system.private.gdc.goog": failed to call webhook: Post "https://root-admin-webhook.gpc-system.svc:443/mutate-system-private-gdc-goog-v1alpha1-server?timeout=10s": dial tcp 10.202.1.18:443: connect: connection refused
Kontextfrist überschritten: In den Logs wird möglicherweise auch der folgende Fehler angezeigt:
failed calling webhook "namespaces.hnc.x-k8s.io": failed to call webhook: Post "https://hnc-webhook-service.hnc-system.svc:443/validate-v1-namespace?timeout=10s\": context deadline exceeded"
Wenn Sie davon ausgehen, dass Webhook-Zeitüberschreitungen oder fehlgeschlagene Webhook-Aufrufe auftreten, verwenden Sie eine der folgenden Methoden, um das Problem zu bestätigen:
Sehen Sie im API-Serverprotokoll nach, ob ein Netzwerkproblem vorliegt.
- Prüfen Sie das Log auf netzwerkbezogene Fehler wie
TLS handshake error
. - Prüfen Sie, ob der IP-/Port mit dem übereinstimmt, wie der API-Server für Antworten konfiguriert ist.
- Prüfen Sie das Log auf netzwerkbezogene Fehler wie
Überwachen Sie die Webhook-Latenz mit den folgenden Schritten:
Rufen Sie in der Console die Seite Cloud Monitoring auf.
Wählen Sie Metrics Explorer aus.
Wählen Sie den Messwert
apiserver_admission_webhook_admission_duration_seconds
aus:
Versuchen Sie, dieses Problem mit den folgenden Vorschlägen zu beheben:
Für den Webhook sind möglicherweise zusätzliche Firewallregeln erforderlich. Weitere Informationen finden Sie unter Firewallregeln für bestimmte Anwendungsfälle hinzufügen.
Wenn der Webhook mehr Zeit benötigt, können Sie einen benutzerdefinierten Zeitlimitwert konfigurieren. Die Latenz der Webhooks erhöht die Latenz der API-Anfrage zusätzlich. Daher sollte sie so schnell wie möglich ausgewertet werden.
Wenn der Webhook-Fehler die Clusterverfügbarkeit blockiert oder der Webhook unbedenklich zu entfernen ist und die Situation entschärft, prüfen Sie, ob es möglich ist, den
failurePolicy
vorübergehend aufIgnore
zu setzen oder den problematischen Webhook zu entfernen.
API-Server-Anruffehler oder Latenz
Dieser Fehler kann auf verschiedene Arten auftreten:
Fehler bei der externen Namensauflösung: Ein externer Client gibt möglicherweise Fehler zurück, die
lookup
in der Nachricht enthalten. Dazu gehören:dial tcp: lookup kubernetes.example.com on 127.0.0.1:53: no such host
Dieser Fehler gilt nicht für einen Client, der im Cluster ausgeführt wird. Die IP-Adresse des Kubernetes-Dienstes wird eingefügt, sodass keine Auflösung erforderlich ist.
Netzwerkfehler: Der Client gibt möglicherweise einen generischen Netzwerkfehler aus, wenn er versucht, den API-Server zu wählen, wie in den folgenden Beispielen:
dial tcp 10.96.0.1:443: connect: no route to host dial tcp 10.96.0.1:443: connect: connection refused dial tcp 10.96.0.1:443: connect: i/o timeout
Hohe Latenz beim Herstellen einer Verbindung zum API-Server: Die Verbindung zum API-Server ist möglicherweise erfolgreich, aber die Anfragen verursachen eine Zeitüberschreitung auf Clientseite. In diesem Szenario gibt der Client normalerweise Fehlermeldungen aus, die
context deadline exceeded
enthalten.
Wenn die Verbindung zum API-Server vollständig fehlschlägt, versuchen Sie die Verbindung in derselben Umgebung, in der der Client den Fehler meldet. Sitzungsspezifische Kubernetes-Container können so verwendet werden, um einen Debugging-Container in die vorhandenen Namespaces einzufügen:
Verwenden Sie von dort aus, wo der problematische Client ausgeführt wird,
kubectl
, um eine Anfrage mit hoher Ausführlichkeit auszuführen. Beispielsweise erfordert eineGET
-Anfrage an/healthz
normalerweise keine Authentifizierung:kubectl get -v999 --raw /healthz
Wenn die Anfrage fehlschlägt oder
kubectl
nicht verfügbar ist, können Sie die URL aus der Ausgabe abrufen und die Anfrage mitcurl
manuell ausführen. Wenn der aus der vorherigen Ausgabe abgerufene Diensthost beispielsweisehttps://192.0.2.1:36917/
war, können Sie so eine ähnliche Anfrage senden:# Replace "--ca-cert /path/to/ca.pem" to "--insecure" if you are accessing # a local cluster and you trust the connection cannot be tampered. # The output is always "ok" and thus contains no sensentive information. curl -v --cacert /path/to/ca.pem https://192.0.2.1:36917/healthz
Die Ausgabe dieses Befehls zeigt in der Regel die Ursache einer fehlgeschlagenen Verbindung an.
Wenn die Verbindung erfolgreich, aber langsam ist oder das Zeitlimit überschreitet, weist dies auf einen überlasteten API-Server hin. Zur Bestätigung sehen Sie sich in der Console
API Server Request Rate
an und fordern Sie Latenzmesswerte inCloud Kubernetes > Anthos > Cluster > K8s Control Plane
an.
Prüfen Sie die folgenden Optionen, um diese Verbindungsfehler oder Latenzprobleme zu beheben:
Wenn innerhalb des Clusters ein Netzwerkfehler auftritt, liegt möglicherweise ein Problem mit dem Plug-in Container Network Interface (CNI) vor. Dieses Problem ist in der Regel vorübergehend und löst sich nach einer Pod-Neuerstellung oder -Neuplanung selbst.
Wenn der Netzwerkfehler von außerhalb des Clusters stammt, prüfen Sie, ob der Client richtig für den Zugriff auf den Cluster konfiguriert ist, oder generieren Sie die Clientkonfiguration noch einmal. Wenn die Verbindung über einen Proxy oder ein Gateway erfolgt, prüfen Sie, ob eine andere Verbindung, die den gleichen Mechanismus nutzt, funktioniert.
Wenn der API-Server überlastet ist, bedeutet dies in der Regel, dass viele Clients gleichzeitig auf den API-Server zugreifen. Ein einzelner Client kann einen API-Server aufgrund der Drosselung und der Funktion Priorität und Fairness nicht überlasten. Prüfen Sie die Arbeitslast für die folgenden Bereiche:
- Funktioniert auf Pod-Ebene. Es ist häufiger, dass Pods versehentlich erstellt und vergessen werden als übergeordnete Ressourcen.
- Passen Sie die Anzahl der Replikate durch fehlerhafte Berechnung an.
- Ein Webhook, der die Anfrage in einer Schleife an sich selbst zurückgibt oder die Last erhöht, indem mehr Anfragen erstellt werden, als er verarbeitet.