Garantire la stabilità del control plane quando si utilizzano webhook

I webhook di ammissione, o webhook in Kubernetes, sono un tipo di controller di ammissione che può essere utilizzato nei cluster Kubernetes per convalidare o modificare le richieste al control plane prima che una richiesta venga resa persistente. È comune che le applicazioni di terze parti utilizzino webhook che operano su risorse e spazi dei nomi critici per il sistema. I webhook configurati in modo errato possono influire sulle prestazioni e sull'affidabilità del control plane. Ad esempio, un webhook configurato in modo errato creato da un'applicazione di terze parti potrebbe impedire a GKE di creare e modificare risorse nello spazio dei nomi kube-system gestito, il che potrebbe ridurre la funzionalità del cluster.

Google Kubernetes Engine (GKE) monitora i tuoi cluster e utilizza il servizio Recommender per fornire indicazioni su come ottimizzare l'utilizzo della piattaforma. Per assicurarti che il tuo cluster rimanga stabile e con prestazioni elevate, consulta i suggerimenti di GKE per i seguenti scenari:

  • Webhook operativi, ma senza endpoint disponibili.
  • Webhook considerati non sicuri perché operano su risorse e spazi dei nomi fondamentali del sistema.

In questa guida troverai le istruzioni per controllare i webhook potenzialmente configurati in modo errato e aggiornarli, se necessario.

Per scoprire di più su come gestire insight e suggerimenti dai motori per suggerimenti, consulta Ottimizza l'utilizzo di GKE con insight e suggerimenti.

Identifica i webhook configurati in modo errato che potrebbero influire sul tuo cluster

Per ottenere insight che identificano i webhook che potrebbero influire sulle prestazioni e sulla stabilità del tuo cluster, segui le istruzioni per visualizzare insight e suggerimenti. Puoi ottenere insight nei seguenti modi:

  • Utilizza la console Google Cloud .
  • Utilizza Google Cloud CLI o l'API Recommender, filtrando con i sottotipi K8S_ADMISSION_WEBHOOK_UNSAFE e K8S_ADMISSION_WEBHOOK_UNAVAILABLE.

Dopo aver identificato i webhook tramite gli insight, segui le istruzioni per risolvere i problemi relativi ai webhook rilevati.

Quando GKE rileva webhook configurati in modo errato

GKE genera un insight e un suggerimento se uno dei seguenti criteri è vero per un cluster:

Risolvi i problemi relativi ai webhook rilevati

Le sezioni seguenti contengono istruzioni per risolvere i problemi relativi ai webhook che GKE ha rilevato come potenzialmente configurati in modo errato.

Dopo aver implementato le istruzioni e configurato correttamente i webhook, il suggerimento viene risolto entro 24 ore e non viene più visualizzato nella console.

Se non vuoi implementare il consiglio, puoi ignorarlo.

Webhook che segnalano l'assenza di endpoint disponibili

