Questa pagina mostra come risolvere i problemi di rete con Google Distributed Cloud. Vengono fornite informazioni e indicazioni generali per la risoluzione dei problemi, nonché strumenti suggeriti. Sono incluse anche informazioni sulla risoluzione dei problemi DNS e alcuni problemi comuni per Calico, Seesaw e MetalLB.
Se hai bisogno di ulteriore assistenza, 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, Seesaw o MetalLB si basano sugli switch che rispettano l'ARP gratuito, il bilanciamento del carico in bundle con Border Gateway Protocol (BGP) si basa sui router e tutti i nodi devono essere in grado di comunicare tra loro. Quando si verifica un problema di rete nei cluster GKE, devi identificare se il problema riguarda i componenti di GKE Enterprise o la 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: l'oggetto (da dove), il target (a quale) e il livello di rete.
L'ambito dell'oggetto può essere uno dei seguenti:
- Tutti i nodi (o hostNetwork Pod) a livello di cluster.
- Tutti i pod a livello di cluster.
- Tutti i pod su un singolo nodo o su un insieme di nodi.
- Tutti i pod dello stesso deployment o DaemonSet.
- Client dall'esterno del cluster.
L'ambito del target può essere uno o più dei seguenti:
- Tutti gli altri indirizzi IP dei pod dello stesso cluster.
- Tutti gli altri indirizzi IP dei pod dello stesso nodo.
- VIP del servizio ClusterIP dello stesso cluster.
- VIP del servizio LoadBalancer dello stesso cluster.
- LoadBalancer di livello 7 in entrata (Istio).
- 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 del livello di collegamento 2, come il sistema di vicini, ARP o NDP.
- Problemi di routing degli indirizzi IP di livello 3.
- Problemi relativi all'endpoint TCP o UDP di livello 4.
- Problemi HTTP o HTTPS di livello 7.
- Problemi di risoluzione DNS.
Comprendere l'ambito di un problema aiuta a identificare i componenti coinvolti nel problema e a quale livello si verifica. La raccolta delle informazioni al verificarsi del problema è importante perché alcuni problemi sono temporanei, pertanto gli istantanei dopo il recupero del sistema non includeranno informazioni sufficienti per l'analisi della causa principale.
Problemi di Ingress
Se l'oggetto è un client esterno al cluster e non è riuscito a connettersi a un servizio LoadBalancer, si tratta di un problema di connettività Nord-Sud. Il seguente diagramma mostra che in un esempio funzionante il traffico in entrata attraversa la pila da sinistra a destra e il traffico di ritorno attraversa di nuovo la pila da destra a sinistra. Seesaw è diverso perché il traffico di ritorno salta il bilanciatore del carico e torna direttamente al client:
In caso di problemi con questo flusso di traffico, utilizza il seguente flusso di lavoro per la risoluzione dei problemi per identificare il problema:
In questo diagramma di flusso, le seguenti indicazioni per la risoluzione dei problemi aiutano a determinare dove si trova il problema:
- Il pacchetto esce dal client? In caso contrario, è probabile che si tratti di un problema di infrastruttura di rete.
- Utilizzi il bilanciatore del carico Seesaw? In questo caso, il pacchetto arriva al nodo Seesaw e l'ARP viene inviato correttamente? In caso contrario, è probabile che si tratti di un problema di infrastruttura di rete.
- Utilizzi MetalLB? In questo caso, il pacchetto arriva al nodo LB e l'ARP viene inviato correttamente? In caso contrario, è probabile che si tratti di un problema di infrastruttura di rete.
- Utilizzi F5 BIG-IP? Se sì, hai controllato se ci sono problemi relativi a F5?
- La Network Address Translation (NAT) viene eseguita correttamente? In caso contrario, è probabile che si tratti di un problema di kube-proxy / Dataplane V2.
- Il pacchetto arriva al nodo worker? In caso contrario, è probabile che tu abbia un problema di comunicazione tra pod Calico / Dataplane v2.
- Il pacchetto arriva al pod? In caso contrario, è probabile che si tratti di un problema di inoltro locale Calico / Dataplane v2.
Le sezioni seguenti descrivono la procedura per la risoluzione dei problemi di ogni fase al fine di determinare se il traffico scorre correttamente o meno.
Il pacchetto esce dal client?
Verifica che il pacchetto esca correttamente dal client e passi attraverso il router configurato nell'infrastruttura di rete fisica.
Utilizza
tcpdump
per controllare il pacchetto quando esce dal client per il servizio di destinazione:tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
Se non vedi traffico in uscita, è qui che si trova il problema.
Il pacchetto arriva a un nodo Seesaw?
Se utilizzi Seesaw, consulta la documentazione della versione 1.16, individua il nodo principale e poi connettiti al nodo utilizzando SSH.
Utilizza
tcpdump
per verificare se i pacchetti previsti sono arrivati al nodo Seesaw:tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
Se non vedi traffico in entrata, è questa la causa del problema.
Il pacchetto arriva a un nodo LoadBalancer?
Se utilizzi MetalLB come bilanciatore del carico:
Esamina il log
metallb-controller
per determinare quale nodo del bilanciatore del carico serve il VIP del servizio:kubectl -n kube-system logs -l app=metallb --all-containers=true | grep SERVICE_VIP
Connettiti al nodo tramite SSH.
Per un nodo MetalLB, utilizza
tcpdump
per esaminare il traffico:tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
Per il bilanciamento del carico manuale, il traffico potrebbe essere indirizzato a 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 a seconda del tipo di bilanciatore del carico, poiché MetalLB e Seesaw non eseguono il NAT prima di inoltrare il pacchetto ai nodi.
Se non vedi traffico in nessun nodo, significa che è qui che si trova il problema.
Si è verificato un problema con 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 viene inviato correttamente?
Il nodo del bilanciatore del carico per MetalLB o Seesaw si basa sull'ARP per pubblicizzare il VIP di servizio. Se la risposta ARP viene inviata correttamente, ma il traffico non arriva, è un segnale di un problema nell'infrastruttura di rete fisica. Una causa comune di questo problema è che alcune funzionalità di apprendimento del dataplane avanzate ignorano la risposta ARP nelle soluzioni di rete definita dal software (SDN).
Utilizza
tcpdump
per rilevare le risposte ARP:tcpdump -ni any arp
Cerca il messaggio che pubblicizza il VIP con cui hai problemi.
Per Seesaw, vengono inviati ARP gratuiti per tutti i VIP. Dovresti vedere i messaggi ARP per ogni VIP ogni 10 secondi.
Per MetalLB, non invia ARP gratuiti. La frequenza con cui viene visualizzata una risposta dipende dal momento in cui un altro dispositivo, ad esempio uno switch ToR (top of rack) o uno switch virtuale, invia una richiesta ARP.
Viene eseguito il NAT?
Dataplane v2 / kube-proxy esegue la Network Address Translation (NAT) di destinazione (NAT di destinazione o DNAT) per tradurre l'IP 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.
Utilizza
tcpdump
per verificare se il VIP del servizio è tradotto correttamente:tcpdump -ni any host BACKEND_POD_IP and port CONTAINER_PORT
Per Dataplane v2, puoi anche connetterti ai pod
anetd
e utilizzare gli strumenti di debug Cilium incorporati:cilium monitor --type=drop
Per ulteriori informazioni, consulta una delle seguenti sezioni sui problemi di Dataplane v2 / Cilium.
Il pacchetto arriva a un nodo worker?
Sui nodi worker, il pacchetto arriva sull'interfaccia esterna e viene poi fornito ai pod.
Controlla se il pacchetto arriva all'interfaccia esterna, in genere denominata
eth0
oens192
, utilizzandotcpdump
:tcpdump -ni any host BACKEND_POD_IP and port CONTAINER_PORT
Poiché i backend di servizio normali contengono più pod su nodi diversi, potrebbe essere difficile risolvere i problemi relativi al nodo in cui si è verificato l'errore. Una soluzione comune è registrare il problema per un periodo di tempo sufficientemente lungo da consentire l'arrivo di qualche pacchetto o limitare il numero di backend a uno.
Se il pacchetto non arriva mai al nodo di lavoro, è un'indicazione di un problema di infrastruttura di rete. Rivolgiti al team di infrastruttura di rete per scoprire perché il pacchetto viene ignorato tra i nodi LoadBalancer e i nodi worker. Ecco alcuni problemi comuni:
- Controlla i log della rete software-defined (SDN). A volte, l'SDN potrebbe eliminare i pacchetti per vari motivi, ad esempio per segmentazione, checksum errato o anti-spoofing.
- Regole firewall che filtrano i pacchetti la cui destinazione è l'indirizzo IP e la porta del pod di backend.
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 rete dell'host, questo passaggio non è necessario perché il pod condivide lo spazio dei nomi di rete con il nodo. In caso contrario, è necessario un ulteriore inoltro dei pacchetti.
Ogni pod ha coppie di interfacce Ethernet virtuali, che funzionano come pipe. Un pacchetto inviato a un'estremità dell'interfaccia viene ricevuto dall'altra estremità dell'interfaccia. Una delle interfacce viene spostata nello spazio dei nomi di rete del pod e rinominata in eth0
. L'altra interfaccia viene conservata nello spazio dei nomi dell'host. I diversi CNI hanno schemi diversi. Per Dataplane v2, l'interfaccia è in genere denominata
lxcxxxx
. I nomi hanno numeri di interfaccia consecutivi, ad esempio lxc17
e
lxc18
. Puoi controllare 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 arriva al pod, controlla la tabella di routing come segue:
ip route
Normalmente, ogni pod dovrebbe avere una voce di routing che indirizzi l'indirizzo IP del pod all'interfaccia lxc
. Se la voce non è presente, in genere significa che il percorso dati CNI presenta un errore. Per determinare la causa principale, controlla i log del DaemonSet CNI.
Problemi di traffico in uscita
Se il traffico può entrare in un pod, potresti riscontrare un problema con il traffico in uscita dal pod. I seguenti diagrammi mostrano che in un esempio funzionante il traffico in entrata attraversa la pila da sinistra a destra:
Per verificare che il pacchetto in uscita si presenti correttamente come indirizzo IP del nodo, controlla il servizio esterno (livello 4).
L'indirizzo IP sorgente del pacchetto deve essere mappato dall'indirizzo IP del pod all'indirizzo IP del nodo con la Network Address Translation dell'origine (NAT di origine o SNAT). In Dataplane 2, questa procedura viene eseguita tramite ebpf caricato su un'interfaccia esterna. Calico utilizza le regole iptables.
Utilizza
tcpdump
per verificare se l'indirizzo IP di origine viene 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
indica che i pacchetti sono mascherati correttamente, ma il servizio remoto non risponde, controlla la connessione al servizio esterno nella tua infrastruttura.Se i pacchetti in uscita sono mascherati correttamente come 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 un ping da uno dei pod:kubectl exec POD_NAME ping EXTERNAL_IP
Se non vedi le risposte ai ping, controlla la connessione al servizio esterno nella tua infrastruttura.
Problemi all'interno del cluster
Per i problemi di connettività tra pod, prova a circoscrivere il problema ai nodi. Spesso un gruppo di nodi non può comunicare con un altro gruppo di nodi.
In Dataplane v2, controlla la connettività del nodo dal nodo corrente a tutti gli altri nodi nello stesso cluster. All'interno del pod
anetd
, controlla lo stato di salute:cilium status --all-health
Google Distributed Cloud utilizza la modalità di routing diretto. Dovresti vedere una voce di route per ogni nodo del cluster, come mostrato nell'esempio seguente:
# <pod-cidr> via <node-ip> dev <external-interface> 192.168.1.0/24 via 21.0.208.188 dev ens192 192.168.2.0/24 via 21.0.208.133 dev ens192
Se per un nodo manca una route prevista, la connessione a quel nodo viene persa.
Problemi relativi al livello di rete
Identificare il livello di rete in cui si verifica il problema di connettività è un passaggio importante. Un messaggio di errore come "Un problema di connettività da un'origine a una destinazione" non è sufficientemente informativo per 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 corretto.
Spesso i messaggi di errore indicano direttamente in 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 nel livello 4.
- I codici HTTP
- Gli errori "Connessione reimpostata dal peer" indicano che si tratta di un problema di livello 4.
- Spesso, la socket remota non è in linea con lo stato corrente di una connessione e invia un pacchetto
RESET
. Questo comportamento potrebbe essere un errore nel monitoraggio delle connessioni o nel NAT.
- Spesso, la socket remota non è in linea con lo stato corrente di una connessione e invia un pacchetto
- Gli errori "Nessun percorso per l'host" e "Timeout connessione" sono in genere un problema di livello 3 o
livello 2.
- Questi errori indicano che il pacchetto non può essere instradato correttamente alla destinazione.
Strumenti utili per la risoluzione dei problemi
I DaemonSet relativi alla rete vengono eseguiti sui tuoi nodi e potrebbero essere la causa di problemi di connettività. Tuttavia, anche la configurazione errata di nodi, switch ToR (top of rack), router spine o firewall può causare problemi. Puoi utilizzare i seguenti strumenti per determinare l'ambito o il livello del problema e capire se si tratta di un problema con i nodi GKE Enterprise o con l'infrastruttura fisica.
Dindin
Il ping funziona a livello 3 (livello IP) e controlla il percorso tra un'origine e una destinazione. Se il ping non riesce a raggiungere una destinazione, spesso il problema riguarda il livello 3.
Tuttavia, non tutti gli indirizzi IP sono pingabili. Ad esempio, alcuni VIP del bilanciatore del carico non sono pingabili se si tratta di un bilanciatore del carico puramente di livello 4. Il servizio ClusterIP
è un esempio in cui il VIP potrebbe non restituire una risposta al ping. A livello 4, questo servizio restituisce una risposta ping solo se specifichi un numero di porta, ad esempio VIP:port
.
I bilanciatori di carico BGPLB, MetalLB e Seesaw in Google Distributed Cloud funzionano tutti a livello 3. Puoi utilizzare il comando ping per controllare la connettività. Anche se F5 è diverso, supporta anche ICMP. Puoi utilizzare il comando ping per controllare la connettività all'IP virtuale F5.
Arping
L'arping è simile al ping, tranne per il fatto che funziona a livello 2. I problemi di livello 2 e 3 spesso hanno messaggi di errore simili nelle applicazioni. Arping e ping possono contribuire a distinguere il problema. Ad esempio, se l'origine e la destinazione si trovano nella stessa sottorete, ma non riesci ad eseguire l'ARPing della destinazione, si tratta di un problema di livello 2.
Un arping <ip>
riuscito restituisce l'indirizzo MAC della destinazione. A livello 2, questo indirizzo indica spesso un problema di infrastruttura fisica.
Il problema è un'errata configurazione dello switch virtuale.
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 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ù di una voce di indirizzo MAC, significa che esiste un conflitto di indirizzi IP.
Dopo aver ottenuto l'indirizzo MAC da arping, puoi utilizzare
https://maclookup.app/
per cercare il produttore dell'indirizzo MAC. Ogni produttore possiede un prefisso MAC, quindi puoi utilizzare queste informazioni per determinare quale dispositivo sta tentando di utilizzare lo stesso indirizzo IP. Ad esempio, VMware possiede il blocco 00:50:56
, pertanto un 00:50:56:xx:yy:zz
indirizzo MAC è una VM nel tuo ambiente vSphere.
iproute2
La CLI ip
per iproute2
ha molti sottocomandi utili, ad esempio:
ip r
: stampa la tabella routeip n
: stampa la tabella dei vicini per la mappatura dell'indirizzo IP all'indirizzo MACip a
: stampa tutte le interfacce della macchina
Una route o una voce mancante nella tabella dei vicini potrebbe causare problemi di connettività dal nodo. Sia Anetd che Calico gestiscono la tabella route e la tabella dei vicini. Un'errata configurazione di 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 di ogni pacchetto eliminato da anetd / Cilium.
hubble observe
- Stampa tutti i pacchetti che passano per la pila ebpf di anetd.
cilium status --all-health
- Stampa lo stato di Cilium, incluso lo stato della connettività da nodo a nodo. Ogni pod anetd controlla l'integrità di tutti gli altri nodi nel cluster e può aiutarti a determinare eventuali problemi di connettività da nodo a nodo.
Iptables
Iptables viene utilizzato in molti componenti e sottosistemi Kubernetes. kube-proxy
utilizza iptables per implementare la risoluzione dei servizi.
Calico utilizza iptables per implementare i criteri di rete
Per risolvere i problemi di rete a livello di iptables, utilizza il seguente comando:
iptables -L -v | grep DROP
Esamina le regole di eliminazione e controlla i conteggi di pacchetti e byte per vedere se aumentano nel tempo.
Tcpdump
Tcpdump è un potente strumento di acquisizione dei pacchetti che genera molti dati sul traffico di rete. Una pratica comune è eseguire tcpdump sia dall'origine che dalla destinazione. Se un pacchetto viene acquisito quando esce dal nodo di origine, ma non viene mai acquisito sul nodo di destinazione, significa che qualcosa nel mezzo perde il pacchetto. Questo comportamento indica in genere che qualcosa nell'infrastruttura fisica perde erroneamente il pacchetto.
Risoluzione dei problemi DNS
I problemi di risoluzione DNS rientrano in due categorie principali:
- Pod regolari, che utilizzano i server DNS nel cluster.
- Pod o nodi della rete host che non utilizzano server DNS nel cluster
Le sezioni seguenti forniscono alcune informazioni sull'architettura DNS del cluster e suggerimenti utili prima di iniziare a risolvere i problemi di una di queste categorie.
Architettura DNS cluster
Un servizio DNS del cluster risolve le richieste DNS per i pod nel cluster. CoreDNS fornisce questo servizio per Google Distributed Cloud 1.9.0 e versioni successive.
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 esegue il bilanciamento del carico delle richieste tra tutti i pod coredns
di backend.
La maggior parte dei pod ha il DNS upstream configurato sull'indirizzo IP del servizio kube-dns
e invia 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 all'interno del cluster che fa riferimento a un servizio o a un pod nel cluster.- CoreDNS monitora il
api-server
per tutti i servizi e i pod del cluster e risponde alle richieste di dominicluster.local
validi.
- CoreDNS monitora il
- Se la richiesta non riguarda un dominio
cluster.local
, riguarda un dominio esterno.- CoreDNS inoltra la richiesta ai nameserver upstream. Per impostazione predefinita, CoreDNS utilizza i nameserver upstream configurati sul nodo su cui è eseguito.
Per saperne di più, consulta la panoramica del funzionamento e della configurazione del DNS in Kubernetes.
Suggerimenti per la risoluzione dei problemi DNS
Per risolvere i problemi DNS, puoi utilizzare gli strumenti dig
e nslookup
. Questi strumenti ti 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
onslookup
per inviare una richiesta digoogle.com
:dig google.com nslookup google.com
Utilizza
dig
per inviare una richiesta dikubernetes.default.svc.cluster.local
al server192.168.0.10
:dig @192.168.0.10 kubernetes.default.svc.cluster.local
Puoi anche utilizzare
nslookup
per eseguire la stessa ricerca DNS del comandodig
precedente:nslookup kubernetes.default.svc.cluster.local 192.168.0.10
Esamina l'output dei comandi dig o nslookup. Se ricevi una risposta sbagliata o nessuna risposta, significa che si è verificato un problema di risoluzione DNS.
Pod standard
Il primo passaggio per eseguire il debug di un problema DNS consiste nel determinare se le richieste arrivano o meno ai pod coredns
. Spesso un problema di connettività generale del cluster si manifesta come
problemi DNS perché una richiesta DNS è il primo tipo di traffico inviato da un workload.
Esamina i messaggi di errore delle tue applicazioni. Errori come io timeout
o simili indicano che non è stata ricevuta alcuna risposta e che si è verificato un problema generale di connettività di rete.
I messaggi di errore che includono un codice di errore DNS come NXDOMAIN
o SERVFAIL
indicano che è presente 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 dall'applicazione sia valido. - Gli errori
SERVFAIL
oREFUSED
indicano che il server DNS ha inviato una risposta, ma non è stato in grado di risolvere il dominio o di verificare che non esista. Per ulteriori informazioni, controlla i log dei podcoredns
.
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 in una sezione precedente:
- Se queste richieste non funzionano, prova a inviare richieste all'indirizzo IP di ogni
coredns
pod. - Se alcuni pod funzionano, ma altri no, controlla se sono presenti schemi distinguibili, ad esempio la risoluzione DNS funziona per i pod sullo stesso nodo del pod
coredns
, ma non su più nodi. Questo comportamento potrebbe indicare un problema di connettività all'interno del cluster.
Se CoreDNS non riesce a risolvere i nomi di dominio esterni, consulta la sezione seguente per risolvere i problemi relativi ai 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
I pod della rete host e i nodi utilizzano i nameserver configurati sul nodo per la risoluzione DNS, 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
. Questa configurazione significa che non possono risolvere i nomi di dominio cluster.local
.
Se riscontri 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 server dei nomi upstream.
Problemi di rete comuni
Le sezioni seguenti descrivono in dettaglio alcuni problemi di rete comuni che potresti riscontrare. Per risolvere il problema, segui le linee guida per la risoluzione dei problemi appropriate. Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud.
Calico
Errore comune: calico/node is not ready: BIRD is not ready: BGP not
established
Questo errore di stato "non pronto" in Kubernetes di solito indica che un determinato peer non è raggiungibile nel cluster. Verifica che la connettività BGP tra i due peer sia consentita nel tuo ambiente.
Questo errore può verificarsi anche se le risorse dei nodi inattivi sono configurate per la rete mesh da nodo a nodo. Per risolvere il problema, ritira i nodi obsoleti.
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 per via di un limite di frequenza. Per ogni nodo, Cilium ha un limite di quattro richieste simultanee all'endpoint PUT. Quando si verifica un picco di richieste a un nodo, si tratta di un comportamento previsto. L'agente Cilium dovrebbe recuperare le richieste in ritardo.
In GKE Enterprise 1.14 e versioni successive, il limite di velocità si regola automaticamente in base alla capacità del nodo. Il limitatore di velocità può convergere su un numero più ragionevole, con limiti di velocità più elevati per i nodi più potenti.
Errore comune: Ebpf map size is full
Dataplane v2 memorizza lo stato in una mappa eBFP. Lo stato include il servizio, il monitoraggio delle connessioni, l'identità del pod e le regole del criterio 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 64.000 voci.
Per controllare le voci della mappa eBFP e le relative dimensioni correnti, 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
Se la mappa è vicina al limite di 64.000 elementi, ripulisci le mappe. L'esempio seguente pulisce le 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
Per reintegrare 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 di non disponibilità, con un errore simile al seguente:
"Network plugin not installed"
Quando un nodo viene inizializzato, kubelet
attende che si verifichino diversi eventi prima di contrassegnarlo come Ready
. Uno degli eventi controllati da kubelet
è l'installazione del plug-in Container Network Interface (CNI). Il plug-in CNI deve essere installato da anetd o Calico utilizzando un contenitore init per installare sia il file binario CNI sia la configurazione CNI nelle directory host richieste.
Per risolvere il problema, controlla perché questi pod non sono in esecuzione sul nodo. In genere, l'errore non è dovuto a problemi di rete. Questi pod vengono eseguiti sulla rete dell'host, quindi non esiste alcuna dipendenza dalla rete.
Controlla lo stato del pod
anetd
ocalico-node
. Esamina i seguenti passaggi per la risoluzione dei problemi per determinare la causa del problema:- Se il pod è in stato
Crashlooping
, controlla i log per capire perché non può funzionare correttamente. - Se il pod è in uno stato
Pending
, utilizzakubectl describe
e controlla 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 di CNI forniscono opzioni per disattivare l'installazione di CNI, come in Cilium. - In anetd è presente un'opzione di configurazione denominata
custom-cni-conf
. Se questa impostazione è configurata cometrue
, anetd non installerà il proprio file binario CNI.
- Se il pod è in stato
Nodo NON PRONTO a causa di voci ARP obsolete
A volte, le voci ARP obsolete nei nodi del piano di controllo del cluster di amministrazione possono causare una mancata corrispondenza degli indirizzi MAC. Questa mancata corrispondenza dell'indirizzo può, a sua volta, causare timeout di connessione ai VIP del control plane dei cluster di utenti gestiti. I timeout di connessione possono portare al contrassegno come NOT
READY
del nodo con voci ARP obsolete. I nodi contrassegnati come NOT READY
possono bloccare le installazioni e gli upgrade del cluster.
In questa situazione, il log di kubelet sul nodo con voci ARP obsolete contiene un errore di timeout dell'handshake TLS come il seguente:
failed to get API group resources: unable to retrieve the complete list of server APIs: v1: Get "https://128.160.252.101:443/api/v1": net/http: TLS handshake timeout
Per verificare e risolvere il problema, svolgi i seguenti passaggi:
Utilizza SSH per connetterti al nodo del control plane del cluster utente.
Verifica l'indirizzo MAC dell'interfaccia a cui è associato l'indirizzo VIP:
ip a | grep DEVICE_NAME: -A 6
Sostituisci
DEVICE_NAME
con il nome del dispositivo di rete per il nodo del control plane.Utilizza SSH per connetterti a un nodo del control plane del cluster di amministrazione.
Controlla la cache ARP sul control plane del cluster di amministrazione per l'indirizzo VIP del control plane del cluster utente:
ip n | grep VIP_ADDRESS
Sostituisci
VIP_ADDRESS
con l'indirizzo IP del VIP del control plane del cluster utente (controlPlaneVIP
).Se i due comandi
ip
restituiscono un indirizzo MAC diverso, questo problema ti riguarda.Per risolvere il problema, svuota la cache ARP sul nodo del control plane del cluster di amministrazione:
ip n flush all
Il servizio F5 non riceve traffico
Se non passa alcun traffico al servizio F5, esamina i seguenti passaggi per la risoluzione dei problemi:
Verifica che ogni partizione in F5 BIG-IP sia configurata in un cluster, che si tratti di cluster di amministrazione o utente. Se una partizione è condivisa da più cluster diversi, si verificano interruzioni intermittenti della connessione. Questo comportamento si verifica perché due cluster tentano di acquisire il controllo della stessa partizione ed eliminare i servizi da altri cluster.
Verifica che i seguenti due pod siano in esecuzione. Eventuali pod non in esecuzione indicano 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 controllerbigip
.Assicurati che 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 avere un aspetto simile all'esempio seguente:Kube-server LoadBalancer 10.96.232.96 21.1.7.16 443:30095/TCP,8132:32424/TCP 31h
La sezione dei dati nel ConfigMap deve contenere l'IP 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
Controlla i log e le metriche dell'istanza BIG-IP. Se il ConfigMap è configurato correttamente, ma l'istanza BIG-IP non rispetta la configurazione, potrebbe trattarsi di un problema F5. Per i problemi che si verificano all'interno dell'istanza BIG-IP, contatta l'assistenza F5 per diagnosticarli e risolverli.