Problemi noti di GKE Networking

In questa pagina sono elencati i problemi noti relativi al networking GKE. Questa pagina è rivolta ad amministratori e architetti che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante e rispondono ad avvisi e pagine quando gli obiettivi del livello di servizio (SLO) non vengono soddisfatti o le applicazioni non funzionano.

Per filtrare i problemi noti in base a una versione del prodotto, seleziona i filtri dai seguenti menu a discesa.

Seleziona la tua versione di GKE:

In alternativa, cerca il problema:

Versioni identificate Versione/i corretta/e Problema e soluzione alternativa
1,36 Correzione in corso

I cluster GKE con pool di nodi Windows Server che eseguono la versione 1.36 potrebbero riscontrare uno dei seguenti problemi:

  • Errori di connettività di rete in uscita per i workload.
  • Pod di sistema critici (come pdcsi-node-windows e gke-metrics-agent-windows) che si riavviano continuamente in uno stato CrashLoopBackOff.

Questo problema si verifica quando i cluster utilizzano bilanciatori del carico interni di livello 4 senza GKE Subsetting o bilanciatori del carico di rete passthrough esterni che utilizzano pool di destinazione o gruppi di istanze meno recenti. In GKE 1.36, l'agente guest di Compute Engine attiva CorePlugin per impostazione predefinita su Windows Server e associa dinamicamente gli indirizzi IP virtuali (VIP) del bilanciatore del carico direttamente all'adattatore di rete host (vEthernet (Ethernet)) come indirizzi /32 secondari. Il traffico in uscita verso il VIP viene reindirizzato all'host e viene ignorato, mentre le connessioni in uscita verso il control plane GKE (server API Kubernetes) o il server di metadati Google Cloud (169.254.169.254) selezionano in modo intermittente il VIP secondario come indirizzo IP di origine, causando timeout della connessione.

Soluzione temporanea:

Per mitigare questo problema, utilizza uno dei seguenti metodi:

  • Abilita l'impostazione secondaria L4 (consigliata per i bilanciatori del carico interni): aggiungi l'annotazione gke.googleapis.com/subsetting: "true" alla specifica del servizio LoadBalancer interno e ricrea o esegui un riavvio graduale dei nodi Windows per cancellare gli indirizzi IP secondari esistenti:
    apiVersion: v1
    kind: Service
    metadata:
      name: SERVICE_NAME
      annotations:
        cloud.google.com/load-balancer-type: "Internal"
        gke.googleapis.com/subsetting: "true"
    spec:
      type: LoadBalancer
            
  • Utilizza i bilanciatori del carico esterni basati su servizio di backend: per il bilanciamento del carico esterno, esegui la migrazione dei servizi precedenti basati su pool di destinazione ai bilanciatori del carico esterni basati su servizi di backend.
  • Disattiva l'inoltro degli indirizzi IP dell'agente guest utilizzando uno script di avvio del nodo: utilizza uno script di avvio del nodo personalizzato che aggiunge la coppia chiave-valore ip_forwarding = false nella sezione [NetworkInterfaces] del file C:\Program Files\Google\Compute Engine\instance_configs.cfg, quindi riavvia il servizio GCEGuestAgent:
    $configFile = "C:\Program Files\Google\Compute Engine\instance_configs.cfg"
    if (Test-Path $configFile) {
        Add-Content -Path $configFile -Value "`r`n[NetworkInterfaces]`r`nip_forwarding = false"
        Restart-Service -Name GCEGuestAgent -Force
    }
            
  • Posticipa gli upgrade dei pool di nodi Windows: mantieni i node pool Windows su GKE 1.34 o 1.35 finché non sarà disponibile l'immagine del nodo Windows corretta.
Grafico Helm InferencePool v1.1.0

Nella versione v1.1.0 del grafico Helm InferencePool, il flag --set inferencePool.targetPortNumber potrebbe essere ignorato e il numero di porta di destinazione viene impostato su 8000 per impostazione predefinita. Questo numero di porta predefinito causa problemi di routing se il server di modelli è in ascolto su una porta diversa, ad esempio 30000 per SGLang.


Soluzione temporanea:

Verifica la porta dopo l'installazione:

kubectl get inferencepool POOL_NAME -o jsonpath='{.spec.targetPorts}' \
    --context=CLUSTER_CONTEXT
    

