Risolvere i problemi di networking di GDCV per Bare Metal

Questa pagina mostra come risolvere i problemi di rete con Google Distributed Cloud Virtual for Bare Metal. Vengono fornite informazioni generali e indicazioni per la risoluzione dei problemi, oltre a strumenti suggeriti. Sono incluse anche informazioni sulla risoluzione dei problemi DNS e alcuni problemi comuni per MetalLB.

Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.

Risoluzione dei problemi di connettività di rete

Il networking di GKE Enterprise si basa sulla tua infrastruttura di rete fisica. Ad esempio, MetalLB si basa sui tuoi switch che rispettano l'ARP gratuito, il bilanciamento del carico in bundle con il protocollo BGP (Border Gateway Protocol) si basa sui router e tutti i nodi dovrebbero essere in grado di comunicare tra loro. Quando si verifica un problema di rete nei cluster GKE, devi identificare se il problema risiede nei componenti di GKE Enterprise o nella tua infrastruttura.

Innanzitutto determina l'ambito del problema, quindi prova a identificare i componenti interessati. L'ambito di un problema può essere una delle tre categorie disponibili: l'oggetto (da dove), il target (a quale) e il livello di rete.

L'ambito del soggetto può essere uno dei seguenti:

  • Tutti i nodi (o pod hostNetwork) a livello di cluster.
  • a livello di cluster.
  • Tutti i pod su un singolo nodo o un insieme di nodi.
  • Tutti i pod dello stesso oggetto Deployment o DaemonSet.
  • Client esterno al cluster.

L'ambito del target può essere uno o più dei seguenti:

  • Tutti gli altri indirizzi IP dei pod dallo stesso cluster.
  • Tutti gli altri indirizzi IP di pod dallo stesso nodo.
  • VIP del servizio ClusterIP dallo stesso cluster.
  • VIP del servizio LoadBalancer dallo stesso cluster.
  • LoadBalancer (Istio) di livello 7 in entrata.
  • Altri nodi dello stesso cluster.
  • Nome DNS interno (ad esempio *.svc.cluster.local).
  • Nome DNS esterno (ad esempio google.com).
  • Entità esterne al cluster.
  • Entità su internet.

Il livello di rete può essere uno o più dei seguenti:

  • Problemi di livello di collegamento di livello 2 come il sistema vicino, ARP o NDP.
  • Problemi di routing degli indirizzi IP di livello 3.
  • Problemi con gli endpoint TCP o UDP di livello 4.
  • Problemi HTTP o HTTPS di livello 7.
  • Problemi di risoluzione DNS.

Comprendere l'ambito di un problema consente di identificare i componenti coinvolti e il livello in cui si verifica. La raccolta di informazioni quando si verifica il problema è importante perché alcuni problemi sono temporanei, quindi gli snapshot dopo il ripristino del sistema non includeranno informazioni sufficienti per l'analisi delle cause principali.

Problemi in entrata

Se il soggetto è un client esterno al cluster e non riesce a connettersi a un servizio LoadBalancer, significa che si tratta di un problema di connettività nord-sud. Il seguente schema mostra che in un esempio funzionante il traffico in entrata si sposta nello stack da sinistra a destra e il traffico di ritorno si sposta indietro attraverso lo stack da destra a sinistra.

Il traffico in entrata passa dall'utente all'infrastruttura fisica, attraverso un bilanciatore del carico ad anetd / kube-proxy e quindi al backend.

Quando si verifica un problema con questo flusso di traffico, utilizza il seguente diagramma di flusso per la risoluzione dei problemi per identificarlo:

Risolvi i problemi relativi al traffico in entrata nella rete esaminando i passaggi eseguiti da un pacchetto durante il loro trasferimento nell'ambiente. Verifica che ci siano le azioni adeguate e la
connettività lungo il percorso.

In questo diagramma di flusso, le seguenti indicazioni per la risoluzione dei problemi aiutano a determinare dov'è il problema:

  • Il pacchetto lascia il client? In caso contrario, è probabile che ci sia un problema di infrastruttura di rete.
  • Utilizzi MetalLB? Se sì, il pacchetto arriva al nodo LB e viene inviato ARP correttamente? In caso contrario, è probabile che tu abbia un problema dell'infrastruttura di rete.
  • Utilizzi F5 BIG-IP e, in questo caso, hai controllato se ci sono problemi con F5?
  • Network Address Translation (NAT) è eseguita correttamente? In caso contrario, è probabile che tu abbia un problema con kube-proxy / Dataplane V2.
  • Il pacchetto arriva al nodo worker? In caso contrario, è probabile che si sia verificato un problema da pod a pod di Dataplane v2.
  • Il pacchetto arriva al pod? In caso contrario, è probabile che si sia verificato un problema di inoltro locale di Dataplane v2.