Se un webhook segnala che non ha endpoint disponibili, il servizio che supporta l'endpoint del webhook ha uno o più pod non in esecuzione. Per rendere disponibili gli endpoint webhook, segui le istruzioni per trovare e risolvere i problemi dei pod del servizio che supporta questo endpoint webhook:

  1. Visualizza approfondimenti e consigli, scegliendo un approfondimento alla volta per risolvere i problemi. GKE genera un insight per cluster, che elenca uno o più webhook con un endpoint non funzionante che deve essere esaminato. Per ciascuno di questi webhook, l'insight indica anche il nome del servizio, l'endpoint non funzionante e l'ultima volta che l'endpoint è stato chiamato.

  2. Trova i pod di distribuzione per il servizio associato al webhook:

    Console

    Nel riquadro laterale dell'insight, visualizza la tabella dei webhook configurati in modo errato. Fai clic sul nome del servizio.

    kubectl

    Esegui questo comando per descrivere il servizio:

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    Sostituisci SERVICE_NAME e SERVICE_NAMESPACE rispettivamente con il nome e lo spazio dei nomi del servizio.

    Se non riesci a trovare il nome del servizio elencato nel webhook, l'endpoint non disponibile potrebbe essere causato da una mancata corrispondenza tra il nome elencato nella configurazione e il nome effettivo del servizio. Per correggere la disponibilità dell'endpoint, aggiorna il nome del servizio nella configurazione del webhook in modo che corrisponda all'oggetto Service corretto.

  3. Ispeziona i pod di distribuzione per questo servizio:

    Console

    In Pod di pubblicazione in Dettagli servizio, visualizza l'elenco dei pod che supportano questo servizio.

    kubectl

    Identifica i pod non in esecuzione elencando il deployment o i pod:

    kubectl get deployment -n SERVICE_NAMESPACE
    

    In alternativa, esegui questo comando:

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    Per i pod non in esecuzione, controlla i log dei pod per capire perché non sono in esecuzione. Per istruzioni sui problemi comuni relativi ai pod, consulta Risolvi i problemi relativi ai workload di cui è stato eseguito il deployment.

Webhook considerati non sicuri

Se un webhook intercetta risorse in spazi dei nomi gestiti dal sistema o determinati tipi di risorse, GKE lo considera non sicuro e consiglia di aggiornare i webhook per evitare di intercettare queste risorse.

  1. Segui le istruzioni per visualizzare gli approfondimenti e i consigli, scegliendo un approfondimento alla volta per risolvere i problemi. GKE genera un solo insight per cluster, che elenca una o più configurazioni di webhook, ognuna delle quali elenca uno o più webhook. Per ogni configurazione del webhook elencata, l'insight indica il motivo per cui la configurazione è stata segnalata.
  2. Esamina la configurazione del webhook:

    Console

    Consulta la tabella nel riquadro laterale dell'insight. In ogni riga è presente il nome della configurazione del webhook e il motivo per cui questa configurazione è stata segnalata.

    Per esaminare ogni configurazione, fai clic sul nome per accedere alla configurazione nella dashboard Visualizzatore oggetti di GKE.

    kubectl

    Esegui il seguente comando kubectl per ottenere la configurazione del webhook, sostituendo CONFIGURATION_NAME con il nome della configurazione del webhook:

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    Se questo comando non restituisce nulla, eseguilo di nuovo, sostituendo validatingwebhookconfigurations con mutatingwebhookconfigurations.

    Nella sezione webhooks sono elencati uno o più webhook.

  3. Modifica la configurazione, a seconda del motivo per cui il webhook è stato segnalato:

    Escludi gli spazi dei nomi kube-system e kube-node-lease

    Un webhook viene segnalato se scope è *. In alternativa, un webhook viene segnalato se l'ambito è Namespaced e una delle seguenti condizioni è vera:

    • La condizione operator è NotIn e values omette kube-system e kube-node-lease, come nell'esempio seguente:

      webhooks:
      - admissionReviewVersions:
        ...
        namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: NotIn
            values:
            - blue-system
        objectSelector: {}
        rules:
        - apiGroups:
          ...
          scope: '*'
        sideEffects: None
        timeoutSeconds: 3
      

      Assicurati di impostare scope su Namespaced, non su *, in modo che il webhook operi solo in spazi dei nomi specifici. Assicurati inoltre che se operator è NotIn, includi kube-system e kube-node-lease in values (in questo esempio, con blue-system).

    • La condizione operator è In e values include kube-system e kube-node-lease, come nell'esempio seguente:

      namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values:
            - blue-system
            - kube-system
            - kube-node-lease
      

      Assicurati di impostare scope su Namespaced, non su *, in modo che il webhook operi solo in spazi dei nomi specifici. Assicurati che se operator è In, non includi kube-system e kube-node-lease in values. In questo esempio, solo blue-system deve trovarsi in values, poiché operator è In.

    Escludi le risorse corrispondenti

    Un webhook viene segnalato anche se nodes, tokenreviews, subjectaccessreviews o certificatesigningrequests sono elencati in risorse, come nell'esempio seguente:

    - admissionReviewVersions:
    ...
      resources:
      - 'pods'
      - 'nodes'
      - 'tokenreviews'
      - 'subjectaccessreviews'
      - 'certificatesigningrequests'
      scope: '*'
    sideEffects: None
    timeoutSeconds: 3
    

    Rimuovi nodes, tokenreviews, subjectaccessreviews e certificatesigningrequests dalla sezione delle risorse. Puoi conservare pods in resources.