Se la porta non è corretta, applica una patch alla risorsa personalizzata InferencePool prima di esportarla:

kubectl patch inferencepool POOL_NAME --type=merge \
    -p '{"spec":{"targetPorts":[{"number":TARGET_PORT}]}}' \
    --context=CLUSTER_CONTEXT
    
1.33, 1.34, 1.35
  • 1.33.11-gke.1137000 o versioni successive
  • 1.34.6-gke.1154000 o versioni successive
  • 1.35.0-gke.3047000 o versioni successive

I cluster con GKE Dataplane V2 abilitato potrebbero riscontrare errori di connettività intermittenti o problemi di risoluzione DNS per i pod in esecuzione. Questo problema è causato da una race condition durante il processo di avvio di cilium-agent (anetd).

Quando cilium-agent non è temporaneamente disponibile, il plug-in cilium-cni potrebbe mettere in coda le richieste di eliminazione degli endpoint per i pod esistenti. Se l'agente elabora questi eventi di eliminazione obsoleti dopo aver inizializzato o ricreato correttamente l'endpoint del pod, l'agente elimina erroneamente l'oggetto CiliumEndpoint attivo. Di conseguenza, il pod interessato perde l'identità di rete e la configurazione di routing, causando l'interruzione del traffico. Questo problema si manifesta spesso come errori DNS perché l'eBPF ipcache identifica erroneamente la destinazione come non gestita. I pod interessati potrebbero entrare in uno stato CrashLoopBackOff.


Soluzione temporanea:

Per mitigare questo problema, elimina manualmente il pod interessato o riavvia il pod anetd sul nodo in cui si verifica il problema. In questo modo, viene forzata la ricreazione della risorsa CiliumEndpoint mancante e viene ripristinata la connettività.

Risoluzione:

La correzione è inclusa nella versione del componente advanceddatapath 33.7.36 o successive. Per risolvere il problema, esegui l'upgrade del cluster a una delle versioni elencate nella colonna Versioni corrette.

1.29, 1.30, 1.31, 1.32, 1.33 1,34

Il container cilium-agent all'interno del pod anetd si arresta in modo anomalo dopo l'eliminazione di una policy di rete FQDN

I cluster con GKE Dataplane V2 abilitato potrebbero subire un arresto anomalo temporaneo dei container cilium-agent, con conseguente aumento del tempo di riconciliazione per gli eventi che devono essere programmati nel piano dati. Questo problema è causato da una dereferenziazione del puntatore nil durante l'eliminazione della policy di rete FQDN.

Il problema viene attivato dall'eliminazione di una policy di rete FQDN. Quando si verifica il problema, il container Cilium-agent all'interno dei pod anetd restituisce un messaggio di errore simile al seguente: panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x33e237d]


Soluzione temporanea:

Per mitigare questo problema, anziché eliminare una policy FQDN, puoi applicare una patch per fare in modo che non abbia alcun effetto, assicurandoti che nessun pod sia soggetto alla policy:

      kubectl patch fqdnnetpol -n namespace policy-name --patch '
      spec:
        podSelector:
          matchLabels:
            miss: me
      '
    

Risoluzione

Esegui l'upgrade del cluster alla versione 1.34

1.28, 1.29, 1.30, 1.31, 1.32, 1.33

Perdita di indirizzi IP dei pod sui nodi con GKE Dataplane V2

I cluster con GKE Dataplane V2 abilitato potrebbero riscontrare l'esaurimento degli indirizzi IP dei pod sui nodi. Questo problema è causato da un bug del runtime dei container che può causare la perdita di indirizzi IP allocati quando i pod riscontrano errori CNI temporanei durante la creazione.

Il problema si verifica quando viene eseguito l'upgrade del nodo del cluster GKE o quando viene creato con una delle seguenti versioni di GKE:

  • 1.33 e versioni successive
  • 1.32 e versioni successive
  • 1.31.2-gke.1115000 o versioni successive
  • 1.30.8-gke.1051001 o versioni successive
  • 1.29.10-gke.1059000 o versioni successive
  • 1.28.15-gke.1024000 o versioni successive

Quando si verifica questo problema, i nuovi pod pianificati sul nodo interessato non si avviano e restituiscono un messaggio di errore simile al seguente: failed to assign an IP address to container.