Le sezioni seguenti forniscono i passaggi per risolvere i problemi di ogni fase al fine di determinare se il traffico scorre correttamente o meno.

Il pacchetto lascia il client?

Controlla se il pacchetto lascia correttamente il client e passa attraverso il router configurato nella tua infrastruttura di rete fisica.

  1. Utilizza tcpdump per il controllo del pacchetto quando lascia il client per il servizio di destinazione:

    tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
    

    Se il traffico non diminuisce, questa è la causa del problema.

Il pacchetto arriva a un nodo LoadBalancer?

Se utilizzi MetalLB come bilanciatore del carico:

  1. Osserva il log metallb-controller per determinare quale nodo del bilanciatore del carico serve il VIP di servizio:

    kubectl -n kube-system logs -l app=metallb --all-containers=true | grep SERVICE_VIP
    
  2. Connettiti al nodo tramite SSH.

  3. Per un nodo MetalLB, utilizza tcpdump per esaminare il traffico:

    tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
    

    Per ManualLB, il traffico potrebbe essere indirizzato su qualsiasi nodo. A seconda della configurazione del bilanciatore del carico, puoi scegliere uno o più nodi. Utilizza tcpdump per esaminare il traffico:

    tcpdump -ni any host NODE_IP and port NODE_PORT
    

    Il comando è diverso tra i vari tipi di bilanciatore del carico, in quanto MetalLB non esegue NAT prima di inoltrare il pacchetto ai nodi.

    Se non vedi che il traffico entra in nessun nodo, questa è l'origine del problema.

C'è un problema di F5 BIG-IP?

Per risolvere i problemi relativi a F5 BIG-IP, consulta una delle seguenti sezioni su Il servizio F5 non riceve traffico.

L'ARP è stato inviato correttamente?

Il nodo del bilanciatore del carico per MetalLB si basa su ARP per pubblicizzare il servizio VIP. Se la risposta ARP viene inviata correttamente, ma il traffico non arriva, significa che è presente un problema nell'infrastruttura di rete fisica. Una causa comune di questo problema è che alcune funzionalità avanzate di apprendimento Dataplane ignorano la risposta ARP nelle soluzioni di rete software-defined (SDN).

  1. Usa tcpdump per rilevare le risposte ARP:

    tcpdump -ni any arp
    

    Prova a trovare il messaggio che pubblicizza il VIP con cui hai riscontrato problemi.

  2. Per MetalLB, non invia ARP gratuito. La frequenza con cui visualizzi una risposta dipende dal momento in cui un altro dispositivo, ad esempio uno switch ToR, invia una richiesta ARP.

Viene eseguito il NAT?

Dataplane v2 / kube-proxy esegue la Network Address Translation di destinazione (NAT o DNAT di destinazione) per tradurre il VIP di destinazione in un indirizzo IP del pod di backend. Se sai quale nodo è il backend per il bilanciatore del carico, connettiti al nodo utilizzando SSH.

  1. Utilizza tcpdump per verificare se il VIP del servizio è stato tradotto correttamente:

    tcpdump -ni any host BACKEND_POD_IP and port CONTAINER_PORT
    
  2. Per Dataplane v2, puoi anche connetterti ai pod anetd e utilizzare gli strumenti di debug Cilium incorporati:

    cilium monitor --type=drop
    

Per maggiori informazioni, consulta una delle seguenti sezioni sui problemi relativi a Dataplane v2 / Cilium.

Il pacchetto arriva a un nodo worker?

Sui nodi worker, il pacchetto arriva all'interfaccia esterna e viene quindi consegnato ai pod.

  1. Controlla se il pacchetto arriva all'interfaccia esterna, di solito denominata eth0 o ens192, utilizzando tcpdump:

    tcpdump -ni any host BACKEND_POD_IP and port CONTAINER_PORT
    
