Este documento fornece instruções e procedimentos de diagnóstico para diagnosticar problemas de rede em clusters do Google Kubernetes Engine (GKE) usando a observabilidade do GKE Dataplane V2, o Hubble e o Cloud Monitoring.
Para uma visão geral da arquitetura e práticas recomendadas conceituais, consulte Práticas recomendadas para observabilidade de rede.
Árvore de decisão para solução de problemas e conceitos principais
Antes de analisar os procedimentos, use a matriz de decisão a seguir para identificar qual camada da pilha de rede do GKE provavelmente está causando seu problema e navegue até a seção correspondente.
| Sintoma ou pergunta de diagnóstico | Nível suspeito | Procedimento recomendado |
|---|---|---|
Os pods não conseguem resolver domínios externos ou serviços internos do Kubernetes (tempos limite de DNS, NXDOMAIN, SERVFAIL). |
Nível 1: pod e serviço (DNS) | Diagnosticar falhas na resolução de DNS |
| Os serviços não podem se comunicar; há tempos limite de conexão ou pacotes descartados entre os pods. | Nível 1: pod e serviço (descartes de política ou pacote) | Diagnosticar descartes de pacotes e bloqueios de NetworkPolicy |
As réplicas de carga de trabalho têm carga de tráfego desigual ou os pods registram altas taxas de redefinições de TCP (RST). |
Nível 1: pod e serviço (balanceamento de carga ou transporte) | Diagnosticar desequilíbrio de tráfego e redefinições de TCP |
| Latência geral, tempos limite intermitentes ou reinicializações de CNI em todos os nós. | Nível 2: nó e CNI (kernel) | Triagem para latência no nível do nó e gargalos da CNI |
| Os pods não podem acessar recursos fora do GKE (Cloud SQL, APIs externas ou outras VPCs). | Nível 3: VPC e roteamento | Isolar problemas de conectividade do GKE em relação à VPC ou a problemas externos |
| Precisa de simulação de caminho automatizada para verificar se as regras de firewall, rotas ou NetworkPolicies bloqueiam o tráfego. | Nível 3: VPC e roteamento (simulação) | Diagnosticar a conectividade usando os Testes de Conectividade |
| Need to identify which workloads send traffic to the internet and undergo NAT. | Nível 4: gateway externo e custo | Identificar o tráfego NAT (saída para a Internet) |
| Altos custos de transferência de dados entre zonas ou necessidade de visualizar os principais comunicadores sem escrever consultas SQL. | Nível 4: gateway externo e custo | Analisar os custos e o desempenho do tráfego do cluster usando o Flow Analyzer |
Conceitos básicos de rede
Se você não conhece o Kubernetes ou o Google Cloud networking, lembre-se destes conceitos básicos:
- eBPF (Filtro de Pacote Berkeley Estendido): uma tecnologia de sistema operacional que permite executar programas seguros de monitoramento e roteamento diretamente no kernel do Linux. O GKE Dataplane V2 usa o eBPF para rotear pacotes e aplicar NetworkPolicies com sobrecarga mínima de desempenho.
- Mascaramento de IP (SNAT): o processo de reescrever o endereço IP de origem de um pacote. Quando um pod do GKE (que tem um endereço IP particular) se comunica com a Internet ou recursos externos da VPC, o GKE mascara (reescreve) o endereço IP do pod para o endereço IP do nó para que os sistemas externos saibam como encaminhar a resposta.
- Rastreamento de conexão (Conntrack): um recurso do kernel que rastreia todas as conexões de rede ativas. Nos clusters do GKE Dataplane V2, esse rastreamento é dividido
entre duas tabelas: o conntrack padrão do kernel Linux (usado pelo
ip-masq-agent) e uma tabela conntrack gerenciada pelo Cilium e pelo GKE Dataplane V2 armazenada em um mapa eBPF. Se um nó processar muitas conexões simultâneas, qualquer uma dessas tabelas de rastreamento poderá ficar cheia (exaustão de conntrack), fazendo com que o nó descarte silenciosamente novos pacotes. - Hubble:o mecanismo de observabilidade do GKE Dataplane V2. Ele é executado no eBPF e oferece visibilidade em tempo real dos fluxos de tráfego, das quedas de pacotes e da avaliação de NetworkPolicy.
Nível 1: observabilidade de pod e serviço (aplicativo)
O nível de pod e serviço abrange a comunicação de rede entre pods, serviços e DNS do cluster. Problemas nesse nível geralmente se manifestam como tempos limite de conexão do aplicativo, falhas na resolução de nomes ou distribuição desigual de carga.
Diagnosticar falhas de resolução de DNS
Revise o escopo de diagnóstico e os pré-requisitos antes de resolver problemas de DNS:
- Área de foco:comunicação entre pods e CoreDNS ou NodeLocal DNSCache, latência de DNS, tempos limite de resolução de DNS upstream e validação de NetworkPolicy de FQDN.
- Pré-requisitos:métricas do GKE Dataplane V2 ativadas; acesso ao
kubectl. - Compatibilidade com CNI:GKE Dataplane V2 (Datapath avançado) e CNI padrão do GKE.
- Sintoma:os pods registram
dial tcp: lookup <domain>: i/o timeout,NXDOMAINou latência intermitente em chamadas de API de saída. - Objetivo:determinar se a falha de DNS se origina dentro do cluster (
kube-dnsou saturação do NodeLocal DNSCache), uma NetworkPolicy que bloqueia a porta UDP ou TCP 53 ou uma degradação da rede upstream.
Etapa 1: verificação básica de acessibilidade
Antes de resolver problemas nas camadas de DNS, verifique se o destino pode ser acessado diretamente usando o endereço IP dele de dentro do pod afetado:
# 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 a conexão por IP for bem-sucedida, mas o domínio falhar:o problema está isolado na camada de resolução de DNS. Prossiga para a etapa 2.
- Se os dois falharem:o problema é o roteamento no nível da rede ou a aplicação da política. Prossiga para Diagnosticar descartes de pacotes e bloqueios de NetworkPolicy.
Verificar o pré-preenchimento de DNS da FQDN NetworkPolicy
Se o cluster usar NetworkPolicies baseadas em FQDN (FQDNNetworkPolicy), verifique se o nome de domínio está explicitamente permitido. Se um pod consultar um domínio externo que não está pré-preenchido no cache do proxy DNS do GKE Dataplane V2 ou não é permitido pela política, o GKE Dataplane V2 vai bloquear o tráfego de saída para o endereço IP resolvido:
# 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"
Etapa 2: verificar as métricas de DNS no Cloud Monitoring
O GKE expõe métricas de DNS integradas no Cloud Monitoring com o prefixo kubernetes.io/networking/dns/.
Para verificar as métricas de DNS no Cloud Monitoring, faça o seguinte:
- No Google Cloud console, acesse Cloud Monitoring > Painéis.
- Selecione o painel predefinido Observabilidade do DNS do GKE: visualização do cluster ou navegue até o Metrics Explorer e filtre por
kubernetes.io/networking/dns/. - Avalie os seguintes indicadores principais (para o NodeLocal DNSCache, substitua
kubednspornode_local_dnsno caminho da métrica):
| Nome da métrica | Limite de alerta | Causa raiz |
|---|---|---|
kubernetes.io/networking/dns/kubedns/max_concurrent_rejected_request_count |
> 0 | Limite de consultas simultâneas atingido. kube-dns ou o NodeLocal DNSCache está descartando consultas. |
kubernetes.io/networking/dns/kubedns/dns_request_latencies |
p99 > 100ms | Alta latência de resolução de DNS de ponta a ponta em kube-dns ou NodeLocal DNSCache. |
kubernetes.io/networking/dns/kubedns/forwarding_request_latencies |
p99 > 100ms | Latência ou saturação do servidor DNS upstream. |
Sequência de triagem de desempenho e tempo limite de DNS
Siga esta sequência de triagem para diagnosticar latência de DNS, falhas de cache e tempos limite upstream:
- Verifique a proporção de ocorrência em cache:consulta
kubernetes.io/networking/dns/kubedns/dns_cache_request_count(ounode_local_dns/dns_cache_request_count) agrupada pelo rótulocache_status. Secache_status="hit"for baixo ecache_status="miss"for alto, talvez os aplicativos estejam emitindo consultas não FQDN (comomy-serviceem vez demy-service.default.svc.cluster.local), causando travessia de caminhos de pesquisa em todas as entradas em/etc/resolv.conf. - Avalie a latência upstream:um valor alto de
forwarding_request_latenciesindica problemas com o servidor DNS upstream (por exemplo, DNS corporativo local alcançado pelo Cloud Interconnect ou pela Cloud VPN, ou limites do Cloud DNS). Auditar substituições de DNS personalizadas:inspecione os ConfigMaps
kube-dnspersonalizados para stubs ou encaminhamentos upstream mal configurados:kubectl get configmap kube-dns -n kube-system -o yaml
Etapa 3: transmitir tráfego DNS ao vivo com a CLI do Hubble
Use o alias auxiliar da CLI do Hubble para inspecionar solicitações e respostas de DNS em tempo real transmitidas do kernel do nó:
# 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
Etapa 4: validar a correção
Se ocorreram rejeições de consultas simultâneas, aplique o NodeLocal DNSCache para absorver
buscas DNS de alta frequência diretamente no nó sem atingir os limites
kube-dns em todo o cluster:
# Verify NodeLocal DNSCache DaemonSet is running
kubectl get daemonset node-local-dns -n kube-system
Diagnosticar quedas de pacotes e bloqueios de NetworkPolicy
Revise o escopo de diagnóstico e os pré-requisitos antes de investigar descartes de pacotes e negações de políticas:
- Área de foco:quedas de tráfego entre objetos de pod ou entre objetos de pod e serviço, aplicação de NetworkPolicy, motivos de queda de eBPF do kernel.
- Pré-requisitos:observabilidade de fluxo do GKE Dataplane V2 ativada e registro em log do NetworkPolicy configurado.
- Compatibilidade com CNI:somente GKE Dataplane V2.
- Sintoma:as tentativas de conexão do aplicativo falham com
Connection timed outouConnection reset by peer. - Objetivo:identificar o motivo exato da NetworkPolicy ou do eBPF para descartar pacotes sem mudanças por tentativa e erro nas políticas de segurança.
Etapa 1: monitorar as métricas de queda do Hubble
Quando o GKE Dataplane V2 descarta um pacote, ele emite a métrica hubble_drop_total
marcada com o motivo do descarte e os metadados de origem e destino. Para monitorar as métricas de queda do Hubble, faça o seguinte:
Se ainda não estiver configurado, implante um recurso
PodMonitoringdo Google Cloud Managed Service para Prometheus para coletar métricas do 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: 30sExecute a consulta a seguir em Cloud Monitoring > Metrics Explorer para ver as quedas por motivo:
sum by (reason) (rate(hubble_drop_total[5m])) > 0Interprete os códigos
reasoncomuns:Policy denied: uma NetworkPolicy do Kubernetes está bloqueando a conexão de forma explícita ou implícita.CT: Map insertion failed: a tabela de rastreamento de conexão (conntrack) está esgotada.Unsupported L3 protocol: pacote não IPv4 ou IPv6 ou cabeçalho corrompido.
Etapa 2: verificar os registros do NetworkPolicy no Cloud Logging
O registro do NetworkPolicy exporta registros JSON estruturados para todas as decisões de política. Para consultar os registros do NetworkPolicy no Cloud Logging, faça o seguinte:
- No console do Google Cloud , acesse Cloud Logging > Análise de registros.
Execute a seguinte consulta:
resource.type="k8s_node" log_name:"projects/PROJECT_ID/logs/events" jsonPayload.connection.verdict="DENY" jsonPayload.src.pod_name="my-source-pod"Inspecione o payload JSON:
jsonPayload.drop_reason: mostra por que o pacote foi descartado.jsonPayload.policies: lista quais NetworkPolicies foram avaliadas. Se uma lista vazia for retornada com um vereditoDENY, o namespace estará operando no modo de negação padrão, e nenhuma política permitiu o tráfego.
Se nenhum registro do NetworkPolicy aparecer, verifique se a geração de registros está ativada no recurso personalizado NetworkLogging do cluster. Por exemplo, verifique se o campo
spec.cluster.deny.log está definido como true:
kubectl get networklogging default -o yaml
Etapa 3: rastrear descartes ativos com a CLI do Hubble
Transmita descartes ao vivo diretamente usando a CLI do Hubble para inspecionar pacotes em tempo real:
gke-hubble observe --verdict DROPPED --namespace default --follow
Exemplo de saída:
TIMESTAMP SOURCE DESTINATION TYPE VERDICT
10:14:22.102 default/frontend default/backend:80 to-stack DROPPED (Policy denied by NetworkPolicy: backend-deny-all)
A saída indica a NetworkPolicy exata que está bloqueando o tráfego
(backend-deny-all).
Etapa 4: verificar se há esgotamento do conntrack
Se o motivo da queda indicar CT: Map insertion failed:
Inspecione o registro do agente do GKE Dataplane V2 para verificar a saturação da tabela conntrack:
kubectl logs -n kube-system daemonset/anetd -c cilium-agent --tail=100 | grep "Conntrack table full"Verifique o tamanho máximo da tabela conntrack no nó afetado:
kubectl exec -it -n kube-system daemonset/anetd -c cilium-agent -- cilium status --all-controllers | grep -i conntrackSe a tabela conntrack estiver cheia, escalonar horizontalmente horizontalmente suas cargas de trabalho em mais nós ou reduza a taxa de conexão dos pods de cliente.
Diagnosticar desequilíbrio de tráfego e redefinições de TCP
Revise o escopo do diagnóstico e os pré-requisitos antes de resolver problemas de desequilíbrio de tráfego e redefinições de conexão:
- Área de foco:desigualdade no balanceamento de carga, falhas no handshake TCP, encerramento repentino da conexão.
- Pré-requisitos:métricas do GKE Dataplane V2 ativadas.
- Compatibilidade com CNI:GKE Dataplane V2.
- Sintoma:algumas réplicas de pod recebem tráfego excessivo, enquanto outras
permanecem inativas. Os aplicativos cliente registram
connection reset by peeroubroken pipe. - Objetivo:determinar se o desequilíbrio de tráfego é causado pela fixação de conexão na camada de transporte (camada 4 do OSI, TCP) em vez da camada de aplicativo (camada 7 do OSI, HTTP/2 ou gRPC) e identificar a origem dos pacotes TCP RST.
Etapa 1: comparar o fluxo de tráfego no nível do pod
Para determinar se o tráfego está distribuído de maneira uniforme entre as réplicas, faça o seguinte:
No Cloud Monitoring, consulte a contagem de fluxo de entrada em todos os pods de uma implantação:
sum by (pod) (rate(pod_flow_ingress_flows_count{destination_workload="my-service"}[5m]))Avalie a distribuição de tráfego entre os pods. Se um único pod receber a maioria do tráfego, investigue a reutilização de conexões ou sessões fixas:
- gRPC ou HTTP/2:conexões TCP de longa duração fazem com que todas as solicitações percorram um único fluxo TCP para um pod de back-end. O roteamento de serviços do Kubernetes na camada de transporte (camada 4 do OSI, TCP) não pode balancear solicitações em uma conexão HTTP/2 estabelecida.
- Afinidade de sessão ClientIP:verifique se o serviço está configurado com
sessionAffinity: ClientIP. - Serviços sem comando:os clientes podem resolver o DNS uma vez e armazenar em cache o único endereço IP permanentemente.
Etapa 2: analisar as métricas de redefinição de TCP
As redefinições de TCP (RST) encerram as conexões imediatamente. Eles são emitidos pelo
kernel do sistema operacional quando um endpoint recebe um pacote para uma porta desconhecida
ou quando um aplicativo fecha uma conexão com dados não lidos no buffer.
Execute a seguinte consulta MQL no 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())
Analise os resultados da consulta para determinar a origem da redefinição:
- RST de saída (traffic_direction=
egress): o pod local está gerando a redefinição. Verifique se o aplicativo do pod está falhando, atingindo o limite de conexão ou rejeitando ativamente a conexão. - RST de entrada (traffic_direction=
ingress): o peer remoto (banco de dados externo, API ou pod remoto) enviou a redefinição. Verifique a integridade do servidor de destino e os estados do firewall.
Etapa 3: transmitir redefinições de TCP ao vivo
Use a CLI do Hubble para capturar o handshake de redefinição ativa:
gke-hubble observe --type trace --verdict FORWARDED --tcp-flags RST --namespace default
Etapa 4: correção e soluções práticas
Aplique as seguintes etapas de correção, dependendo da causa do desequilíbrio de tráfego ou das redefinições de TCP:
- Para fixação de conexão na camada de aplicativo (camada 7 do OSI) ou gRPC:
- Implante o Cloud Service Mesh para ativar o balanceamento de carga no nível da solicitação da camada de aplicativo (camada 7 do OSI).
- Configure limites de conexão do lado do cliente ou tempos limite de sinal de atividade (por exemplo,
MAX_CONNECTION_AGEeMAX_CONNECTION_AGE_GRACEdo gRPC) para forçar o restabelecimento periódico da conexão.
- Para afinidade de IP do serviço:remova
service.spec.sessionAffinity, a menos que o estado do aplicativo exija isso. - Para o cache de DNS do serviço headless:verifique se os tempos de execução do aplicativo (como
JVM
networkaddress.cache.ttl) não armazenam em cache os resultados de DNS indefinidamente. - Para estouro da fila de pendências do aplicativo:quando uma fila de
escuta do aplicativo está cheia, o kernel do Linux descarta pacotes SYN recebidos ou envia um TCP
RST. Escalone horizontalmente as réplicas de pod ou aumente o backlog de escuta do aplicativo (
somaxconn).
Nível 2: observabilidade de nó e CNI (kernel)
O nível do nó e da CNI abrange o kernel do Linux do host, os programas eBPF e as interfaces de rede do nó. Os gargalos nesse nível afetam todas as cargas de trabalho em execução no nó afetado.
Verificação de integridade do sistema: detecta patches não autorizados do anetd
O GKE Dataplane V2 é executado como um DaemonSet gerenciado (anetd) no namespace kube-system. No Cloud Logging, é possível consultar registros de auditoria do Kubernetes para detectar
se usuários não autorizados ou scripts automatizados corrigiram ou reiniciaram
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 um patch não autorizado for detectado, reverta o DaemonSet para a configuração padrão ou acione uma recriação do pool de nós para restaurar o estado gerenciado.
Triagem para latência no nível do nó e gargalos da CNI
Analise o escopo de diagnóstico e os pré-requisitos antes de diagnosticar a latência no nível do nó e os gargalos do kernel:
- Área de foco:latência do kernel do host, perda de pacotes na interface da VM, saturação do agente eBPF do GKE Dataplane V2, esgotamento do conntrack.
- Pré-requisitos:métricas de VM do Compute Engine ativadas; acesso ao
kubectl. - Compatibilidade com CNI:GKE Dataplane V2 e CNI padrão do GKE.
- Sintoma:o tráfego entre nós tem picos de latência ou quedas aleatórias, enquanto o tráfego dentro do nó permanece normal.
- Objetivo:diferenciar entre a limitação de rede da VM host, as quedas do kernel do Linux e os gargalos no nível da CNI.
Etapa 1: diferenciar problemas fora e dentro do GKE
Execute o teste de comparativo de mercado de VM do Compute Engine: implante uma VM independente do Compute Engine na mesma sub-rede VPC que os nós do cluster do GKE. Teste a conectividade da VM com o destino.
- Se a VM independente tiver as mesmas quedas de pacotes ou latência:o problema está fora do GKE (firewalls da VPC, Cloud NAT, Cloud Interconnect ou o servidor externo). Acesse Isolar problemas de conectividade do GKE versus VPC ou externa.
- Se a VM independente se comunicar normalmente, mas os pods do GKE falharem:o problema está no GKE (eBPF no nível do nó, conntrack ou CNI). Prossiga para a etapa 2.
Etapa 2: diferenciar problemas de aplicativos de problemas de nós e da camada CNI
Para determinar se a latência se origina no aplicativo ou no nó e na camada de CNI, faça o seguinte:
Verifique a saturação de recursos do aplicativo:verifique se o nó não está sofrendo limitação de CPU ou pressão de memória, o que atrasa o processamento de pacotes no espaço do usuário:
kubectl top nodes kubectl top pods -n defaultInspecionar a contagem de conntrack do kernel do Linux:verifique a contagem de conntrack ativa no 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_countse aproximar denf_conntrack_max, o kernel do host vai descartar novos pacotes TCP SYN.
Etapa 3: verificar descartes de pacotes no nível da VM usando a telemetria do Compute Engine
Google Cloud O Compute Engine exporta métricas de interface de rede no nível da VM para o Cloud Monitoring.
Em Cloud Monitoring > Metrics Explorer, consulte:
sum by (drop_reason) (rate(compute_googleapis_com:instance_network_dropped_packets_count[5m]))
FQ_CODEL_DROP: pacote descartado devido à saturação da fila Fair Queuing ou CoDel (limite de largura de banda de saída da VM excedido).FIREWALL_RULE_DROP: pacote descartado por uma regra de firewall da VPC.RATE_LIMIT_DROP: pacote descartado porque a VM excedeu a cota máxima de pacotes por segundo (PPS) da interface de rede.
Etapa 4: investigar quedas no nível do kernel usando eBPF
Se as métricas no nível da VM mostrarem zero quedas, mas os pods do GKE ainda descartarem
pacotes, inspecione o agente do GKE Dataplane V2 (anetd) para verificar se há quedas de mapa eBPF:
kubectl logs -n kube-system daemonset/anetd -c cilium-agent --tail=200 | grep -i "drop"
Procure ct-map-insertion-failed ou fib-lookup-failed.
Nível 3: observabilidade de VPC e roteamento (rede de nuvem)
A VPC e a camada de roteamento na nuvem conectam nós do GKE a outros serviços Google Cloud , redes locais e a Internet. As falhas aqui geralmente decorrem de regras de firewall da VPC, rotas personalizadas ou configurações de gateway.
Isolar problemas de conectividade do GKE em relação à VPC ou a problemas externos
Revise o escopo de diagnóstico e os pré-requisitos antes de isolar problemas de rede externa de falhas no cluster:
- Área de foco:isolamento de limites entre o roteamento interno do Kubernetes e o roteamento de nuvem da VPC.
- Pré-requisitos:CLI gcloud e permissões para criar testes de conectividade.
- Compatibilidade com CNI:todos os clusters.
- Sintoma:os pods não conseguem se conectar a um recurso externo (por exemplo, Cloud SQL, uma API local ou um endpoint de terceiros).
- Objetivo:determinar rapidamente se a queda ocorre no nó do GKE ou dentro da Google Cloud VPC ou rede externa.
Etapa 1: o teste de comparativo de mercado de VM do Compute Engine
Para implantar uma VM de referência e avaliar se o problema persiste fora do GKE, faça o seguinte:
Implante uma instância de VM temporária do Compute Engine na mesma sub-rede e zona da VPC que seu pool de nós do GKE:
gcloud compute instances create gke-baseline-tester \ --zone=us-central1-a \ --subnet=gke-subnet \ --machine-type=e2-microConecte-se à instância usando SSH e teste a conectividade com o destino:
curl -v --connect-timeout 5 https://api.example.comAvalie o resultado:
- Se a VM do Compute Engine não conseguir se conectar:o problema está na VPC ou na rede externa (regras de firewall, tabelas de roteamento, esgotamento de IP do Cloud NAT ou inclusão de IP externo em uma lista de permissões).
- Se a VM do Compute Engine se conectar:o problema está no GKE (NetworkPolicy bloqueando o tráfego de saída, CIDR do pod não mascarado ou DNS no nível do contêiner).
Etapa 2: executar um teste de conectividade sob demanda
Execute um teste de Google Cloud Testes de conectividade da VM do nó para o destino:
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
Verifique o resultado no console Google Cloud para identificar se uma regra de firewall ou rota da VPC está interrompendo o tráfego.
Diagnosticar a conectividade usando testes de conectividade
Os Testes de conectividade simulam caminhos de pacotes em recursos do GKE e da VPC sem enviar tráfego ativo. Essa simulação avalia a resolução de DNAT de ClusterIP do serviço para pod, as regras de entrada e saída do NetworkPolicy do GKE Dataplane V2 e o mascaramento de IP do nó (SNAT). Revise o escopo de diagnóstico e os pré-requisitos antes de executar simulações de caminhos automatizadas:
- Área de foco:simulação automatizada de caminhos estáticos para pods, serviços, NetworkPolicies e rotas de VPC do GKE.
- Pré-requisitos:Network Intelligence Center e API Management ativados.
- Compatibilidade com CNI:GKE Dataplane V2 (análise avançada).
- Sintoma:quedas inexplicáveis de conectividade em que todas as configurações parecem válidas após inspeção manual.
- Objetivo:simular e rastrear estaticamente todo o caminho do pacote de uma origem do pod até o destino, identificando a linha exata da política que causa uma queda.
Cenário A: verificar se uma NetworkPolicy do GKE está bloqueando a coleta de métricas
Ao extrair métricas de pods em um namespace seguro, os coletores do Google Cloud Managed Service para Prometheus podem ser bloqueados por uma NetworkPolicy de negação padrão:
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
Inspecione o rastreamento de teste no console do Google Cloud . Se o teste terminar na etapa
GKE Network Policy evaluation com DROP, uma regra de entrada precisará ser adicionada para
permitir o tráfego dos pods do coletor.
Cenário B: verificar a capacidade de acesso a um serviço do GKE
Simule a capacidade de acesso de uma VM cliente a um serviço interno do Kubernetes:
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
O trace simulado mostra:
- Correspondência de rota da VPC.
- Permissão de entrada e saída do firewall da VPC.
- Chegada ao nó do GKE.
- DNAT de serviço para endereço IP do pod de back-end.
- Avaliação da NetworkPolicy de entrada no pod de back-end.
Cenário C: diagnosticar problemas de saída de pod para a Internet
Quando os pods não conseguem acessar uma API externa na Internet:
Crie um teste do pod para o endereço IP público externo (como
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=UDPExamine o ponto de soltar:
- Descartado na NetworkPolicy:o pod não tem uma NetworkPolicy de saída
que permita o tráfego para
0.0.0.0/0. - Descartado no firewall da VPC:uma regra de firewall da VPC nega o tráfego de saída da sub-rede do nó.
- Descartado no Cloud NAT ou na rota:a sub-rede não tem uma rota padrão para o gateway de Internet ou o Cloud NAT não está configurado para a sub-rede.
- Descartado na NetworkPolicy:o pod não tem uma NetworkPolicy de saída
que permita o tráfego para
Nível 4: observabilidade de gateway externo e custo (Internet e NAT)
O nível do gateway externo gerencia o tráfego de saída para destinos da Internet pública usando o Cloud NAT ou gateways externos. A capacidade de observação nesse nível ajuda a identificar cargas de trabalho de alta saída e controlar os custos de transferência de dados.
Identificar o tráfego NAT (saída para a Internet)
Confira o escopo de diagnóstico e os pré-requisitos antes de analisar o tráfego de saída da Internet e de NAT:
- Área de foco:tráfego de saída da Internet, utilização de portas do Cloud NAT e custos de transferência de dados externos.
- Pré-requisitos:a observabilidade de fluxo do GKE Dataplane V2 precisa estar ativada.
- Compatibilidade com CNI:GKE Dataplane V2.
- Sintoma:erros de esgotamento de porta do Cloud NAT ou custos de saída da Internet inesperadamente altos.
- Objetivo:identificar quais objetos específicos de pod e serviço do GKE estão transmitindo tráfego para endpoints externos da Internet.
Etapa 1: entender os conceitos "to-stack" e "world" no GKE Dataplane V2
No GKE Dataplane V2:
world: representa qualquer destino fora do cluster do GKE e da VPC (a Internet pública).to-stack: representa pacotes que fazem a transição da interface veth do contêiner eBPF para a pilha de rede Linux do host para passar pelo mascaramento de IP (SNAT) antes de chegar ao Cloud NAT.
Etapa 2: transmitir e filtrar o tráfego NAT com a CLI do Hubble
Transmita fluxos de saída da Internet ao vivo originados do seu cluster:
# Stream egress flows heading to external internet ("world")
gke-hubble observe \
--traffic-direction egress \
--verdict FORWARDED \
--to-identity world \
--follow
Exemplo de saída:
TIMESTAMP SOURCE DESTINATION TYPE VERDICT
10:25:01.120 default/worker-pod 142.250.190.46:443 to-stack FORWARDED
Para identificar os principais falantes de saída, também é possível transmitir a saída JSON do Hubble para
jq e contar os fluxos de saída externos por 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
Etapa 3: monitorar o tráfego externo usando métricas
No Cloud Monitoring, acompanhe o volume de fluxos externos:
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())
Analisar os custos e a performance do tráfego do cluster usando o Flow Analyzer
Revise o escopo do diagnóstico e os pré-requisitos antes de visualizar os fluxos de tráfego e os custos entre zonas:
- Área de foco:custos de transferência de dados entre zonas, principais comunicadores, visibilidade do tráfego entre nós sem consultas SQL.
- Pré-requisitos:registros de fluxo de VPC ativados com
INCLUDE_ALL_METADATA; visibilidade intranós ativada; Análise de Observabilidade ativada no bucket de registros. - Compatibilidade com CNI:todos os clusters.
- Sintoma:aumento nas cobranças de transferência de dados entre zonas nas faturas mensais de Google Cloud .
- Objetivo:identificar visualmente quais cargas de trabalho do GKE estão gerando tráfego entre zonas e otimizar o posicionamento sem consultar registros brutos.
Pré-requisitos
Para usar o Flow Analyzer no GKE:
- Registros de fluxo de VPC:precisam ser ativados na sub-rede do cluster com
metadata="INCLUDE_ALL_METADATA". - A visibilidade intranós precisa estar ativada no cluster para que o tráfego de pod para pod seja exposto ao pipeline de registros de fluxo da VPC.
- Análise de dados de registros:o bucket
_Defaultno Cloud Logging precisa ser atualizado para usar a Análise de observabilidade.
Etapa 1: identificar os principais tráfegos do GKE no Flow Analyzer
Para ver cargas de trabalho de alto volume no Flow Analyzer, faça o seguinte:
- No console do Google Cloud , acesse a página Flow Analyzer.
- Clique em Bucket de origem e selecione o bucket de registros que contém os registros de fluxo. A menos que você os tenha encaminhado para outro lugar, esse é o bucket _Default.
- Em Agregação de tráfego, selecione Origem - Destino.
- Defina o período da janela de análise.
- Em Organizar fluxos por, selecione os campos de pod ou carga de trabalho do GKE.
- Clique em Executar nova consulta. O gráfico Fluxos de dados mais altos mostra quais cargas de trabalho movem mais dados.
Etapa 2: analisar os custos de tráfego entre zonas
O tráfego entre zonas gera cobranças de transferência de dados. Para localizar cargas de trabalho transmitindo entre zonas:
- Em Organizar fluxos por, selecione os campos de zona de origem e zona de destino.
- Clique em Executar nova consulta e leia a tabela Todos os fluxos de dados. As linhas em que as zonas de origem e destino são diferentes representam seu tráfego entre zonas. Os filtros do Flow Analyzer correspondem a valores. Portanto, não é possível filtrar por "diferente". Em vez disso, compare os pares de zonas nos resultados.
- Expanda um par de zonas de alto volume para ver as cargas de trabalho do GKE de origem e destino.
Remediação:
- Implemente
topologySpreadConstraintsoupodAffinitydo Kubernetes para colocar serviços de comunicação na mesma zona de disponibilidade. - Ative o Roteamento ciente de topologia (
service.kubernetes.io/topology-mode: Auto) no serviço para manter o tráfego na zona de origem.
Etapa 3: detalhar a análise de observabilidade (para consultas SQL avançadas)
No Flow Analyzer, clique em Ver na Análise de dados de registros para executar consultas SQL nos dados de fluxo.
A consulta SQL a seguir calcula os principais comunicadores de pods entre zonas:
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;
Referência da CLI do Hubble e folha de referência de consultas
A CLI do Hubble transmite e filtra dados de fluxo de rede em tempo real diretamente do buffer de anel do kernel do GKE Dataplane V2.
Configuração: criar um alias auxiliar
Como o Hubble é executado no plano de controle do cluster, configure um alias de shell para executar comandos do Hubble sem implantar binários locais:
alias gke-hubble="kubectl exec -it -n gke-managed-dpv2-observability deployment/hubble-relay -c hubble-cli -- hubble"
Receitas de filtragem comuns
| Objetivo de solução de problemas | Comando da CLI do Hubble |
|---|---|
| Observe todos os pacotes descartados em tempo real no cluster | gke-hubble observe --verdict DROPPED --follow |
| Transmitir todo o tráfego de um pod específico em qualquer namespace | gke-hubble observe --pod default/my-pod --follow |
| Filtrar o tráfego entre dois namespaces específicos | gke-hubble observe --from-namespace frontend --to-namespace backend |
| Isolar o tráfego em uma porta específica (como a porta 80) | gke-hubble observe --port 80 |
| Inspecionar consultas e respostas de DNS ativas | gke-hubble observe --port 53 |
| Ver redefinições de TCP ativas (pacotes RST) | gke-hubble observe --type trace --verdict FORWARDED --tcp-flags RST |
| Transmitir todo o tráfego de saída para a Internet pública | gke-hubble observe --traffic-direction egress --to-identity world |
| Inspecionar o tráfego da camada de aplicativo HTTP (camada 7 do OSI) | gke-hubble observe --protocol http |
Filtragem avançada com negação (--not)
Você pode excluir tráfego conhecido de alto volume ou normal para se concentrar em anomalias:
# Observe drops, but exclude internal kube-system health probes and DNS
gke-hubble observe \
--verdict DROPPED \
--not --namespace kube-system \
--not --port 53
Formatação de saída e integração do jq
Para processar registros de fluxo de maneira programática, gere a saída no 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'
Limitações
Ao usar a CLI do Hubble para solução de problemas em tempo real, lembre-se das seguintes limitações técnicas:
- Buffer de anel efêmero local do nó:os fluxos do Hubble são armazenados em um buffer de anel na memória em cada nó individual. Durante eventos de alto tráfego, os registros de fluxo mais antigos são substituídos em segundos. Para análises históricas, use o registro em log do NetworkPolicy e os registros de fluxo da VPC no Cloud Logging.
- Sem OR lógico integrado:as flags da CLI do Hubble avaliam vários argumentos usando AND lógico. Para pesquisar várias condições (como "Porta 80 OU Porta 443"), execute comandos separados ou filtre a saída JSON usando
jq.
A seguir
- Práticas recomendadas para observabilidade de rede
- Resolver problemas de rede do GKE
- Resolver problemas de conectividade no cluster
- Sobre a observabilidade do GKE Dataplane V2
- Resolva problemas de dados no Flow Analyzer