Soluzione temporanea:

Per attenuare questo problema, puoi applicare il DaemonSet di mitigazione al cluster per ripulire le risorse IP trapelate:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cleanup-ipam-dir
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: cleanup-ipam
  template:
    metadata:
      labels:
        name: cleanup-ipam
    spec:
      hostNetwork: true
      securityContext:
        runAsUser: 0
        runAsGroup: 0
        seccompProfile:
          type: RuntimeDefault
      automountServiceAccountToken: false
      containers:
      - name: cleanup-ipam
        image: gcr.io/gke-networking-test-images/ubuntu-test:2022@sha256:6cfbdf42ccaa85ec93146263b6e4c60ebae78951bd732469bca303e7ebddd85e
        command:
        - /bin/bash
        - -c
        - |
          while true; do
          for hash in $(find /hostipam -iregex '/hostipam/[0-9].*' -mmin +10 -exec head -n1 {} \; ); do
          hash="${hash%%[[:space:]]}"
          if [ -z $(ctr -n k8s.io c ls | grep $hash | awk '{print $1}') ]; then
          grep -ilr $hash /hostipam
          fi
          done | xargs -r rm
          echo "Done cleaning up /var/lib/cni/networks/gke-pod-network at $(date)"
          sleep 120s
          done
        volumeMounts:
        - name: host-ipam
          mountPath: /hostipam
        - name: host-ctr
          mountPath: /run/containerd
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
      volumes:
      - name: host-ipam
        hostPath:
          path: /var/lib/cni/networks/gke-pod-network
      - name: host-ctr
        hostPath:
          path: /run/containerd
1.31, 1.32, 1.33
  • 1.33.1-gke.1107000 e versioni successive
  • 1.32.8-gke.1108000 e versioni successive

Interruzioni dei bilanciatori del carico Ingress e Service sui cluster con una rete legacy

Un'incompatibilità con le reti legacy causa lo scollegamento dei backend di un bilanciatore del carico gestito da GKE di cui è stato eseguito il deployment utilizzando Ingress o Service. Di conseguenza, il bilanciatore del carico non ha backend attivi, il che a sua volta comporta l'eliminazione di tutte le richieste in entrata verso questi bilanciatori del carico.

Il problema interessa i cluster GKE che utilizzano una rete legacy e sono nella versione 1.31 o successive.

Per identificare i cluster GKE con una rete legacy, esegui questo comando:

    gcloud container clusters describe CLUSTER_NAME --location=LOCATION --format="value(subnetwork)"
  

Un cluster con una rete legacy riceverà un output vuoto per questo comando.

Soluzione temporanea:

Poiché le reti legacy sono state ritirate da tempo, la soluzione preferita è eseguire la migrazione della rete legacy a una rete VPC. Per farlo, converti una rete legacy contenente cluster GKE. Se al momento non puoi eseguire questa migrazione, contatta l'assistenza clienti Google Cloud.

1.30, 1.31, 1.32
  • 1.30.10-gke.1070000 e versioni successive
  • 1.31.5-gke.1068000 e versioni successive
  • 1.32.1-gke.1002000 e versioni successive

I nodi appena creati non vengono aggiunti ai bilanciatori del carico interni di livello 4

I bilanciatori del carico Google Cloud creati per i servizi LoadBalancer interni potrebbero non includere i nodi appena creati nel gruppo di istanza di backend.

Il problema sarà più visibile su un cluster che è stato scalato a zero nodi e poi riportato a uno o più nodi.

Soluzioni temporanee:

  • Attiva il subsetting GKE e ricrea il servizio.

    Nota: il subsetting GKE non può essere disattivato dopo l'attivazione.

  • Crea un altro servizio di bilanciamento del carico interno. Al termine della sincronizzazione, anche il gruppo di istanze verrà corretto per il servizio interessato. Il nuovo servizio può essere rimosso dopo la sincronizzazione.
  • Aggiungi e poi rimuovi l'etichetta node.kubernetes.io/exclude-from-external-load-balancers da uno dei nodi.
  • Aggiungi un nodo al cluster. Puoi rimuovere il nodo dopo che il servizio inizia a funzionare.
1.31,1.32
  • 1.31.7-gke.1158000 e versioni successive
  • 1.32.3-gke.1499000 e versioni successive