Per Google Distributed Cloud Virtual for Bare Metal, il pacchetto viene incapsulato in un tunnel. Quando il pacchetto viene decapsulato, proviene da un'interfaccia di rete denominata cilium_geneve.

Poiché i normali backend di servizio contengono più pod in nodi diversi, potrebbe essere difficile risolvere i problemi del nodo interessato. Una soluzione alternativa comune è acquisire il problema per un tempo sufficiente da far arrivare un pacchetto o limitare il numero di backend a uno.

Se il pacchetto non arriva al nodo di lavoro, significa che è presente un problema di infrastruttura di rete. Verifica con il team dell'infrastruttura di rete perché il pacchetto viene ignorato tra i nodi LoadBalancer e i nodi worker. Alcuni dei problemi più comuni sono:

  • Controlla i log di rete software-defined (SDN). A volte, l'SDN potrebbe perdere pacchetti per vari motivi, come segmentazione, checksum errato o anti-spoofing.
  • Regole firewall che filtrano i pacchetti geneve sulla porta UDP 6081.

Se il pacchetto arriva all'interfaccia esterna o all'interfaccia del tunnel del nodo, deve essere inoltrato al pod di destinazione. Se il pod è un pod di networking host, questo passaggio non è necessario perché il pod condivide lo spazio dei nomi di rete con il nodo. Altrimenti, è necessario l'inoltro di pacchetti aggiuntivo.

Ogni pod dispone di coppie di interfacce Ethernet virtuali, che funzionano come tubi. Un pacchetto inviato a un'estremità dell'interfaccia viene ricevuto dall'altra. Una delle interfacce viene spostata nello spazio dei nomi di rete del pod e rinominata in eth0. L'altra interfaccia si trova nello spazio dei nomi dell'host. CNN diversi hanno schema diverso. Per Dataplane v2, l'interfaccia è normalmente denominata lxcxxxx. I nomi presentano numeri di interfaccia consecutivi, come lxc17 e lxc18. Puoi verificare se il pacchetto arriva al pod utilizzando tcpdump oppure puoi anche specificare l'interfaccia:

  tcpdump -ni lcxxxx host BACKEND_POD_IP and port CONTAINER_PORT

Se il pacchetto arriva al nodo, ma non riesce ad arrivare al pod, controlla la tabella di routing come segue:

  ip route

Normalmente, ogni pod dovrebbe avere una voce di routing che instrada l'indirizzo IP del pod all'interfaccia lxc. Se la voce non è presente, significa in genere che il percorso dati CNI contiene un errore. Per determinare la causa principale, controlla i log CNI DaemonSet.

Problemi in uscita

Se il traffico può entrare in un pod, potresti avere un problema con il traffico mentre esce dal pod. I seguenti diagrammi mostrano che in un esempio funzionante il traffico in entrata si sposta nello stack da sinistra a destra:

Il traffico in uscita passa dal pod attraverso l'interfaccia esterna dell'host all'infrastruttura fisica e quindi al servizio esterno.

  1. Per verificare che il pacchetto in uscita si maschera correttamente come indirizzo IP del nodo, controlla il servizio esterno (livello 4).

    L'indirizzo IP di origine del pacchetto deve essere mappato dall'indirizzo IP del pod all'indirizzo IP del nodo con la Network Address Translation di origine (NAT o SNAT di origine). In Dataplane v2, questo processo viene eseguito tramite un ebpf caricato su un'interfaccia esterna.

    Utilizza tcpdump per verificare se l'indirizzo IP di origine è stato tradotto correttamente dall'indirizzo IP del pod all'indirizzo IP del nodo:

    tcpdump -ni EXTERNAL_INTERFACE host EXTERNAL_IP and port EXTERNAL_PORT
    

    Se tcpdump mostra che i pacchetti sono mascherati correttamente, ma il servizio remoto non risponde, controlla la connessione al servizio esterno nella tua infrastruttura.

  2. Se i pacchetti in uscita vengono mascherati correttamente dall'indirizzo IP del nodo, controlla la connettività dell'host esterno (livello 3) utilizzando tcpdump:

    tcpdump -ni EXTERNAL_INTERFACE host EXTERNAL_IP and icmp
    

    Contemporaneamente all'esecuzione di tcpdump, esegui il ping da uno dei pod:

    kubectl exec POD_NAME ping EXTERNAL_IP
    

    Se non vedi le risposte al ping, controlla la connessione al servizio esterno nella tua infrastruttura.