Webhook che bloccano i componenti critici del sistema

I webhook che intercettano le richieste di creazione o aggiornamento di ClusterRoles e ClusterRoleBindings possono interferire con la capacità del control plane di riconciliare queste risorse di sistema critiche. Ad esempio, durante un upgrade del cluster, l'kube-apiserver potrebbe dover aggiornare i propri ruoli di sistema. Se un webhook non disponibile o configurato in modo errato blocca questo aggiornamento, kube-apiserver non riuscirà a diventare integro, il che bloccherà l'upgrade del cluster.

GKE non rileva se i webhook intercettano ClusterRoles e ClusterRoleBindings, pertanto non viene generato alcun insight per questo scenario.

L'esempio seguente mostra una configurazione del webhook problematica che intercetta ClusterRoles:

-   admissionReviewVersions:
  ...
  resources:
  -   'clusterroles'
  -   'clusterrolebindings'
  scope: '*'
sideEffects: None
timeoutSeconds: 3

Per evitare questa situazione, assicurati che i tuoi webhook non intercettino le richieste per ClusterRoles e ClusterRoleBindings che hanno l'impostazione system: prefix.

Deadlock di ammissione

Quando un webhook è configurato per il fail-closed, può creare una situazione in cui il cluster non può eseguire il recupero automaticamente. Ad esempio, se tutti i nodi di un cluster vengono eliminati, anche il webhook non sarà disponibile. Poiché l'aggiunta di un nuovo nodo richiede la convalida dell'ammissione, il webhook deve essere disponibile per approvare la richiesta. In questo modo si crea una dipendenza circolare che può impedire il ripristino del control plane del cluster.

GKE non rileva scenari di deadlock di ammissione, quindi non viene generato alcun insight per questo scenario. Tuttavia, potrebbe verificarsi un deadlock di ammissione se i pod del webhook non sono attivi. In questo caso, GKE rileva che il webhook non ha endpoint disponibili e genera un insight K8S_ADMISSION_WEBHOOK_UNAVAILABLE.

Per mitigare questo problema, puoi eliminare ValidatingWebhookConfiguration per interrompere la dipendenza circolare e consentire il recupero del cluster.

Disponibilità del control plane del cluster

Quando un webhook è configurato per l'esecuzione in modalità fail-closed, la disponibilità del control plane Kubernetes dipende dalla disponibilità del webhook. Per migliorare la disponibilità del control plane, considera quanto segue:

GKE non rileva problemi di disponibilità del control plane del cluster causati dai webhook, pertanto non viene generato alcun insight per questo scenario.

  • Limita l'ambito del webhook: puoi esentare le risorse critiche dalla convalida da parte del webhook per evitare che interferisca con processi sensibili. Puoi esentare spazi dei nomi o tipi specifici di risorse. Tuttavia, tieni presente le dipendenze non ovvie. Ad esempio, un ConfigMap può essere una risorsa fondamentale per l'elezione del leader in Kubernetes.

  • Rafforza il deployment del webhook: l'esecuzione del webhook in più pod può aumentare la resilienza e l'uptime. Puoi utilizzare i selettori di nodi per distribuire i pod in diversi domini in errore.

Passaggi successivi