Problemi con l'API Gateway dovuti alla rimozione di storedVersions dallo stato CRD

Kube-Addon-Manager in GKE rimuove erroneamente v1alpha2 storedVersion dallo stato dei CRD dell'API Gateway come gateway, httpRoute, gatewayClass e referenceGrant. Questo problema si verifica anche se il cluster contiene ancora istanze di questi CRD archiviati nel formato v1alpha2. Se viene eseguito l'upgrade della versione del cluster GKE senza storedVersions, le chiamate API Gateway non vanno a buon fine. Le chiamate non riuscite potrebbero anche interrompere i controller che implementano l'API Gateway.

Il tuo cluster potrebbe essere a rischio se soddisfa tutte le seguenti condizioni:

  • L'API Gateway è abilitata sul tuo cluster.
  • In passato hai installato una versione v1alpha2 di un CRD dell'API Gateway.
  • Il tuo cluster è in esecuzione su una versione GKE interessata.

Soluzione temporanea:

La soluzione alternativa consigliata è ritardare gli upgrade del cluster fino alla risoluzione del problema.

In alternativa, se devi eseguire l'upgrade della versione del cluster, devi aggiornare la versione di archiviazione per tutte le CRD dell'API Gateway interessate a v1beta1. L'esempio seguente aggiorna la CRD gatewayClass:

  1. Verifica la presenza della versione di archiviazione v1alpha2:
    kubectl get crd gatewayclasses.gateway.networking.k8s.io -ojsonpath="{.status.storedVersions}"
  2. Modifica la versione di archiviazione in v1beta1 eseguendo il comando seguente su tutte le risorse GatewayClass presenti nel cluster:
    kubectl annotate gatewayclass gateway-class-name bump-storage-version="yes"
  3. Rimuovi la versione di archiviazione v1alpha2 e imposta la versione di archiviazione su v1beta1:
    kubectl patch customresourcedefinitions gatewayclasses.gateway.networking.k8s.io --subresource='status' --type='merge' -p '{"status":{"storedVersions":["v1beta1"]}}'
  4. Esegui l'upgrade come di consueto.
1.32
  • 1.32.3-gke.1170000 e versioni successive

Impossibile inizializzare i nuovi pod bloccati su ContainerCreating

La creazione di nuovi pod non va a buon fine e i pod rimangono bloccati nello stato ContainerCreating. Quando si verifica questo problema, il container del servizio registra quanto segue:

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "[sandbox-ID]": plugin type="cilium-cni" failed (add): unable to create endpoint: Cilium API client timeout exceeded

Il problema interessa i cluster GKE con versioni comprese tra 1.32 e precedenti alla 1.32.3-gke.1170000, create con le versioni GKE 1.31 o 1.32. La causa principale è che una struttura di dati in memoria che gestiva una raccolta di identità Cilium allocate non era sincronizzata correttamente con lo stato del server API Kubernetes.

Per confermare la versione di GKE utilizzata per creare il cluster, puoi eseguire una query sulla risorsa initialClusterVersion utilizzando il seguente comando:

  gcloud container clusters describe [cluster_name] --location [location] --format='value(initialClusterVersion)'
  

Se nel cluster GKE è abilitato il logging, il container cilium-agent registra il messaggio unable to resolve identity: timed out waiting for cilium-operator to allocate CiliumIdentity for key in Esplora log utilizzando la seguente query:

   resource.type="k8s_container"
   resource.labels.container_name="cilium-agent"
  

Soluzione temporanea:

Una mitigazione temporanea consiste nel riavviare il control plane. Per farlo, esegui l'upgrade del control plane alla stessa versione già in esecuzione:

  gcloud container clusters upgrade [cluster_name] --location [location] --cluster-version=[version] --master
  
1.27,1.28,1.29,1.30,1.31

Il controller NEG interrompe la gestione degli endpoint quando la porta viene rimossa dal servizio

Quando il controller NEG è configurato per creare un NEG autonomo per un servizio e una delle porte configurate viene successivamente rimossa dal servizio, il controller NEG smetterà di gestire gli endpoint per il NEG. Oltre ai servizi in cui l'utente crea un'annotazione NEG autonomo, questo influisce anche sui servizi a cui fanno riferimento il gateway GKE, MCI e il gateway multi-cluster GKE.