Problemi all'interno del cluster

Per problemi di connettività tra pod, prova a limitare il problema ai nodi. Spesso, un gruppo di nodi non è in grado di comunicare con un altro gruppo di nodi.

  1. In Dataplane v2, controlla la connettività dei nodi dal nodo attuale a tutti gli altri nodi nello stesso cluster. Dall'interno del pod anetd, controlla lo stato di integrità:

    cilium status --all-health
    

Problemi con il livello di rete

Identificare in quale livello di rete si verifica il problema di connettività è un passaggio importante. Un messaggio di errore del tipo "Un problema di connettività da un'origine a una destinazione" non è abbastanza informativo da aiutare a risolvere il problema, che potrebbe essere un errore dell'applicazione, un problema di routing o un problema DNS. Capire a quale livello si verifica il problema aiuta a correggere il componente giusto.

Molte volte, i messaggi di errore indicano direttamente a quale livello si verifica il problema. I seguenti esempi possono aiutarti a risolvere i problemi relativi al livello di rete:

  • Gli errori HTTP indicano che si tratta di un problema di livello 7.
    • I codici HTTP 40x, 50x o gli errori di handshake TLS indicano che tutto funziona normalmente al livello 4.
  • Gli errori "Connessione reimpostata dal peer" indicano che si tratta di un problema di livello 4.
    • Molte volte il socket remoto non è in grado di essere d'accordo con lo stato attuale di una connessione, pertanto invia un pacchetto RESET. Questo comportamento potrebbe essere un errore nel monitoraggio delle connessioni o NAT.
  • Gli errori "Nessuna route all'host" e "Timeout connessione" in genere sono un problema di livello 3 o 2.
    • Questi errori indicano che il pacchetto non può essere instradato correttamente alla destinazione.

Utili strumenti per la risoluzione dei problemi

I DaemonSet relativi alla rete vengono eseguiti sui nodi e potrebbero essere la causa di problemi di connettività. Tuttavia, anche la configurazione errata di nodi, switch ToR (top of rack), router o firewall può causare problemi. Puoi utilizzare i seguenti strumenti per determinare l'ambito o il livello del problema e determinare se è un problema relativo ai nodi GKE Enterprise o alla tua infrastruttura fisica.

Dindin

Il ping funziona al livello 3 (livello IP) e controlla la route tra un'origine e una destinazione. Se il ping non riesce a raggiungere una destinazione, spesso significa che il problema si trova al livello 3.

Tuttavia, non è possibile inviare un ping a tutti gli indirizzi IP. Ad esempio, non è possibile eseguire il ping di alcuni VIP dei bilanciatori del carico se si tratta di un bilanciatore del carico di livello 4 puro. Il servizio ClusterIP è un esempio in cui il VIP potrebbe non restituire una risposta ping. Al livello 4, questo servizio restituisce una risposta ping solo quando specifichi un numero di porta, ad esempio VIP:port.

I bilanciatori del carico BGPLB e MetalLB in Google Distributed Cloud Virtual for Bare Metal funzionano tutti al livello 3. Puoi usare il ping per verificare la connettività. Sebbene F5 sia diverso, supporta anche la ICMP. Puoi utilizzare ping per verificare la connettività al VIP di F5.

Arrampicata

L'arping è simile al ping, tranne per il fatto che funziona nel livello 2. I problemi di livello 2 e 3 spesso generano messaggi di errore simili da parte delle applicazioni. Arping e ping possono aiutarti a distinguere il problema. Ad esempio, se l'origine e la destinazione si trovano nella stessa subnet, ma non riesci ad arginare la destinazione, si tratta di un problema di livello 2.

Un arping <ip> riuscito restituisce l'indirizzo MAC della destinazione. Nel livello 2, questo indirizzo indica spesso un problema di infrastruttura fisica. Spesso si tratta di un passaggio fisico tra i nodi.

Arping può anche rilevare conflitti di indirizzi IP. Un conflitto di indirizzi IP si verifica quando due macchine sono configurate per utilizzare lo stesso indirizzo IP nella stessa subnet o quando un VIP viene utilizzato da un'altra macchina fisica. I conflitti di indirizzi IP possono creare problemi intermittenti difficili da risolvere. Se arping <ip> restituisce più voci di indirizzi MAC, significa che c'è un conflitto di indirizzi IP.

