Problemi noti relativi al networking di GKE

Questa pagina elenca i problemi noti relativi al networking GKE. Questa pagina è dedicata 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 raggiunti 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 versione di GKE:

In alternativa, cerca il tuo problema:

Versioni identificate Versioni corrette Problema e soluzione alternativa
1,28, 1,29, 1,30, 1,31, 1,32, 1,33

Perdita dell'indirizzo IP del 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 del 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 il nodo del cluster GKE viene sottoposto ad upgrade o 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 vengono avviati e restituiscono un messaggio di errore simile al seguente: failed to assign an IP address to container.


Soluzione temporanea:

Per risolvere questo problema, puoi applicare il DaemonSet di mitigazione al cluster per pulire 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

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

Un'incompatibilità con le reti legacy causa il distacco 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 a questi bilanciatori del carico.

Il problema interessa i cluster GKE che utilizzano una rete legacy e che eseguono la 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. Puoi farlo convertendo una rete legacy che contiene cluster GKE. Se al momento non riesci a 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 rilevare i nodi appena creati nel gruppo di istanza di backend.

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

Soluzioni:

  • Attiva il sottoinsieme GKE e ricrea il servizio.

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

  • Crea un altro servizio di bilanciamento del carico interno. Quando viene sincronizzato, 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 l'avvio del servizio.
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 di 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 quando il cluster contiene ancora istanze di questi CRD archiviate nel formato v1alpha2. Se la versione del cluster GKE viene aggiornata 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 API Gateway.
  • Il cluster è stato eseguito su una versione GKE interessata.

Soluzione temporanea:

La soluzione alternativa consigliata è ritardare gli upgrade del cluster finché il problema non viene risolto.

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

  1. Controlla 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 seguente comando 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

I nuovi pod non riescono a inizializzarsi e rimangono bloccati su ContainerCreating

I nuovi pod non vengono creati e rimangono nello stato ContainerCreating. Quando si verifica questo problema, il contenitore 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 nelle versioni comprese tra 1.32 e precedenti alla 1.32.3-gke.1170000, creati nelle versioni 1.31 o 1.32 di GKE. La causa principale è che una struttura di dati in memoria che gestiva una raccolta di identità Cilium allocate non è stata 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 la registrazione è abilitata nel cluster GKE, 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 soluzione temporanea è riavviare il control plane. A questo scopo, 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 smette di gestire gli 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 alla fine smetterà di gestire gli endpoint per il NEG. Oltre ai servizi in cui l'utente crea un'annotazione NEG autonoma, ciò influisce anche sui servizi a cui fanno riferimento GKE Gateway, MCI e GKE Multi Cluster Gateway.

Soluzione temporanea:

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

1,28

Errore di configurazione TLS del gateway

Abbiamo identificato un problema con la 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 andranno a buon fine. Per i nuovi gateway, i bilanciatori del carico non verranno di cui è stato eseguito il provisioning. 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 sulle 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. I malfunzionamenti dovrebbero cessare completamente dopo alcuni giorni dalla comparsa 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 carichi di lavoro 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

Network Policy interrompe una connessione a causa di una ricerca di tracciamento delle connessioni 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 pass-through interno, il pacchetto di risposta non viene identificato come parte di una connessione esistente a causa di una ricerca conntrack errata nel piano dati. Ciò significa che un criterio di rete che limita il traffico in entrata per il pod viene applicato 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 risolvere 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 l'origine e la destinazione della connessione, il monitoraggio della connessione eBPF di GKE Dataplane V2 monitora in modo errato gli stati della connessione, causando la perdita di voci conntrack.

Quando una tupla di connessione (protocollo, IP di origine/destinazione e porta di origine/destinazione) è stata compromessa, 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, il flag TCP FIN non viene emesso 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. Di conseguenza, 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 digitata dal dispositivo in GKE multi-network non va a buon fine 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 sul dispositivo a un massimo di 41 caratteri. Il percorso completo di ogni socket di dominio UNIX è composto, incluso il nome di rete corrispondente. Linux ha una limitazione sulla lunghezza dei percorsi dei socket (meno di 107 byte). Tenendo conto della directory, del prefisso del nome file e dell'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 criterio di rete abilitato 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 il control plane GKE di un cluster viene eseguito l'upgrade 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
  • 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 la visibilità tra nodi abilitata potrebbero riscontrare un traffico UDP interrotto tra i pod in esecuzione sullo stesso nodo.

Il problema si verifica quando il nodo del cluster GKE viene sottoposto ad upgrade o 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 insufficienti

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

Soluzioni:

  • Scalare a un minimo di 3 node pool con 1 nodo che utilizza 1 vCPU allocabile.
  • Ridimensiona un singolo pool di nodi a un minimo di 3 nodi con 1 vCPU allocabile.
  • Utilizza un tipo di macchina con almeno 2 vCPU allocabili in 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 Multi-Cluster Gateway (MCG) sui cluster GKE di zona potrebbero subire interruzioni con errori `503` durante gli eventi che causano il riavvio del control plane, ad esempio un upgrade del cluster. Ciò si verifica perché MCG si basa su un meccanismo legacy per l'individuazione del gruppo di endpoint di rete (NEG) che segnala in modo errato zero backend quando i nodi di un cluster zonale diventano temporaneamente non disponibili durante il riavvio del control plane. In questo modo, il bilanciatore del carico rimuove tutti i backend, causando la perdita di traffico.

Soluzioni:

  • La soluzione consigliata è la migrazione dal cluster GKE a livello di zona al cluster GKE a livello di regione. I cluster regionali hanno un control plane ad alta disponibilità, che elimina il singolo punto di errore che attiva questo problema durante gli upgrade o i riavvii.