Soluzione temporanea:

Quando rimuovi una porta da un servizio con un'annotazione NEG autonomo, l'annotazione deve essere aggiornata anche per rimuovere la porta in questione.

1,28

Errore di configurazione TLS del gateway

Abbiamo identificato un problema relativo alla configurazione di TLS per i gateway nei cluster che eseguono GKE versione 1.28.4-gke.1083000. Ciò influisce sulle configurazioni TLS che utilizzano un SSLCertificate o una CertificateMap. Se esegui l'upgrade di un cluster con gateway esistenti, gli aggiornamenti apportati al gateway non riusciranno. Per i nuovi gateway, non verrà eseguito il provisioning dei bilanciatori del carico. Questo problema verrà risolto in una versione patch di GKE 1.28 imminente.

1.27,1.28,1.29
  • 1.26.13-gke.1052000 e versioni successive
  • 1.27.10-gke.1055000 e versioni successive
  • 1.28.6-gke.1095000 e versioni successive
  • 1.29.1-gke.1016000 e versioni successive

Errori intermittenti di stabilimento della connessione

I cluster con versioni del control plane 1.26.6-gke.1900 e successive potrebbero riscontrare errori intermittenti di stabilimento della connessione.

Le probabilità di errori sono basse e non interessano tutti i cluster. Gli errori dovrebbero interrompersi completamente dopo alcuni giorni dall'insorgenza del sintomo.

1.27,1.28,1.29
  • 1.27.11-gke.1118000 o versioni successive
  • 1.28.7-gke.1100000 o versioni successive
  • 1.29.2-gke.1217000 o versioni successive

Problemi di risoluzione DNS con Container-Optimized OS

I workload in esecuzione su cluster GKE con nodi basati su Container-Optimized OS potrebbero riscontrare problemi di risoluzione DNS.

1,28 1.28.3-gke.1090000 o versioni successive

La policy di rete interrompe una connessione a causa di una ricerca di monitoraggio della connessione errata

Per i cluster con GKE Dataplane V2 abilitato, quando un pod client si connette a se stesso utilizzando un servizio o l'indirizzo IP virtuale di un bilanciatore del carico di rete passthrough interno, il pacchetto di risposta non viene identificato come parte di una connessione esistente a causa di una ricerca conntrack errata nel dataplane. Ciò significa che una policy di rete che limita il traffico in entrata per il pod viene applicata in modo errato al pacchetto.

L'impatto di questo problema dipende dal numero di pod configurati per il servizio. Ad esempio, se il servizio ha un pod di backend, la connessione non riesce sempre. Se il servizio ha due pod di backend, la connessione non riesce il 50% delle volte.

Soluzione temporanea:

Puoi mitigare questo problema configurando port e containerPort nel manifest del servizio in modo che abbiano lo stesso valore.

1.27,1.28
  • 1.28.3-gke.1090000 o versioni successive
  • 1.27.11-gke.1097000 o versioni successive

Pacchetti eliminati per i flussi di connessione hairpin

Per i cluster con GKE Dataplane V2 abilitato, quando un pod crea una connessione TCP a se stesso utilizzando un servizio, in modo che il pod sia sia l'origine sia la destinazione della connessione, il monitoraggio della connessione eBPF di GKE Dataplane V2 monitora in modo errato gli stati della connessione, causando voci conntrack con leak.

Quando è stata divulgata una tupla di connessione (protocollo, IP di origine/destinazione e porta di origine/destinazione), le nuove connessioni che utilizzano la stessa tupla di connessione potrebbero comportare l'eliminazione dei pacchetti di ritorno.

Soluzione temporanea:

Utilizza una delle seguenti soluzioni alternative:

  • Abilita il riutilizzo di TCP (keep-alive) per un'applicazione in esecuzione in un pod che potrebbe comunicare con se stessa utilizzando un servizio. In questo modo si impedisce l'emissione del flag TCP FIN e si evita la perdita della voce conntrack.
  • Quando utilizzi connessioni di breve durata, esponi il pod utilizzando un bilanciatore del carico proxy, ad esempio Gateway, per esporre il servizio. In questo modo, la destinazione della richiesta di connessione viene impostata sull'indirizzo IP del bilanciatore del carico, impedendo a GKE Dataplane V2 di eseguire SNAT sull'indirizzo IP di loopback.