Dopo aver ottenuto l'indirizzo MAC tramite l'arping, puoi utilizzare https://maclookup.app/ per cercare il produttore dell'indirizzo MAC. Ogni produttore è proprietario di un prefisso MAC, pertanto puoi utilizzare queste informazioni per determinare quale dispositivo sta tentando di utilizzare lo stesso indirizzo IP. Ad esempio, il blocco 00:50:56 è di proprietà di VMware, quindi un indirizzo MAC 00:50:56:xx:yy:zz è una VM nel tuo ambiente vSphere.

iproute2

L'interfaccia a riga di comando ip per iproute2 ha molti sottocomandi utili, come quelli seguenti:

  • ip r: stampa la tabella delle route
  • ip n: stampa la tabella dei vicini per la mappatura degli indirizzi IP all'indirizzo MAC
  • ip a: stampa tutte le interfacce sulla macchina

Una route mancante o una voce mancante nella tabella vicina potrebbero causare problemi di connettività da parte del nodo. Anetd gestisce la tabella delle route e la tabella vicina. Un errore di configurazione in queste tabelle può causare problemi di connettività.

Interfaccia a riga di comando Cilium / Hubble per Dataplane v2

Ogni pod anetd dispone di diversi strumenti di debug utili per i problemi di connettività:

  • cilium monitor --type=drop
    • Stampa il log per ogni pacchetto che viene rilasciato da anetd / Cilium.
  • hubble observe
    • Stampa tutti i pacchetti che passano attraverso lo stack ebpf di anetd.
  • cilium status --all-health
    • Stampa lo stato di Cilium, incluso lo stato della connettività nodo a nodo. Ogni pod anetd controlla l'integrità di tutti gli altri nodi nel cluster e può aiutare a determinare eventuali problemi di connettività tra nodi.

Iptables

Iptables è utilizzato in molti componenti e sottosistemi di Kubernetes. kube-proxy utilizza iptables per implementare la risoluzione del servizio.

  1. Per risolvere i problemi di rete a livello di iptables, utilizza il seguente comando:

    iptables -L -v | grep DROP
    

    Esamina le regole di rilascio e controlla il numero di pacchetti e di byte per vedere se aumentano nel tempo.

TTPdump

Tcpdump è un potente strumento di acquisizione di pacchetti che genera molti dati sul traffico di rete. Una pratica comune è eseguire tcpdump sia dall'origine sia dalla destinazione. Se un pacchetto viene acquisito quando lascia il nodo di origine, ma non è mai stato acquisito sul nodo di destinazione, significa che qualcosa nel mezzo ignora il pacchetto. Questo comportamento indica di solito che qualcosa nell'infrastruttura fisica perde per errore il pacchetto.

Risoluzione dei problemi DNS

I problemi di risoluzione DNS rientrano in due categorie principali:

  • Pod normali, che utilizzano i server DNS nel cluster.
  • Pod o nodi della rete host che non utilizzano server DNS nel cluster

Le seguenti sezioni forniscono alcune informazioni sull'architettura DNS del cluster e suggerimenti utili prima di iniziare a risolvere i problemi relativi a una di queste categorie.

Architettura DNS del cluster

Un servizio DNS del cluster risolve le richieste DNS per i pod nel cluster. CoreDNS offre questo servizio per tutte le versioni di Google Distributed Cloud Virtual for Bare Metal.

Ogni cluster ha due o più pod coredns e un gestore della scalabilità automatica responsabile della scalabilità del numero di pod DNS in base alle dimensioni del cluster. Esiste anche un servizio denominato kube-dns che bilancia il carico delle richieste tra tutti i pod coredns di backend.

Per la maggior parte dei pod, il DNS upstream è configurato sull'indirizzo IP del servizio kube-dns e i pod inviano richieste DNS a uno dei pod coredns. Le richieste DNS possono essere raggruppate in una delle seguenti destinazioni:

  • Se la richiesta riguarda un dominio cluster.local, si tratta di un nome DNS nel cluster che fa riferimento a un servizio o pod nel cluster.
    • CoreDNS controlla api-server per tutti i servizi e i pod nel cluster e risponde alle richieste per i domini cluster.local validi.
  • Se la richiesta non riguarda un dominio cluster.local, allora è per un dominio esterno.
    • CoreDNS inoltra la richiesta ai server dei nomi upstream. Per impostazione predefinita, CoreDNS utilizza i nameserver upstream configurati sul nodo su cui è in esecuzione.

