Questa pagina mostra come risolvere i problemi relativi agli upgrade dei cluster Google Kubernetes Engine (GKE).
Problema: kube-apiserver non integro dopo l'upgrade del control plane
Il seguente problema si verifica quando avvii un upgrade manuale del control plane della versione GKE del cluster. Alcuni webhook di controllo degli accessi implementati dall'utente possono impedire ai componenti di sistema di creare ruoli RBAC permissivi necessari per funzionare correttamente. Durante un upgrade del control plane, Google Cloud viene ricreato il componente del server API Kubernetes (kube-apiserver). Se un webhook blocca il ruolo RBAC per il componente API server, l'API server non si avvia e l'upgrade del cluster non viene completato.
Anche se un webhook funziona correttamente, può causare l'esito negativo dell'upgrade del cluster perché potrebbe non essere raggiungibile dal control plane appena creato.
Il messaggio di errore in gcloud CLI è simile al seguente:
FAILED: All cluster resources were brought up, but: component "KubeApiserverReady" from endpoint "readyz of kube apiserver is not successful" is unhealthy.
Per identificare il webhook non riuscito, controlla i log di controllo di GKE per chiamate RBAC con le seguenti informazioni:
protoPayload.resourceName="RBAC_RULE"
protoPayload.authenticationInfo.principalEmail="system:apiserver"
RBAC_RULE
è il nome completo di un ruolo RBAC, ad esempio
rbac.authorization.k8s.io/v1/clusterroles/system:controller:horizontal-pod-autoscaler
.
Il nome del webhook non riuscito viene visualizzato nel log nel seguente formato:
admission webhook WEBHOOK_NAME denied the request
Per risolvere il problema, prova quanto segue:
- Modifica i vincoli per consentire la creazione e l'aggiornamento di ClusterRoles con
il prefisso
system:
. - Modifica il webhook in modo che non intercetti le richieste di creazione e aggiornamento dei ruoli RBAC di sistema.
- Disattiva il webhook.
Perché succede?
Kubernetes riconcilia automaticamente i ruoli RBAC di sistema predefiniti con i criteri predefiniti nell'ultima versione secondaria. A volte, le norme predefinite per i ruoli di sistema cambiano nelle nuove versioni di Kubernetes.
Per eseguire questa riconciliazione, GKE crea o aggiorna i ClusterRole e i ClusterRoleBinding nel cluster. Se hai un webhook che intercetta e rifiuta le richieste di creazione o aggiornamento a causa dell'ambito delle autorizzazioni utilizzate dalle norme RBAC predefinite, il server API non può funzionare nella nuova versione secondaria.
Problema: i workload vengono eliminati dopo l'upgrade del cluster Standard
I tuoi workload potrebbero essere a rischio di espulsione dopo un upgrade del cluster se si verificano tutte le seguenti condizioni:
- I carichi di lavoro di sistema richiedono più spazio quando il control plane del cluster esegue la nuova versione di GKE.
- I nodi esistenti non dispongono di risorse sufficienti per eseguire i nuovi carichi di lavoro di sistema e quelli esistenti.
- Il gestore della scalabilità automatica dei cluster è disabilitato per il cluster.
Per risolvere il problema, prova a procedere nel seguente modo:
- Abilita la scalabilità automatica per i pool di nodi esistenti
- Abilita provisioning automatico dei nodi
- Crea un nuovo node pool
- Scalare un node pool esistente
Problema: la versione del nodo non è compatibile con la versione del control plane
Controlla la versione di Kubernetes in esecuzione sul control plane del cluster e poi controlla la versione di Kubernetes in esecuzione sui node pool del cluster. Se uno dei pool di nodi del cluster è precedente di più di due versioni secondarie rispetto al control plane, questo potrebbe causare problemi al cluster.
Periodicamente, il team GKE esegue gli upgrade del control plane del cluster per tuo conto. I control plane vengono sottoposti all'upgrade a versioni stabili più recenti di Kubernetes. Per impostazione predefinita, i nodi di un cluster hanno l'upgrade automatico abilitato e ti consigliamo di non disabilitarlo.
Se l'upgrade automatico è disattivato per i nodi di un cluster e non esegui manualmente l'upgrade della versione del node pool a una versione compatibile con il control plane, quest'ultimo diventerà incompatibile con i nodi man mano che viene eseguito automaticamente l'upgrade nel tempo. L'incompatibilità tra il piano di controllo del cluster e i nodi può causare problemi imprevisti.
Le norme di supporto per la versione di Kubernetes e il disallineamento delle versioni indicano che i control plane sono compatibili con i nodi fino a due versioni secondarie precedenti a quella del control plane. Ad esempio, i piani di controllo Kubernetes 1.19 sono compatibili con i nodi Kubernetes 1.19, 1.18 e 1.17. Per risolvere questo problema, esegui manualmente l'upgrade della versionepool di nodil a una versione compatibile con il control plane.
Se ti preoccupa che la procedura di upgrade possa causare interruzioni ai carichi di lavoro in esecuzione sui nodi interessati, completa i seguenti passaggi per eseguire la migrazione dei carichi di lavoro a un nuovpool di nodiol:
- Crea un nuovo pool di nodi con una versione compatibile.
- Contrassegna i nodi del pool di nodi esistente come non pianificabili.
- (Facoltativo) Aggiorna i carichi di lavoro in esecuzione sul pool di nodi esistente per aggiungere un
nodeSelector per l'etichetta
cloud.google.com/gke-nodepool:NEW_NODE_POOL_NAME
, doveNEW_NODE_POOL_NAME
è il nome del nuovo pool di nodi. In questo modo, GKE posiziona questi carichi di lavoro sui nodi del nuovo pool di nodi. - Svuota il pool di nodi esistente.
- Verifica che i workload vengano eseguiti correttamente nel nuovo pool di nodi. In questo caso, puoi eliminare il vecchio pool di nodi. Se noti interruzioni dei carichi di lavoro, riprogramma i carichi di lavoro sui nodi esistenti rimuovendo il blocco dei nodi nel pool di nodi esistente e svuotando i nuovi nodi. Risolvi il problema e riprova.
Problema: i pod rimangono nello stato in attesa dopo la configurazione di Node Allocatable
Dopo aver configurato Node Allocatable ed eseguito l'upgrade della versione del nodo, potresti notare che i pod in esecuzione sono passati allo stato in attesa.
Se i pod sono in attesa dopo un upgrade, ti consigliamo di procedere nel seguente modo:
Assicurati che le richieste di CPU e memoria per i pod non superino il picco di utilizzo. Poiché GKE riserva CPU e memoria per l'overhead, i pod non possono richiedere queste risorse. I pod che richiedono più CPU o memoria di quella che utilizzano impediscono ad altri pod di richiedere queste risorse e potrebbero lasciare il cluster sottoutilizzato. Per saperne di più, consulta Come vengono pianificati i pod con richieste di risorse.
Valuta la possibilità di ridimensionare il cluster. Per le istruzioni, vedi Ridimensionare un cluster.
Annulla questa modifica eseguendo il downgrade del cluster. Per le istruzioni, vedi Aggiornamento manuale di un cluster o di un pool di nodi.
Configura il cluster per inviare le metriche dello scheduler Kubernetes a Cloud Monitoring e visualizzare le metriche dello scheduler.
Passaggi successivi
Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta la sezione Richiedere assistenza per ulteriore aiuto, inclusi consigli sui seguenti argomenti:
- Aprire una richiesta di assistenza contattando l'assistenza clienti cloud.
- Ricevere assistenza dalla community
ponendo domande su StackOverflow e utilizzando il tag
google-kubernetes-engine
per cercare problemi simili. Puoi anche unirti al canale Slack#kubernetes-engine
per ulteriore assistenza della community. - Apertura di bug o richieste di funzionalità utilizzando lo strumento di monitoraggio dei problemi pubblico.