Precedente alla versione 1.31.0-gke.1506000 1.31.0-gke.1506000 e versioni successive

La rete di tipo dispositivo in GKE multi-rete non funziona con nomi di rete lunghi

La creazione del cluster non riesce con il seguente errore:

error starting very-long-string-that-exceeds-character-limit-gpu-nic0 device plugin endpoint: listen unix /var/lib/kubelet/plugins_registry/networking.gke.io.networks_very-long-string-that-exceeds-character-limit-gpu-nic0.sock: bind: invalid argument

Soluzione temporanea:

Limita la lunghezza dei nomi degli oggetti di rete digitati dal dispositivo a un massimo di 41 caratteri. Viene composto il percorso completo di ogni socket di dominio UNIX, incluso il nome della rete corrispondente. Linux ha una limitazione per le lunghezze dei percorsi dei socket (meno di 107 byte). Dopo aver preso in considerazione la directory, il prefisso del nome file e l'estensione .sock, il nome della rete è limitato a un massimo di 41 caratteri.

1.27, 1.28, 1.29, 1.30
  • 1.30.4-gke.1282000 o versioni successive
  • 1.29.8-gke.1157000 o versioni successive
  • 1.28.13-gke.1078000 o versioni successive
  • 1.27.16-gke.1342000 o versioni successive

Problemi di connettività per i pod hostPort dopo l'upgrade del control plane

I cluster con policy di rete abilitata potrebbero riscontrare problemi di connettività con i pod hostPort. Inoltre, i pod appena creati potrebbero richiedere altri 30-60 secondi per essere pronti.

Il problema si verifica quando viene eseguito l'upgrade del control plane GKE di un cluster a una delle seguenti versioni di GKE

  • Da 1.30 a 1.30.4-gke.1281999
  • Da 1.29.1-gke.1545000 a 1.29.8-gke.1156999
  • Da 1.28.7-gke.1042000 a 1.28.13-gke.1077999
  • Da 1.27.12-gke.1107000 a 1.27.16-gke.1341999

Soluzione temporanea:

Esegui l'upgrade o ricrea i nodi immediatamente dopo l'upgrade del control plane GKE.

1.31, 1.32
  • 1.32.1-gke.1729000 o versioni successive
  • 1.31.6-gke.1020000 o versioni successive

Traffico UDP interrotto tra i pod in esecuzione sullo stesso nodo

I cluster con visibilità tra nodi abilitata potrebbero riscontrare un'interruzione del traffico UDP tra i pod eseguiti sullo stesso nodo.

Il problema si verifica quando viene eseguito l'upgrade del nodo del cluster GKE o quando viene creato con una delle seguenti versioni di GKE:

  • 1.32.1-gke.1729000 o versioni successive
  • 1.31.6-gke.1020000 o versioni successive

Il percorso interessato è il traffico UDP da pod a pod sullo stesso nodo tramite Hostport o Service.

Risoluzione

Esegui l'upgrade del cluster a una delle seguenti versioni corrette:

  • 1.32.3-gke.1927000 o versioni successive
  • 1.31.7-gke.1390000 o versioni successive
1.28, 1.29, 1.30, 1.31

Pod Calico non integri su cluster con meno di 3 nodi totali e vCPU insufficiente

I pod calico-typha e calico-node non possono essere pianificati su cluster che soddisfano tutte le seguenti condizioni: meno di 3 nodi in totale, ogni nodo con 1 o meno vCPU allocabili e policy di rete abilitata. Ciò è dovuto a risorse CPU insufficienti.

Soluzioni temporanee:

  • Scalabilità fino a un minimo di 3 pool di nodi con 1 nodo che utilizza 1 vCPU allocabile.
  • Ridimensiona un singolo pool di nodi in modo che abbia almeno 3 nodi con 1 vCPU allocabile.
  • Utilizza un tipo di macchina con almeno 2 vCPU allocabili su un pool di nodi con un singolo nodo.

Interruzioni del gateway multi-cluster (MCG) sui cluster di zona durante gli upgrade del control plane