Per maggiori informazioni, consulta la panoramica sul funzionamento e sulla configurazione del DNS in Kubernetes.

Suggerimenti per la risoluzione dei problemi del DNS

Per risolvere i problemi del DNS, puoi utilizzare gli strumenti dig e nslookup. Questi strumenti consentono di inviare richieste DNS per verificare se la risoluzione DNS funziona correttamente. I seguenti esempi mostrano come utilizzare dig e nslookup per verificare la presenza di problemi di risoluzione DNS.

  • Usa dig o nslookup per inviare una richiesta per google.com:

    dig google.com
    nslookup google.com
    
  • Usa dig per inviare una richiesta per kubernetes.default.svc.cluster.local al server 192.168.0.10:

    dig @192.168.0.10 kubernetes.default.svc.cluster.local
    
  • Puoi anche utilizzare nslookup per eseguire la stessa ricerca DNS del comando dig precedente:

    nslookup kubernetes.default.svc.cluster.local 192.168.0.10
    

    Esamina l'output dei comandi dig o nslookup. Se ricevi una risposta errata o una mancata risposta, significa che si è verificato un problema di risoluzione DNS.

Pod regolari

Il primo passaggio per eseguire il debug di un problema DNS è determinare se le richieste arrivano ai pod coredns o meno. Spesso si verifica un problema generale di connettività dei cluster sotto forma di problemi DNS, perché una richiesta DNS è il primo tipo di traffico inviato da un carico di lavoro.

Esamina i messaggi di errore delle tue applicazioni. Errori come io timeout o simili indicano che non viene fornita nessuna risposta e che si tratta di un problema generale di connettività di rete.

I messaggi di errore che includono un codice di errore DNS come NXDOMAIN o SERVFAIL indicano che c'è connettività al server DNS nel cluster, ma il server non è riuscito a risolvere il nome di dominio:

  • Gli errori NXDOMAIN indicano che il server DNS segnala che il dominio non esiste. Verifica che il nome di dominio richiesto dalla tua applicazione sia valido.
  • Gli errori SERVFAIL o REFUSED indicano che il server DNS ha inviato una risposta, ma non è stato in grado di risolvere il dominio o di convalidare che non esiste. Per saperne di più, controlla i log dei pod coredns.

Puoi trovare l'indirizzo IP del servizio kube-dns utilizzando il seguente comando:

kubectl -n kube-system get svc kube-dns

Da un pod in cui il DNS non funziona, prova a inviare una richiesta DNS a questo indirizzo IP utilizzando dig o nslookup, come descritto nella sezione precedente:

  • Se queste richieste non funzionano, prova a inviarle all'indirizzo IP di ogni pod coredns.
  • Se alcuni pod funzionano ma non altri, verifica se sono presenti pattern distinguibili, ad esempio la risoluzione DNS funziona per i pod sullo stesso nodo del pod coredns, ma non tra i nodi. Questo comportamento potrebbe indicare problemi di connettività in-cluster.

Se CoreDNS non è in grado di risolvere nomi di dominio esterni, consulta la sezione seguente per la risoluzione dei problemi dei pod della rete host. CoreDNS si comporta come un pod di rete host e utilizza i server DNS upstream del nodo per la risoluzione dei nomi.

Pod o nodi della rete host

Per la risoluzione DNS, i pod e i nodi della rete host utilizzano i server dei nomi configurati sul nodo, non il servizio DNS nel cluster. A seconda del sistema operativo, questo server dei nomi è configurato in /etc/resolv.conf o /run/systemd/resolve/resolv.conf. Con questa configurazione, l'utente non può risolvere i nomi di dominio cluster.local.

In caso di problemi con la risoluzione dei nomi della rete host, segui i passaggi per la risoluzione dei problemi riportati nelle sezioni precedenti per verificare se il DNS funziona correttamente per i nameserver a monte.

Verifica che tutti i nodi abbiano lo stesso insieme di server configurato. Se hai configurato server dei nomi diversi, potresti notare incongruenze nella risoluzione DNS su nodi diversi. Verifica che ogni server dei nomi funzioni singolarmente inviando una richiesta a ciascuno utilizzando dig o nslookup. Se alcuni server dei nomi funzionano e altri no, vedrai questo tipo di errori di risoluzione DNS incoerenti.

