Zulassungs-Webhooks oder Webhooks sind in Kubernetes eine Art von Admission-Controller, die in Kubernetes-Clustern verwendet werden können, um Anfragen an die Steuerungsebene zu validieren oder zu mutieren, bevor eine Anfrage beibehalten wird. Es ist üblich, dass Anwendungen von Drittanbietern Webhooks verwenden, die mit systemkritischen Ressourcen und Namespaces ausgeführt werden. Falsch konfigurierte Webhooks können sich auf die Leistung und Zuverlässigkeit der Steuerungsebene auswirken. Beispiel: Ein falsch konfigurierter Webhook, der von einer
Drittanbieteranwendung erstellt wurde,
könnte GKE daran hindern,
Ressourcen im verwalteten Namespace kube-system
zu erstellen und zu ändern, was
die Funktionalität des Clusters beeinträchtigen kann.
Die Google Kubernetes Engine (GKE) überwacht Ihre Cluster und verwendet den Recommender-Dienst, um eine Anleitung zum Optimieren Ihrer Nutzung der Plattform bereitzustellen. Damit Ihr Cluster stabil und leistungsfähig bleibt, finden Sie hier Empfehlungen von GKE für die folgenden Szenarien:
- Webhooks, die funktionieren, die aber keine Endpunkte haben.
- Webhooks, die als unsicher angesehen werden, da sie systemkritische Ressourcen und Namespaces bearbeiten.
In dieser Anleitung wird beschrieben, wie Sie Ihre potenziell falsch konfigurierten Webhooks prüfen und bei Bedarf aktualisieren können.
Weitere Informationen zum Verwalten von Statistiken und Empfehlungen von Recommendern finden Sie unter Nutzung von GKE mit Statistiken und Empfehlungen optimieren.
Falsch konfigurierte Webhooks identifizieren, die sich auf Ihren Cluster auswirken können
Folgen Sie der Anleitung zum Aufrufen von Statistiken und Empfehlungen, um Informationen zu erhalten, die Webhooks identifizieren, welche sich auf die Leistung und Stabilität Ihres Clusters auswirken können. So erhalten Sie Statistiken:
- Google Cloud Console verwenden.
- Verwenden Sie die Google Cloud CLI oder die Recommender API und filtern Sie mit den Untertypen
K8S_ADMISSION_WEBHOOK_UNSAFE
undK8S_ADMISSION_WEBHOOK_UNAVAILABLE
.
Nachdem Sie die Webhooks über die Statistiken identifiziert haben, folgen Sie der Anleitung zur Fehlerbehebung bei erkannten Webhooks.
Wenn GKE falsch konfigurierte Webhooks erkennt
GKE generiert eine Statistik und eine Empfehlung, wenn eines der folgenden Kriterien für einen Cluster zutrifft:
K8S_ADMISSION_WEBHOOK_UNAVAILABLE
: Der GKE-Cluster hat einen oder mehrere Webhooks, die keine verfügbaren Endpunkte melden. Folgen Sie der Anleitung unter Webhooks prüfen, die keine verfügbaren Endpunkte melden.K8S_ADMISSION_WEBHOOK_UNSAFE
: Der GKE-Cluster hat einen oder mehrere Webhooks, die aufgrund der abgefangenen Ressourcen als unsicher angesehen werden. Folgen Sie der Anleitung zum Webhooks prüfen, die als unsicher gelten. Die folgenden Webhooks gelten als unsicher:- Webhooks fangen Ressourcen, einschließlich Pods und Freigaben, im Namespace
kube-system
ab. - Webhooks fangen Freigaben im Namespace
kube-node-lease
ab. - Webhooks fangen clusterbezogene Systemressourcen ab, einschließlich
Nodes
,TokenReviews
,SubjectAccessReviews
undCertificateSigningRequests
.
- Webhooks fangen Ressourcen, einschließlich Pods und Freigaben, im Namespace
Fehlerbehebung bei erkannten Webhooks
In den folgenden Abschnitten finden Sie eine Anleitung zur Fehlerbehebung bei Webhooks, die GKE als potenziell falsch konfiguriert erkannt hat.
Nachdem Sie die Anleitung implementiert haben und die Webhooks ordnungsgemäß konfiguriert sind, wird die Empfehlung innerhalb von 24 Stunden aufgelöst und nicht mehr in der Console angezeigt. Wenn seit der Implementierung der Anleitung der Empfehlung weniger als 24 Stunden vergangen sind, können Sie die Empfehlung als erledigt markieren. Wenn Sie die Empfehlung nicht implementieren möchten, können Sie sie verwerfen.
Webhooks, die keine verfügbaren Endpunkte melden
Wenn ein Webhook meldet, dass er keine verfügbaren Endpunkte hat, hat der Dienst, der den Webhook-Endpunkt unterstützt, einen oder mehrere Pods, die nicht ausgeführt werden. Um die Webhook-Endpunkte verfügbar zu machen, folgen Sie der Anleitung, um die Pods des Dienstes zu finden und Fehler zu beheben, der diesen Webhook-Endpunkt unterstützt:
Statistiken und Empfehlungen aufrufen und jeweils eine Statistik zur Fehlerbehebung auswählen. GKE generiert eine Statistik pro Cluster. Diese listet einen oder mehrere Webhooks mit einem fehlerhaften Endpunkt auf, die untersucht werden müssen. Für jeden dieser Webhooks gibt die Statistik auch den Servicenamen, den Endpunkt eines fehlerhaften Endpunkts und den letzten Aufruf des Endpunkts an.
Suchen Sie die Bereitstellungs-Pods für den Dienst, der dem Webhook zugeordnet ist:
Console
Im Seitenleistenbereich der Statistik sehen Sie die Tabelle der falsch konfigurierten Webhooks. Klicken Sie auf den Namen des Dienstes.
kubectl
Führen Sie den folgenden Befehl aus, um den Dienst zu beschreiben:
kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
Ersetzen Sie SERVICE_NAME und SERVICE_NAMESPACE durch den Namen bzw. den Namespace des Dienstes.
Wenn Sie den Dienstnamen im Webhook nicht finden können, könnte der nicht verfügbare Endpunkt durch eine Abweichung zwischen dem in der Konfiguration aufgelisteten Namen und dem tatsächlichen Namen des Dienstes entstanden sein. Aktualisieren Sie den Dienstnamen in der Webhook-Konfiguration mit dem richtigen Dienstobjekt, um die Endpunktverfügbarkeit zu korrigieren.
Prüfen Sie die Bereitstellungs-Pods für diesen Dienst:
Console
Sehen Sie sich in den Dienstdetails unter Bereitstellungs-Pods die Liste der Pods an, die diesen Dienst unterstützen.
kubectl
Ermitteln Sie, welche Pods nicht ausgeführt werden. Listen Sie dazu das Deployment oder die Pods auf:
kubectl get deployment -n SERVICE_NAMESPACE
Oder führen Sie diesen Befehl aus:
kubectl get pods -n SERVICE_NAMESPACE -o wide
Prüfen Sie für alle nicht ausgeführten Pods in den Pod-Logs, warum der Pod nicht ausgeführt wird. Eine Anleitung zu häufigen Problemen mit Pods finden Sie unter Probleme mit bereitgestellten Arbeitslasten beheben.
Webhooks, die als unsicher gelten
Wenn ein Webhook Ressourcen in systemverwalteten Namespaces oder bestimmten Ressourcentypen abfängt, betrachtet GKE dies als unsicher und empfiehlt Ihnen, die Webhooks zu aktualisieren, damit diese Ressourcen nicht abgefangen werden.
- Folgen Sie der Anleitung zum Aufrufen von Statistiken und Empfehlungen und wählen Sie jeweils eine Statistik zur Fehlerbehebung aus. GKE generiert nur eine Information pro Cluster und diese Statistik listet eine oder mehrere Webhook-Konfigurationen auf, die jeweils einen oder mehrere Webhooks auflisten. Für jede aufgeführte Webhook-Konfiguration wird in der Statistik der Grund für die Meldung der Konfiguration angegeben.
Prüfen Sie die Webhook-Konfiguration:
Console
In der Seitenleiste der Statistik finden Sie die Tabelle. In jeder Zeile sind der Name der Webhook-Konfiguration und der Grund für die Meldung dieser Konfiguration aufgeführt.
Klicken Sie zum Prüfen jeder Konfiguration auf den Namen, um diese Konfiguration im GKE-Dashboard Objektbrowser aufzurufen.
kubectl
Führen Sie den folgenden
kubectl
-Befehl aus, um die Webhook-Konfiguration abzurufen. Ersetzen Sie dabei CONFIGURATION_NAME durch den Namen der Webhook-Konfiguration:kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
Wenn bei diesem Befehl nichts zurückgegeben wird, führen Sie den Befehl noch einmal aus und ersetzen Sie dabei
validatingwebhookconfigurations
durchmutatingwebhookconfigurations
.Im Abschnitt
webhooks
sind ein oder mehrere Webhooks aufgeführt.Bearbeiten Sie die Konfiguration abhängig davon, warum der Webhook gemeldet wurde:
Namespaces „kube-system” und „kube-node-lease” ausschließen
Ein Webhook wird gemeldet, wenn
scope
*
ist. Oder ein Webhook wird gemeldet, wenn der BereichNamespaced
ist und eine der folgenden Bedingungen erfüllt ist:Die
operator
-Bedingung istNotIn
undvalues
lässtkube-system
undkube-node-lease
wie im folgenden Beispiel aus:webhooks: - admissionReviewVersions: ... namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: NotIn values: - blue-system objectSelector: {} rules: - apiGroups: ... scope: '*' sideEffects: None timeoutSeconds: 3
Achten Sie darauf, dass
scope
aufNamespaced
und nicht auf*
festgelegt ist, damit der Webhook nur in bestimmten Namespaces ausgeführt wird. Wennoperator
NotIn
ist, können Siekube-system
undkube-node-lease
invalues
(In diesem Beispiel mitblue-system
) mit einschließen.Die
operator
-Bedingung istIn
undvalues
enthältkube-system
undkube-node-lease
wie im folgenden Beispiel:namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: In values: - blue-system - kube-system - kube-node-lease
Achten Sie darauf, dass
scope
aufNamespaced
und nicht auf*
festgelegt ist, damit der Webhook nur in bestimmten Namespaces ausgeführt wird. Stellen Sie sicher, dass wennoperator
In
ist,kube-system
undkube-node-lease
nicht invalues
mit einzuschließen. In diesem Beispiel sollte sich nurblue-system
invalues
befinden, da deroperator
In
ist.
Übereinstimmende Ressourcen ausschließen
Ein Webhook wird auch gemeldet, wenn
nodes
,tokenreviews
,subjectaccessreviews
odercertificatesigningrequests
wie im folgenden Beispiel unter Ressourcen aufgeführt sind:- admissionReviewVersions: ... resources: - 'pods' - 'nodes' - 'tokenreviews' - 'subjectacessreviews' - 'certificatesigningrequests' scope: '*' sideEffects: None timeoutSeconds: 3
Entfernen Sie
nodes
,tokenreviews
,subjectaccessreviews
undcertificatesigningrequests
aus dem Ressourcenabschnitt. Sie könnenpods
inresources
behalten.