I deployment che utilizzano il gateway multi-cluster (MCG) sui cluster GKE a livello di zona potrebbero subire interruzioni con errori "503" durante eventi che causano il riavvio del control plane, ad esempio un upgrade del cluster. Questo accade perché MCG si basa su un meccanismo legacy per il rilevamento dei gruppi di endpoint di rete (NEG) che segnala erroneamente zero backend quando i nodi di un cluster di zona diventano temporaneamente non disponibili durante il riavvio del control plane. In questo modo, il bilanciatore del carico rimuove tutti i backend, con conseguente perdita di traffico.

Soluzioni temporanee:

  • La soluzione consigliata è eseguire la migrazione da un cluster GKE di zona a un cluster GKE a livello di regione. I cluster regionali hanno un control plane ad alta affidabilità, che elimina il single point of failure che attiva questo problema durante gli upgrade o i riavvii.

In determinate condizioni, i controlli di idoneità potrebbero restituire un "falso positivo" dello stato di idoneità, prima che il controllo di integrità dell'oggetto Ingress segnali uno stato integro, generando eventi di errore come i seguenti sull'oggetto Ingress:

NEG is not attached to any BackendService with health checking. Marking condition "cloud.google.com/load-balancer-neg-ready" to True.

Questo problema fa sì che il bilanciatore del carico segnali un errore 503 (failed_to_pick_backend) al traffico mentre GKE esegue l'aggiornamento in sequenza sul workload del deployment.

La presenza di un numero relativamente ridotto di pod (ad esempio 2) rispetto al numero di NEG aumenta il rischio di questa race condition. I NEG vengono creati per ogni regione, con un NEG per zona, il che in genere si traduce in tre NEG. Se il numero di pod è relativamente elevato, in modo che ogni NEG abbia sempre più pod prima dell'inizio dell'aggiornamento in sequenza, è molto improbabile che si verifichi questa race condition.

Soluzione temporanea:

Il modo migliore per evitare questa race condition è avere più backend nel gruppo di endpoint di rete. Assicurati che la strategia di aggiornamento in sequenza sia configurata in modo da garantire che almeno un pod sia sempre in esecuzione. Ad esempio, se solo 2 pod vengono eseguiti normalmente, una configurazione di esempio potrebbe essere simile alla seguente:

strategy:
   type: RollingUpdate
   rollingUpdate:
     maxUnavailable: 0
     maxSurge: 1
    

L'esempio precedente è un suggerimento. Devi aggiornare la strategia in base a diversi fattori, ad esempio il numero di repliche.

GKE esegue la garbage collection dei bilanciatori del carico nativi dei container ogni due minuti. Se un cluster viene eliminato prima che i bilanciatori del carico vengano rimossi completamente, devi eliminare manualmente i NEG del bilanciatore del carico.

Soluzione temporanea:

Visualizza i NEG nel tuo progetto eseguendo questo comando:

gcloud compute network-endpoint-groups list

Nell'output comando, cerca i NEG pertinenti.

Per eliminare un NEG, esegui il seguente comando, sostituendo <var>NEG_NAME</var> con il nome del NEG:

gcloud compute network-endpoint-groups delete <var>NEG_NAME</var>

Questo problema non si verifica nei cluster che utilizzano il feedback di idoneità dei pod per gestire i rollout dei workload. Quando esegui il deployment di un workload nel cluster o quando aggiorni un workload esistente, il bilanciatore del carico nativo del container può impiegare più tempo per propagare i nuovi endpoint rispetto al tempo necessario per completare l'implementazione del workload.


Soluzione temporanea:

Configura i valori minReadySeconds e terminationGracePeriodSeconds dei workload in modo che siano pari o superiori a 60 secondi per assicurarti che il servizio non venga interrotto a causa dei rollout dei workload.

  • terminationGracePeriodSeconds consente al pod di arrestarsi in modo controllato, attendendo che le connessioni vengano terminate dopo che è stata pianificata l'eliminazione di un pod.
  • minReadySeconds aggiunge un periodo di latenza dopo la creazione di un pod.

Potresti aspettarti che la configurazione initialDelaySeconds nel readinessProbe del pod venga rispettata dal bilanciatore del carico nativo del container; tuttavia, readinessProbe è implementato da kubelet e la configurazione initialDelaySeconds controlla il controllo di integrità di kubelet, non il bilanciatore del carico nativo del container. Il bilanciamento del carico nativo del container ha un proprio controllo di integrità del bilanciamento del carico.