Problemi di rete comuni

Le seguenti sezioni descrivono nel dettaglio alcuni problemi di rete comuni che potresti riscontrare. Per risolvere il problema, segui le linee guida appropriate per la risoluzione dei problemi. Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.

Dataplane v2 / Cilium

Errore comune: [PUT /endpoint/{id}][429] putEndpointIdTooManyRequests

Questo errore indica che l'evento di creazione del pod è stato rifiutato dall'agente Cilium a causa di un limite di frequenza. Per ogni nodo, Cilium ha un limite di quattro richieste in parallelo all'endpoint PUT. Questo comportamento è previsto in caso di burst di richieste a un nodo. L'agente Cilium dovrebbe recuperare le richieste in ritardo.

In GKE Enterprise 1.14 e versioni successive, il limite di frequenza si adatta automaticamente alla capacità dei nodi. Il limitatore di frequenza può convergere a un numero più ragionevole, con limiti di frequenza più elevati per i nodi più potenti.

Errore comune: Ebpf map size is full

Dataplane v2 archivia lo stato in una mappa eBFP. Lo stato include le regole di servizio, monitoraggio delle connessioni, identità pod e criteri di rete. Se una mappa è piena, l'agente non può inserire voci, il che crea una discrepanza tra il piano di controllo e il piano dati. Ad esempio, la mappa dei servizi ha un limite di voci di 64.000.

  1. Per controllare le voci della mappa eBFP e le relative dimensioni attuali, utilizza bpftool. L'esempio seguente controlla le mappe del bilanciatore del carico:

    bpftool map dump pinned \
    /sys/fs/bpf/tc/globals/cilium_lb4_services_v2 | tail -n -1
    
    bpftool map dump pinned \ /sys/fs/bpf/tc/globals/cilium_lb4_backends_v2 | tail -n -1
    
  2. Se la mappa ha quasi raggiunto il limite di 64.000, ripulisci le mappe. Il seguente esempio esegue la pulizia delle mappe del bilanciatore del carico:

    bpftool map dump pinned /sys/fs/bpf/tc/globals/cilium_lb4_services_v2 | \
        awk '{ print "0x"$2, "0x"$3, "0x"$4, "0x"$5, "0x"$6, "0x"$7, "0x"$8, "0x"$9, "0x"$10, "0x"$11, "0x"$12, "0x"$13}' | \
        head -n -1 | \
        xargs -L 1 bpftool map delete pinned /sys/fs/bpf/tc/globals/cilium_lb4_services_v2 key
    
    bpftool map dump pinned /sys/fs/bpf/tc/globals/cilium_lb4_backends_v2 | \
        awk '{ print "0x"$2, "0x"$3, "0x"$4, "0x"$5 }' | \
        head -n -1 | \
        xargs -L 1 bpftool map delete pinned /sys/fs/bpf/tc/globals/cilium_lb4_backends_v2 key
    
  3. Per ricaricare lo stato nella mappa eBFP, riavvia anetd.

Nodo non pronto a causa di errori NetworkPluginNotReady

Se il pod CNI non è in esecuzione sul nodo, potresti visualizzare un errore simile al seguente:

  "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

Il nodo potrebbe anche essere in uno stato non pronto, con un errore simile al seguente esempio:

  "Network plugin not installed"

Quando un nodo viene inizializzato, kubelet attende che si verifichino diversi eventi prima di contrassegnare il nodo come Ready. Uno degli eventi controllati da kubelet indica l'installazione del plug-in Container Network Interface (CNI). Il plug-in CNI deve essere installato da anetd utilizzando un container init per installare sia il programma binario CNI sia la configurazione CNI nelle directory host richieste.

Per risolvere il problema, verifica perché quei pod non sono in esecuzione sul nodo. In genere, l'errore non è dovuto a problemi di rete. Questi pod vengono eseguiti sulla rete host, senza alcuna dipendenza di rete.

  1. Controlla lo stato del pod anetd. Per determinare la causa del problema, procedi nel seguente modo:

    • Se il pod è in stato Crashlooping, controlla i log per capire perché il pod non può essere eseguito correttamente.
    • Se il pod è in stato Pending, utilizza kubectl describe ed esamina gli eventi del pod. Ad esempio, nel pod potrebbe mancare una risorsa come un volume.
    • Se il pod è in stato Running, controlla i log e la configurazione. Alcune implementazioni CNI forniscono opzioni per disabilitare l'installazione CNI, come in Cilium.
    • Esiste un'opzione di configurazione in Anetd denominata custom-cni-conf. Se questa impostazione è configurata come true, anetd non installerà il programma binario CNI.

