Questo documento fornisce istruzioni e procedure diagnostiche per diagnosticare i problemi di rete nei cluster Google Kubernetes Engine (GKE) utilizzando l'osservabilità di GKE Dataplane V2, Hubble e Cloud Monitoring.
Per una panoramica dell'architettura e delle best practice concettuali, consulta Best practice per l'osservabilità della rete.
Albero decisionale per la risoluzione dei problemi e concetti principali
Prima di esaminare le procedure, utilizza la seguente matrice decisionale per identificare il livello dello stack di rete GKE che probabilmente causa il problema e vai alla sezione corrispondente.
| Sintomo o domanda diagnostica | Livello sospetto | Procedura consigliata |
|---|---|---|
I pod non riescono a risolvere domini esterni o servizi Kubernetes interni (timeout DNS, NXDOMAIN, SERVFAIL). |
Livello 1: pod e servizio (DNS) | Diagnosticare gli errori di risoluzione DNS |
| I servizi non possono comunicare; timeout di connessione o pacchetti eliminati tra i pod. | Livello 1: pod e servizio (perdita di pacchetti o policy) | Diagnostica le perdite di pacchetti e i blocchi di NetworkPolicy |
Le repliche del workload hanno un carico di traffico irregolare oppure i pod registrano tassi elevati di ripristini TCP (RST). |
Livello 1: pod e servizio (bilanciamento del carico o trasporto) | Diagnosticare lo sbilanciamento del traffico e i ripristini TCP |
| Latenza generale, timeout intermittenti o riavvii CNI nei nodi. | Livello 2: nodo e CNI (kernel) | Triage per la latenza a livello di nodo e i colli di bottiglia CNI |
| I pod non possono raggiungere risorse esterne a GKE (Cloud SQL, API esterne o altri VPC). | Livello 3: VPC e routing | Isolare i problemi di connettività GKE rispetto a VPC o a quelli esterni |
| Hai bisogno di una simulazione automatizzata del percorso per verificare se le regole firewall, le route o NetworkPolicy bloccano il traffico. | Livello 3: VPC e routing (simulazione) | Diagnosticare la connettività utilizzando Connectivity Tests |
| Devi identificare quali workload inviano traffico a internet e vengono sottoposti a NAT. | Livello 4: gateway esterno e costi | Identifica il traffico NAT (in uscita verso internet) |
| Costi elevati per il trasferimento dei dati tra zone o necessità di visualizzare i principali interlocutori senza scrivere query SQL. | Livello 4: gateway esterno e costi | Analizzare i costi e il rendimento del traffico dei cluster utilizzando Flow Analyzer |
Concetti di base del networking
Se non hai familiarità con Kubernetes o con il Google Cloud networking, tieni presente questi concetti di base:
- eBPF (Extended Berkeley Packet Filter): una tecnologia del sistema operativo che consente di eseguire programmi di monitoraggio e routing sicuri direttamente all'interno del kernel Linux. GKE Dataplane V2 utilizza eBPF per instradare i pacchetti e applicare NetworkPolicy con un overhead delle prestazioni minimo.
- IP masquerading (SNAT): il processo di riscrittura dell'indirizzo IP di origine di un pacchetto. Quando un pod GKE (che ha un indirizzo IP privato) comunica con internet o con risorse VPC esterne, GKE maschera (riscrive) l'indirizzo IP del pod con l'indirizzo IP del nodo in modo che i sistemi esterni sappiano come instradare la risposta.
- Monitoraggio delle connessioni (Conntrack): una funzionalità del kernel che monitora tutte le connessioni di rete attive. Nei cluster GKE Dataplane V2, questo monitoraggio è suddiviso
tra due tabelle: conntrack del kernel Linux standard (utilizzata da
ip-masq-agent) e una tabella conntrack gestita da Cilium e GKE Dataplane V2 memorizzata in una mappa eBPF. Se un nodo gestisce troppe connessioni simultanee, una di queste tabelle di monitoraggio può riempirsi (esaurimento di conntrack), causando l'eliminazione silenziosa di nuovi pacchetti da parte del nodo. - Hubble:il motore di osservabilità per GKE Dataplane V2. Viene eseguito su eBPF e fornisce visibilità in tempo reale su flussi di traffico, perdita di pacchetti e valutazione di NetworkPolicy.
Livello 1: osservabilità di pod e servizi (applicazione)
Il livello Pod e servizio copre la comunicazione di rete tra pod, servizi e DNS del cluster. I problemi a questo livello in genere si manifestano come timeout di connessione dell'applicazione, errori di risoluzione dei nomi o distribuzione del carico non uniforme.
Diagnosticare gli errori di risoluzione DNS
Prima di risolvere i problemi DNS, esamina l'ambito e i prerequisiti della diagnostica:
- Area di interesse:comunicazione tra pod e CoreDNS o NodeLocal DNSCache, latenza DNS, timeout di risoluzione DNS upstream e convalida NetworkPolicy FQDN.
- Prerequisiti: metriche GKE Dataplane V2 abilitate; accesso
kubectl. - Compatibilità CNI: GKE Dataplane V2 (Advanced Datapath) e GKE CNI standard.
- Sintomo: i pod registrano
dial tcp: lookup <domain>: i/o timeout,NXDOMAINo latenza intermittente nelle chiamate API in uscita. - Obiettivo:determinare se l'errore DNS ha origine all'interno del cluster
(
kube-dnso saturazione di NodeLocal DNSCache), una NetworkPolicy che blocca la porta UDP o TCP 53 o il degrado della rete upstream.
Passaggio 1: controllo di raggiungibilità di base
Prima di risolvere i problemi relativi ai livelli DNS, verifica se la destinazione è raggiungibile direttamente utilizzando il relativo indirizzo IP dall'interno del pod interessato:
# 1. Test raw IP reachability (bypasses DNS entirely)
kubectl exec -it my-pod -n default -- curl -v --connect-timeout 5 http://10.240.0.10:8080
# 2. Test domain resolution
kubectl exec -it my-pod -n default -- curl -v --connect-timeout 5 http://my-service.default.svc.cluster.local:8080
- Se la connessione IP va a buon fine, ma il dominio non funziona:il problema è isolato al livello di risoluzione DNS. Vai al passaggio 2.
- Se entrambi i test non vanno a buon fine, il problema riguarda il routing a livello di rete o l'applicazione dei criteri. Vai a Diagnosticare i pacchetti ignorati e i blocchi NetworkPolicy.
Controlla il pre-popolamento DNS di NetworkPolicy FQDN
Se il cluster utilizza NetworkPolicy basate su FQDN (FQDNNetworkPolicy), verifica
che il nome di dominio sia esplicitamente consentito. Se un pod esegue una query su un dominio esterno che non è precompilato nella cache del proxy DNS di GKE Dataplane V2 o consentito dalla policy, GKE Dataplane V2 blocca il traffico in uscita verso l'indirizzo IP risolto:
# Verify whether UDP or TCP port 53 egress is permitted in the Pod's namespace
kubectl get networkpolicy -n default -o yaml | grep -A 5 -B 2 "port: 53"
Passaggio 2: controlla le metriche DNS in Cloud Monitoring
GKE espone le metriche DNS integrate in Cloud Monitoring con il prefisso
kubernetes.io/networking/dns/.
Per controllare le metriche DNS in Cloud Monitoring:
- Nella console Google Cloud , vai a Cloud Monitoring > Dashboard.
- Seleziona la dashboard predefinita GKE DNS Observability - Cluster View (o vai a Esplora metriche e filtra per
kubernetes.io/networking/dns/). - Valuta i seguenti indicatori principali (per NodeLocal DNSCache, sostituisci
kubednsconnode_local_dnsnel percorso della metrica):
| Nome metrica | Soglia di avviso | Causa principale |
|---|---|---|
kubernetes.io/networking/dns/kubedns/max_concurrent_rejected_request_count |
> 0 | Limite di query simultanee raggiunto. kube-dns o NodeLocal DNSCache sta eliminando le query. |
kubernetes.io/networking/dns/kubedns/dns_request_latencies |
p99 > 100ms | Latenza di risoluzione DNS end-to-end elevata in kube-dns o NodeLocal DNSCache. |
kubernetes.io/networking/dns/kubedns/forwarding_request_latencies |
p99 > 100ms | Latenza o saturazione del server DNS upstream. |
Sequenza di triage delle prestazioni e del timeout DNS
Segui questa sequenza di triage per diagnosticare la latenza DNS, gli errori di cache e i timeout upstream:
- Controlla la percentuale successi cache:query
kubernetes.io/networking/dns/kubedns/dns_cache_request_count(onode_local_dns/dns_cache_request_count) raggruppata per l'etichettacache_status. Secache_status="hit"è basso ecache_status="miss"è alto, le applicazioni potrebbero inviare query non FQDN (ad esempiomy-serviceanzichémy-service.default.svc.cluster.local), causando l'attraversamento del percorso di ricerca in tutte le voci di/etc/resolv.conf. - Valuta la latenza upstream:un valore elevato di
forwarding_request_latenciesindica problemi con il server DNS upstream (ad esempio, il DNS on-premise aziendale raggiunto tramite Cloud Interconnect o Cloud VPN oppure limiti di Cloud DNS). Controlla gli override DNS personalizzati:esamina i ConfigMap
kube-dnspersonalizzati per stub o forwarding upstream configurati in modo errato:kubectl get configmap kube-dns -n kube-system -o yaml
Passaggio 3: trasmetti in streaming il traffico DNS live con Hubble CLI
Utilizza l'alias helper Hubble CLI per esaminare le richieste e le risposte DNS in tempo reale trasmesse in streaming dal kernel del nodo:
# 1. Ensure the helper alias is set in your terminal session
alias gke-hubble="kubectl exec -it -n gke-managed-dpv2-observability deployment/hubble-relay -c hubble-cli -- hubble"
# 2. Observe live DNS (Port 53) traffic for a specific Pod
gke-hubble observe --pod default/my-pod --port 53
Passaggio 4: convalida la correzione
Se si sono verificati rifiuti di query simultanei, applica NodeLocal DNSCache per assorbire
le ricerche DNS ad alta frequenza direttamente sul nodo senza raggiungere i limiti kube-dns a livello di cluster:
# Verify NodeLocal DNSCache DaemonSet is running
kubectl get daemonset node-local-dns -n kube-system
Diagnostica le perdite di pacchetti e i blocchi di NetworkPolicy
Prima di esaminare le eliminazioni di pacchetti e i rifiuti delle norme, rivedi l'ambito della diagnostica e i prerequisiti:
- Area di interesse:cali di traffico tra oggetti Pod o tra oggetti Pod e Service, applicazione di NetworkPolicy, motivi di eliminazione di eBPF del kernel.
- Prerequisiti: osservabilità del flusso di GKE Dataplane V2 abilitata; registrazione di NetworkPolicy configurata.
- Compatibilità CNI:solo GKE Dataplane V2.
- Sintomo:i tentativi di connessione dell'applicazione non riescono con
Connection timed outoConnection reset by peer. - Obiettivo: individuare il motivo esatto per cui NetworkPolicy o eBPF eliminano i pacchetti senza modifiche per tentativi alle norme di sicurezza.
Passaggio 1: monitora le metriche di Hubble Drop
Quando GKE Dataplane V2 elimina un pacchetto, emette la metrica hubble_drop_total
taggata con il motivo dell'eliminazione e i metadati di origine e destinazione. Per monitorare
le metriche di Hubble Drop:
Se non è già configurata, esegui il deployment di una risorsa
PodMonitoringdi Google Cloud Managed Service per Prometheus per eseguire lo scraping delle metriche di Hubble:apiVersion: monitoring.googleapis.com/v1 kind: PodMonitoring metadata: name: hubble-metrics namespace: gke-managed-dpv2-observability spec: selector: matchLabels: k8s-app: cilium endpoints: - port: hubble-metrics interval: 30sEsegui la seguente query in Cloud Monitoring > Esplora metriche per visualizzare le interruzioni per motivo:
sum by (reason) (rate(hubble_drop_total[5m])) > 0Interpreta i codici
reasoncomuni:Policy denied: un criterio di rete Kubernetes blocca esplicitamente o implicitamente la connessione.CT: Map insertion failed: la tabella di monitoraggio delle connessioni (conntrack) è esaurita.Unsupported L3 protocol: pacchetto non IPv4 o IPv6 o intestazione danneggiata.
Passaggio 2: controlla i log NetworkPolicy in Cloud Logging
La registrazione di NetworkPolicy esporta log JSON strutturati per tutte le decisioni relative ai criteri. Per interrogare i log NetworkPolicy in Cloud Logging:
- Nella console Google Cloud , vai a Cloud Logging > Esplora log.
Esegui questa query:
resource.type="k8s_node" log_name:"projects/PROJECT_ID/logs/events" jsonPayload.connection.verdict="DENY" jsonPayload.src.pod_name="my-source-pod"Ispeziona il payload JSON:
jsonPayload.drop_reason: mostra il motivo per cui il pacchetto è stato eliminato.jsonPayload.policies: elenca le NetworkPolicy valutate. Se viene restituito un elenco vuoto con un verdettoDENY, lo spazio dei nomi funziona in modalità di negazione predefinita e nessuna policy ha consentito il traffico.
Se non vengono visualizzati log NetworkPolicy, verifica che la registrazione sia abilitata nella risorsa personalizzata
NetworkLogging del cluster. Ad esempio, verifica che il campo
spec.cluster.deny.log sia impostato su true:
kubectl get networklogging default -o yaml
Passaggio 3: Trace le interruzioni live con Hubble CLI
Trasmetti in streaming i pacchetti in tempo reale direttamente utilizzando Hubble CLI:
gke-hubble observe --verdict DROPPED --namespace default --follow
Output di esempio:
TIMESTAMP SOURCE DESTINATION TYPE VERDICT
10:14:22.102 default/frontend default/backend:80 to-stack DROPPED (Policy denied by NetworkPolicy: backend-deny-all)
L'output indica l'esatta NetworkPolicy che blocca il traffico
(backend-deny-all).
Passaggio 4: controlla l'esaurimento di conntrack
Se il motivo della perdita indica CT: Map insertion failed:
Controlla il log dell'agente GKE Dataplane V2 per la saturazione della tabella conntrack:
kubectl logs -n kube-system daemonset/anetd -c cilium-agent --tail=100 | grep "Conntrack table full"Controlla le dimensioni massime della tabella conntrack sul nodo interessato:
kubectl exec -it -n kube-system daemonset/anetd -c cilium-agent -- cilium status --all-controllers | grep -i conntrackSe la tabella conntrack è piena, esegui lo scale out dei carichi di lavoro su più nodi o riduci la frequenza di connessione dai pod client.
Diagnosticare lo sbilanciamento del traffico e i reset TCP
Prima di risolvere i problemi relativi allo sbilanciamento del traffico e ai ripristini della connessione, esamina l'ambito della diagnostica e i prerequisiti:
- Area di interesse:bilanciamento del carico non uniforme, errori di handshake TCP, interruzione improvvisa della connessione.
- Prerequisiti:metriche GKE Dataplane V2 abilitate.
- Compatibilità CNI: GKE Dataplane V2.
- Sintomo:alcune repliche del pod ricevono traffico eccessivo, mentre altre rimangono inattive; le applicazioni client registrano
connection reset by peerobroken pipe. - Obiettivo:determinare se lo sbilanciamento del traffico è causato dalla persistenza della connessione a livello di trasporto (livello 4 OSI, TCP) rispetto al livello applicazione (livello 7 OSI, HTTP/2 o gRPC) e identificare l'origine dei pacchetti TCP RST.
Passaggio 1: confronta il flusso di traffico a livello di pod
Per determinare se il traffico è distribuito in modo uniforme tra le repliche, procedi nel seguente modo:
In Cloud Monitoring, esegui una query sul conteggio del flusso di ingresso in tutti i pod di un deployment:
sum by (pod) (rate(pod_flow_ingress_flows_count{destination_workload="my-service"}[5m]))Valuta la distribuzione del traffico tra i pod. Se un singolo pod riceve la maggior parte del traffico, esamina il riutilizzo della connessione o le sessioni permanenti:
- gRPC o HTTP/2:le connessioni TCP di lunga durata fanno sì che tutte le richieste attraversino un singolo flusso TCP a un pod di backend. Il routing del servizio Kubernetes a livello di trasporto (livello 4 OSI, TCP) non può bilanciare le richieste all'interno di una connessione HTTP/2 stabilita.
- Affinità sessione ClientIP:verifica se il servizio è
configurato con
sessionAffinity: ClientIP. - Servizi headless:i client potrebbero risolvere il DNS una sola volta e memorizzare nella cache l'indirizzo IP singolo in modo permanente.
Passaggio 2: analizza le metriche di ripristino TCP
I reset TCP (RST) terminano immediatamente le connessioni. Vengono emessi dal
kernel del sistema operativo quando un endpoint riceve un pacchetto per una porta sconosciuta
o quando un'applicazione chiude una connessione con dati non letti nel buffer.
Esegui la seguente query MQL in Cloud Monitoring:
fetch prometheus_target
| metric 'prometheus.googleapis.com/hubble_tcp_flags_total/counter'
| filter (metric.flag == 'RST')
| align rate(1m)
| every 1m
| group_by [metric.source, metric.destination, metric.traffic_direction], sum(val())
Esamina i risultati della query per determinare l'origine del ripristino:
- RST in uscita (traffic_direction=
egress): il pod locale genera il ripristino. Controlla se l'applicazione Pod va in arresto anomalo, raggiunge il limite di connessione o rifiuta attivamente la connessione. - RST in entrata (traffic_direction=
ingress): il peer remoto (database esterno, API o pod remoto) ha inviato il ripristino. Controlla l'integrità del server di destinazione e gli stati del firewall.
Passaggio 3: trasmetti in streaming i ripristini TCP in tempo reale
Utilizza Hubble CLI per acquisire l'handshake di ripristino live:
gke-hubble observe --type trace --verdict FORWARDED --tcp-flags RST --namespace default
Passaggio 4: correzione e soluzioni pratiche
Applica i seguenti passaggi di correzione a seconda della causa dello sbilanciamento del traffico o dei ripristini TCP:
- Per la persistenza della connessione a livello di applicazione (livello 7 del modello OSI) o gRPC:
- Esegui il deployment di Cloud Service Mesh per attivare il bilanciamento del carico a livello di richiesta (livello 7 OSI).
- Configura i limiti di connessione lato client o i timeout keep-alive (ad esempio, gRPC
MAX_CONNECTION_AGEeMAX_CONNECTION_AGE_GRACE) per forzare il ristabilimento periodico della connessione.
- Per l'affinità IP del servizio, rimuovi
service.spec.sessionAffinitya meno che lo stato dell'applicazione non lo richieda rigorosamente. - Per la memorizzazione nella cache DNS del servizio headless, assicurati che i runtime dell'applicazione (ad esempio
JVM
networkaddress.cache.ttl) non memorizzino nella cache i risultati DNS in modo indefinito. - Per l'overflow della coda di backlog dell'applicazione:quando una coda di ascolto dell'applicazione è piena, il kernel Linux elimina i pacchetti SYN in entrata o invia un TCP RST. Fare lo scale out delle repliche dei pod o aumentare il backlog di ascolto dell'applicazione
(
somaxconn).
Livello 2: osservabilità di nodi e CNI (kernel)
Il livello del nodo e di CNI comprende il kernel Linux host, i programmi eBPF e le interfacce di rete del nodo. I colli di bottiglia a questo livello influiscono su tutti i carichi di lavoro in esecuzione sul nodo interessato.
Controllo dell'integrità del sistema: rileva l'applicazione di patch non autorizzate ad anetd
GKE Dataplane V2 viene eseguito come DaemonSet gestito (anetd) nello spazio dei nomi kube-system. In Cloud Logging, puoi eseguire query sui log di controllo di Kubernetes per rilevare se utenti non autorizzati o script automatici hanno applicato patch o riavviato anetd:
protoPayload.methodName="io.k8s.core.v1.daemonsets.patch" OR
protoPayload.methodName="io.k8s.core.v1.daemonsets.update"
protoPayload.resourceName="namespaces/kube-system/daemonsets/anetd"
Se viene rilevata una patch non autorizzata, ripristina la configurazione predefinita di DaemonSet o attiva la ricreazione del pool di nodi per ripristinare lo stato gestito.
Triage per la latenza a livello di nodo e i colli di bottiglia CNI
Esamina l'ambito della diagnostica e i prerequisiti prima di diagnosticare la latenza a livello di nodo e i colli di bottiglia del kernel:
- Area di interesse:latenza del kernel host, perdita di pacchetti nell'interfaccia VM, saturazione dell'agente eBPF di GKE Dataplane V2, esaurimento di conntrack.
- Prerequisiti:metriche VM di Compute Engine abilitate; accesso
kubectl. - Compatibilità CNI:GKE Dataplane V2 e CNI GKE standard.
- Sintomo:il traffico tra nodi subisce picchi di latenza o cali casuali, mentre il traffico all'interno del nodo rimane integro.
- Obiettivo:distinguere tra limitazione della larghezza di banda della rete VM host, eliminazioni del kernel Linux e colli di bottiglia a livello di CNI.
Passaggio 1: distinguere i problemi esterni a GKE da quelli interni a GKE
Esegui il test di base della VM Compute Engine: esegui il deployment di una VM Compute Engine autonoma nella stessa subnet VPC dei nodi del cluster GKE. Testa la connettività dalla VM alla destinazione di destinazione.
- Se la VM autonoma presenta gli stessi pacchetti persi o la stessa latenza, il problema si trova al di fuori di GKE (firewall VPC, Cloud NAT, Cloud Interconnect o il server esterno). Vai a Isolare i problemi di connettività GKE rispetto a VPC o esterna.
- Se la VM autonoma comunica normalmente, ma i pod GKE non funzionano:il problema si verifica all'interno di GKE (eBPF a livello di nodo, conntrack o CNI). Vai al passaggio 2.
Passaggio 2: differenzia i problemi dell'applicazione dai problemi dei livelli di nodi e CNI
Per determinare se la latenza ha origine nell'applicazione o nel nodo e nel livello CNI, segui questi passaggi:
Controlla la saturazione delle risorse dell'applicazione:verifica che il nodo non stia riscontrando limitazione della CPU o pressione della memoria, il che ritarda l'elaborazione dei pacchetti nello spazio utente:
kubectl top nodes kubectl top pods -n defaultIspeziona il conteggio conntrack del kernel Linux: controlla il conteggio conntrack attivo sull'host:
# On a node where you have debugging access cat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_maxSe
nf_conntrack_countsi avvicina anf_conntrack_max, il kernel host elimina i nuovi pacchetti TCP SYN.
Passaggio 3: verifica delle eliminazioni di pacchetti a livello di VM utilizzando la telemetria di Compute Engine
Google Cloud Compute Engine esporta le metriche dell'interfaccia di rete a livello di VM in Cloud Monitoring.
In Cloud Monitoring > Metrics Explorer, esegui la query:
sum by (drop_reason) (rate(compute_googleapis_com:instance_network_dropped_packets_count[5m]))
FQ_CODEL_DROP: pacchetto eliminato a causa della saturazione della coda Fair Queuing o CoDel (limite di larghezza di banda in uscita della VM superato).FIREWALL_RULE_DROP: pacchetto eliminato da una regola firewall VPC.RATE_LIMIT_DROP: pacchetto eliminato perché la VM ha superato la quota massima di pacchetti al secondo (PPS) dell'interfaccia di rete.
Passaggio 4: esamina i cali a livello di kernel utilizzando eBPF
Se le metriche a livello di VM mostrano zero pacchetti eliminati, ma i pod GKE eliminano comunque
pacchetti, ispeziona l'agente GKE Dataplane V2 (anetd) per verificare se sono stati eliminati pacchetti eBPF:
kubectl logs -n kube-system daemonset/anetd -c cilium-agent --tail=200 | grep -i "drop"
Cerca ct-map-insertion-failed o fib-lookup-failed.
Livello 3: osservabilità di VPC e routing (rete cloud)
Il livello di routing VPC e cloud connette i nodi GKE ad altri Google Cloud servizi, reti on-premise e internet. Gli errori in questa sezione in genere derivano da regole firewall VPC, route personalizzate o configurazioni del gateway.
Isolare i problemi di connettività GKE rispetto a VPC o alla connettività esterna
Esamina l'ambito e i prerequisiti della diagnostica prima di isolare i problemi di rete esterni dagli errori nel cluster:
- Area di interesse:isolamento dei confini tra il routing interno di Kubernetes e il routing cloud VPC.
- Prerequisiti: gcloud CLI; autorizzazioni per creare Connectivity Tests.
- Compatibilità CNI: tutti i cluster.
- Sintomo: i pod non riescono a connettersi a una risorsa esterna (ad esempio, Cloud SQL, un'API on-premise o un endpoint di terze parti).
- Obiettivo:determinare rapidamente se l'interruzione si verifica all'interno del nodo GKE o all'interno della Google Cloud rete VPC o esterna.
Passaggio 1: test di base della VM Compute Engine
Per eseguire il deployment di una VM di base e valutare se il problema persiste al di fuori di GKE, procedi nel seguente modo:
Esegui il deployment di un'istanza VM di Compute Engine temporanea nella stessa subnet VPC e nella stessa zona del pool di nodi GKE:
gcloud compute instances create gke-baseline-tester \ --zone=us-central1-a \ --subnet=gke-subnet \ --machine-type=e2-microConnettiti all'istanza utilizzando SSH e testa la connettività alla destinazione:
curl -v --connect-timeout 5 https://api.example.comValuta il risultato:
- Se la VM Compute Engine non riesce a connettersi, il problema si trova nella rete VPC o esterna (regole firewall, tabelle di routing, esaurimento degli IP Cloud NAT o inclusione degli IP esterni nella lista consentita).
- Se la VM Compute Engine si connette correttamente, il problema si verifica all'interno di GKE (NetworkPolicy che blocca il traffico in uscita, CIDR pod non mascherato o DNS a livello di container).
Passaggio 2: esegui un test on demand di Connectivity Tests
Esegui un test di Google Cloud Connectivity Tests dalla VM nodo alla destinazione:
gcloud network-management connectivity-tests create test-node-to-dest \
--source-instance=projects/PROJECT_ID/zones/us-central1-a/instances/gke-baseline-tester \
--destination-ip-address=203.0.113.10 \
--destination-port=443 \
--protocol=TCP
Controlla il risultato nella console Google Cloud per identificare se una regola firewall VPC o una route sta eliminando il traffico.
Diagnosticare la connettività utilizzando Connectivity Tests
Connectivity Tests simula i percorsi dei pacchetti tra le risorse GKE e VPC senza inviare traffico in tempo reale. Questa simulazione valuta la risoluzione DNAT da Service ClusterIP a pod, le regole in entrata e in uscita di NetworkPolicy di GKE Dataplane V2 e il masquerading IP dei nodi (SNAT). Esamina l'ambito della diagnostica e i prerequisiti prima di eseguire le simulazioni di percorso automatizzate:
- Area di interesse: simulazione automatizzata del percorso statico per pod, servizi, NetworkPolicy e route VPC di GKE.
- Prerequisiti: Network Intelligence Center abilitato; API di gestione di rete abilitata.
- Compatibilità CNI:GKE Dataplane V2 (analisi avanzata).
- Sintomo: interruzioni della connettività inspiegabili in cui tutte le configurazioni sembrano valide dopo l'ispezione manuale.
- Obiettivo: simulare e tracciare staticamente l'intero percorso del pacchetto da un'origine Pod alla destinazione, identificando la riga esatta della policy che causa un errore.
Scenario A: verifica se una NetworkPolicy GKE blocca la raccolta delle metriche
Quando esegui lo scraping delle metriche dai pod in uno spazio dei nomi sicuro, i raccoglitori di Google Cloud Managed Service per Prometheus potrebbero essere bloccati da un NetworkPolicy di tipo default-deny:
gcloud network-management connectivity-tests create test-gmp-to-pod \
--source-ip-address=10.0.0.15 \
--destination-gke-pod=projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/k8s/namespaces/prod/pods/backend-pod \
--destination-port=8080 \
--protocol=TCP
Esamina la traccia del test nella console Google Cloud . Se il test termina al passaggio
GKE Network Policy evaluation con DROP, è necessario aggiungere una regola in entrata per
consentire il traffico dai pod del raccoglitore.
Scenario B: verifica della raggiungibilità di un servizio GKE
Simula la raggiungibilità da una VM client a un servizio Kubernetes interno:
gcloud network-management connectivity-tests create test-vm-to-service \
--source-instance=projects/PROJECT_ID/zones/us-central1-a/instances/client-vm \
--destination-ip-address=10.96.0.100 \
--destination-port=80 \
--protocol=TCP
La traccia simulata mostra:
- Corrispondenza route VPC.
- Consenti traffico in uscita e in entrata del firewall VPC.
- Arrivo al nodo GKE.
- DNAT del servizio all'indirizzo IP del pod di backend.
- Valutazione di Ingress NetworkPolicy sul pod di backend.
Scenario C: diagnostica dei problemi di uscita da pod a internet
Quando i pod non riescono a raggiungere un'API esterna su internet:
Crea un test dal pod all'indirizzo IP pubblico esterno (ad esempio
8.8.8.8):gcloud network-management connectivity-tests create test-pod-to-internet \ --source-gke-pod=projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/k8s/namespaces/prod/pods/app-pod \ --destination-ip-address=8.8.8.8 \ --destination-port=53 \ --protocol=UDPEsamina il punto di consegna:
- Eliminato in NetworkPolicy: il pod non dispone di un NetworkPolicy in uscita
che consenta il traffico verso
0.0.0.0/0. - Eliminato dal firewall VPC: una regola firewall VPC nega il traffico in uscita dalla subnet del nodo.
- Eliminato in Cloud NAT o Route: la subnet non dispone di una route predefinita al gateway internet o Cloud NAT non è configurato per la subnet.
- Eliminato in NetworkPolicy: il pod non dispone di un NetworkPolicy in uscita
che consenta il traffico verso
Livello 4: osservabilità del gateway esterno e dei costi (internet e NAT)
Il livello del gateway esterno gestisce il traffico in uscita verso destinazioni internet pubbliche tramite Cloud NAT o gateway esterni. L'osservabilità a questo livello consente di identificare i carichi di lavoro con traffico in uscita elevato e controllare i costi di trasferimento dei dati.
Identifica il traffico NAT (in uscita verso internet)
Esamina l'ambito e i prerequisiti della diagnostica prima di analizzare il traffico internet in uscita e NAT:
- Area di interesse:traffico internet in uscita, utilizzo delle porte Cloud NAT, costi di trasferimento dei dati esterni.
- Prerequisiti: osservabilità del flusso GKE Dataplane V2 abilitata.
- Compatibilità CNI: GKE Dataplane V2.
- Sintomo: errori di esaurimento delle porte Cloud NAT o costi di traffico in uscita verso internet inaspettatamente elevati.
- Obiettivo:identificare quali oggetti Pod e Service GKE specifici trasmettono traffico a endpoint internet esterni.
Passaggio 1: comprendi i concetti di "to-stack" e "world" in GKE Dataplane V2
In GKE Dataplane V2:
world: rappresenta qualsiasi destinazione al di fuori del cluster GKE e della rete VPC (la rete internet pubblica).to-stack: rappresenta i pacchetti che passano dall'interfaccia veth del container eBPF allo stack di rete Linux host per essere sottoposti a mascheramento IP (SNAT) prima di raggiungere Cloud NAT.
Passaggio 2: trasmetti in streaming e filtra il traffico NAT con Hubble CLI
Trasmetti in streaming i flussi internet in uscita in tempo reale provenienti dal tuo cluster:
# Stream egress flows heading to external internet ("world")
gke-hubble observe \
--traffic-direction egress \
--verdict FORWARDED \
--to-identity world \
--follow
Output di esempio:
TIMESTAMP SOURCE DESTINATION TYPE VERDICT
10:25:01.120 default/worker-pod 142.250.190.46:443 to-stack FORWARDED
Per identificare i principali mittenti in uscita, puoi anche inviare l'output JSON di Hubble a
jq per conteggiare i flussi in uscita esterni per pod:
timeout 60s gke-hubble observe \
--traffic-direction egress \
--verdict FORWARDED \
--to-identity world \
-o json | jq -r '.flow.source.namespace + "/" + .flow.source.pod_name' | sort | uniq -c | sort -nr | head -n 10
Passaggio 3: monitora il traffico esterno utilizzando le metriche
In Cloud Monitoring, monitora il volume dei flussi esterni:
fetch prometheus_target
| metric 'prometheus.googleapis.com/pod_flow_egress_flows_count/counter'
| filter (metric.destination_identity == 'world')
| align rate(1m)
| every 1m
| group_by [metric.source_workload, metric.source_namespace], sum(val())
Analizza i costi e il rendimento del traffico del cluster utilizzando Flow Analyzer
Esamina l'ambito della diagnostica e i prerequisiti prima di visualizzare i flussi di traffico e i costi tra zone:
- Area di interesse:costi di trasferimento dei dati tra zone, principali comunicatori, visibilità del traffico tra nodi senza query SQL.
- Prerequisiti: log di flusso VPC abilitati con
INCLUDE_ALL_METADATA; visibilità tra nodi abilitata; analisi dell'osservabilità abilitata nel bucket di log. - Compatibilità CNI: tutti i cluster.
- Sintomo: costi di trasferimento di dati tra zone elevati sulle fatture mensili Google Cloud .
- Obiettivo:identificare visivamente quali carichi di lavoro GKE generano traffico tra zone e ottimizzare il posizionamento senza eseguire query sui log non elaborati.
Prerequisiti
Per utilizzare Flow Analyzer per GKE:
- Log di flusso VPC:devono essere abilitati nella subnet del cluster con
metadata="INCLUDE_ALL_METADATA". - Visibilità tra nodi:deve essere abilitata sul cluster in modo che il traffico tra i pod venga esposto alla pipeline di logging del flusso VPC.
- Analisi dei log:è necessario eseguire l'upgrade del bucket
_Defaultin Cloud Logging per utilizzare Observability Analytics.
Passaggio 1: identifica i talker principali di GKE in Flow Analyzer
Per visualizzare i workload ad alto volume in Flow Analyzer:
- Nella console Google Cloud , vai alla pagina Flow Analyzer.
- Fai clic su Bucket di origine e seleziona il bucket dei log che contiene i log di flusso. A meno che tu non li abbia indirizzati altrove, questo è il bucket _Default.
- In Aggregazione del traffico, seleziona Origine - Destinazione.
- Imposta l'intervallo di tempo per la finestra di analisi.
- In Organizza flussi per, seleziona i campi del pod o del workload GKE.
- Fai clic su Esegui nuova query. Il grafico Flussi di dati più elevati mostra quali carichi di lavoro spostano più dati.
Passaggio 2: analizza i costi del traffico tra zone
Il traffico tra zone comporta costi per il trasferimento di dati. Per individuare i carichi di lavoro che trasmettono dati tra zone:
- Nella sezione Organizza flussi per, seleziona i campi della zona di origine e della zona di destinazione.
- Fai clic su Esegui nuova query e leggi la tabella Tutti i flussi di dati. Le righe in cui le zone di origine e di destinazione sono diverse rappresentano il traffico tra zone. I filtri di Flow Analyzer corrispondono ai valori, quindi non puoi filtrare per "non uguale"; confronta invece le coppie di zone nei risultati.
- Espandi una coppia di zone ad alto volume per visualizzare i workload GKE di origine e di destinazione sottostanti.
Correzione:
- Implementa Kubernetes
topologySpreadConstraintsopodAffinityper collocare i servizi di comunicazione all'interno della stessa zona di disponibilità. - Abilita il routing topologia consapevole (
service.kubernetes.io/topology-mode: Auto) sul servizio per mantenere il traffico all'interno della zona di origine.
Passaggio 3: esegui il drill-down in Observability Analytics (per query SQL avanzate)
In Flow Analyzer, fai clic su Visualizza in Analisi dei log per eseguire query SQL sui dati di flusso.
La seguente query SQL calcola i pod che comunicano di più tra le zone:
SELECT
JSON_VALUE(json_payload.src_gke_details.pod.workload.workload_name) AS src_workload,
JSON_VALUE(json_payload.dest_gke_details.pod.workload.workload_name) AS dest_workload,
JSON_VALUE(json_payload.src_instance.zone) AS src_zone,
JSON_VALUE(json_payload.dest_instance.zone) AS dest_zone,
SUM(CAST(JSON_VALUE(json_payload.bytes_sent) AS INT64)) / 1024 / 1024 / 1024 AS total_gb_sent
FROM
`PROJECT_ID.global._Default._AllLogs`
WHERE
log_name LIKE '%vpc_flows%'
AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND JSON_VALUE(json_payload.src_instance.zone) != JSON_VALUE(json_payload.dest_instance.zone)
GROUP BY
1, 2, 3, 4
ORDER BY
total_gb_sent DESC
LIMIT 20;
Scheda di riferimento e query di Hubble CLI
Hubble CLI trasmette in streaming e filtra i dati sul flusso di rete in tempo reale direttamente dal buffer circolare del kernel GKE Dataplane V2.
Configurazione: crea un alias helper
Poiché Hubble viene eseguito all'interno del control plane del cluster, configura un alias della shell per eseguire i comandi Hubble senza eseguire il deployment di file binari locali:
alias gke-hubble="kubectl exec -it -n gke-managed-dpv2-observability deployment/hubble-relay -c hubble-cli -- hubble"
Ricette di filtraggio comuni
| Risoluzione dei problemi relativi all'obiettivo | Comando Hubble CLI |
|---|---|
| Osserva tutti i pacchetti eliminati in tempo reale nel cluster | gke-hubble observe --verdict DROPPED --follow |
| Trasmetti in streaming tutto il traffico per un pod specifico in qualsiasi spazio dei nomi | gke-hubble observe --pod default/my-pod --follow |
| Filtrare il traffico tra due spazi dei nomi specifici | gke-hubble observe --from-namespace frontend --to-namespace backend |
| Isolare il traffico su una porta specifica (ad esempio la porta 80) | gke-hubble observe --port 80 |
| Esaminare le query e le risposte DNS live | gke-hubble observe --port 53 |
| Visualizza i ripristini TCP attivi (pacchetti RST) | gke-hubble observe --type trace --verdict FORWARDED --tcp-flags RST |
| Trasmetti in streaming tutto il traffico in uscita diretto alla rete internet pubblica | gke-hubble observe --traffic-direction egress --to-identity world |
| Ispeziona il traffico a livello di applicazione HTTP (livello 7 OSI) | gke-hubble observe --protocol http |
Filtro avanzato con negazione (--not)
Puoi escludere il traffico noto ad alto volume o integro per concentrarti sulle anomalie:
# Observe drops, but exclude internal kube-system health probes and DNS
gke-hubble observe \
--verdict DROPPED \
--not --namespace kube-system \
--not --port 53
Formattazione dell'output e integrazione di jq
Per elaborare i record di flusso in modo programmatico, genera l'output in formato JSON:
# Extract only source, destination, and drop reason from the last 100 flows
gke-hubble observe --verdict DROPPED -o json --last 100 | \
jq -r '[.time, .flow.source.pod_name, .flow.destination.pod_name, .flow.drop_reason_desc] | @tsv'
Limitazioni
Quando utilizzi Hubble CLI per la risoluzione dei problemi in tempo reale, tieni presente le seguenti limitazioni tecniche:
- Buffer circolare locale temporaneo del nodo:i flussi Hubble vengono archiviati in un buffer circolare in memoria su ogni singolo nodo. Durante gli eventi con traffico elevato, i log di flusso meno recenti vengono sovrascritti in pochi secondi. Per l'analisi storica, fai affidamento al logging di NetworkPolicy e ai log di flusso VPC in Cloud Logging.
- Nessun OR logico integrato:i flag della CLI Hubble valutano più argomenti utilizzando
AND logico. Per cercare più condizioni (ad esempio Porta 80 O Porta 443),
esegui comandi separati o filtra l'output JSON utilizzando
jq.
Passaggi successivi
- Best practice per l'osservabilità della rete
- Risolvere i problemi di networking di GKE
- Risolvere i problemi di connettività nel cluster
- Informazioni sull'osservabilità di GKE Dataplane V2
- Risolvere i problemi relativi ai dati in Flow Analyzer