Il servizio F5 non riceve traffico

Se non viene rilevato traffico al servizio F5, esamina i seguenti passaggi per la risoluzione dei problemi:

  1. Verifica che ogni partizione in F5 BIG-IP sia configurata in un cluster (di amministrazione o cluster utente). Se una partizione è condivisa da più cluster diversi, si verificano interruzioni della connessione intermittenti. Questo comportamento è dovuto al fatto che due cluster tentano di acquisire il controllo sulla stessa partizione ed eliminano i servizi da altri cluster.

  2. Verifica che i due pod seguenti siano in esecuzione. Qualsiasi pod non in esecuzione indica un errore:

    Load-balancer-f5
    K8s-bigip-ctlr-deployment-577d57985d-vk9wj
    

    Load-balancer-f5 di proprietà di GKE Enterprise e crea ConfigMap per ogni servizio di tipo LoadBalancer. Il ConfigMap viene infine utilizzato dal controller bigip.

  3. Assicurati che il ConfigMap esista per ogni porta di ogni servizio. Ad esempio, con le seguenti porte:

    Kube-server-443-tcp     2   31h
    Kube-server-8132-tcp        2   31h
    

    Il servizio kube-server dovrebbe essere simile al seguente esempio:

    Kube-server LoadBalancer  10.96.232.96  21.1.7.16   443:30095/TCP,8132:32424/TCP  31h
    

    La sezione dei dati in ConfigMap deve contenere il VIP e la porta frontend, come mostrato nell'esempio seguente:

    data: '{"virtualServer":{"backend":{"serviceName":"kube-apiserver","servicePort":443,"healthMonitors":[{"protocol":"tcp","interval":5,"timeout":16}]},"frontend":{"virtualAddress":{"bindAddr":"21.1.7.16","port":443},"partition":"herc-b5bead08c95b-admin","balance":"ratio-member","mode":"tcp"}}}'
      schema: f5schemadb://bigip-virtual-server_v0.1.7.json
    
  4. Controlla i log e le metriche dell'istanza BIG-IP. Se ConfigMap è configurato correttamente, ma l'istanza BIG-IP non rispetta la configurazione, potrebbe trattarsi di un problema F5. Per problemi che si verificano all'interno dell'istanza BIG-IP, contatta l'assistenza F5 per diagnosticare e risolvere i problemi.

Errore NAT con troppe connessioni parallele

Per un determinato nodo nel cluster, l'indirizzo IP del nodo fornisce la traduzione degli indirizzi di rete (NAT) per i pacchetti instradati a un indirizzo esterno al cluster. Allo stesso modo, quando i pacchetti in entrata entrano in un nodo di bilanciamento del carico configurato per utilizzare il bilanciamento del carico in bundle (spec.loadBalancer.mode: bundled), la Network Address Translation (SNAT) di origine instrada i pacchetti all'indirizzo IP del nodo prima che vengano inoltrati a un pod di backend.

L'intervallo di porte per NAT utilizzato da GDCV per Bare Metal è 32768-65535. Questo intervallo limita il numero di connessioni parallele a 32.767 per protocollo su quel nodo. Ogni connessione richiede una voce nella tabella conntrack. Se disponi di troppe connessioni di breve durata, la tabella conntrack esaurisce le porte per NAT. Un garbage collection ripulisce le voci inattive, ma la pulizia non è immediata.

Quando il numero di connessioni sul tuo nodo si avvicina a 32.767, inizi a notare un calo dei pacchetti per le connessioni che richiedono NAT.

Per determinare se questo problema ti riguarda:

  1. Esegui questo comando nel pod anetd sul nodo problematico:

    kubectl -n kube-system anetd-XXX -- hubble observe \
        --from-ip $IP --to-ip $IP -f
    

    Dovresti visualizzare errori nel modulo seguente:

    No mapping for NAT masquerade DROPPED
    

Per risolvere questo problema, ridistribuisci il traffico su altri nodi.

Passaggi successivi

Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.