Este guia ajuda a diagnosticar o motivo pelo qual as suas cargas de trabalho (pods ou VMs) não conseguem aceder a redes externas através do Cloud NAT. Como programador, interage principalmente com o recurso CloudNatGateway. O estado deste recurso é a sua principal fonte de informações fidedignas para a depuração.
Antes de começar
Para resolver problemas de uma configuração do Cloud NAT, tem de ter o seguinte:
- As funções de identidade e acesso necessárias. Peça ao administrador de IAM do projeto para lhe conceder uma ou ambas as seguintes funções:
- Visualizador do NAT na nuvem (
cloud-nat-viewer): esta função oferece acesso só de leitura aos recursos do NAT na nuvem. Esta função ajuda a começar a diagnosticar o problema. - Programador do NAT na nuvem (
cloud-nat-developer): esta função concede as autorizações necessárias aos operadores de aplicações para criar, ler, atualizar e eliminar (CRUD) objetos do NAT na nuvem nos respetivos projetos atribuídos. Esta função permite-lhe fazer muitas das correções descritas nesta página. - Podem ser necessários papéis adicionais para algumas medidas de diagnóstico e correções específicas.
- Visualizador do NAT na nuvem (
Diagnósticos iniciais
Antes de analisar os códigos de erro, certifique-se de que os recursos básicos estão presentes e acessíveis.
Comando:
kubectl get cloudnatgateway GATEWAY_NAME -n PROJECT_NAMESPACE -o yaml
Substitua o seguinte:
GATEWAY_NAME: o nome do recursoCloudNatGateway.PROJECT_NAMESPACE: o espaço de nomes do seu projeto.
Verifique as condições de estado: um gateway em bom estado tem de ter todas as seguintes condições definidas como True:
Ready: estado de saúde global.SubnetsReady: a configuração do conjunto de IPs é válida.PerimeterConfigurationReady: a infraestrutura de rede a montante está configurada.EgressRoutesReady: as políticas de encaminhamento dos seus pods estão ativas.
Se algum destes campos for False, verifique os campos reason e message na saída de estado e consulte as tabelas nas secções seguintes.
Referência e correção do código de erro
Os códigos de erro devolvidos por kubectl get cloudnatgateway enquadram-se em três categorias principais.
Erros de sub-rede (SubnetsReady é False)
Esta condição indica problemas com o conjunto de endereços IP atribuído ao gateway.
| Código de erro | Significado | Passos de remediação |
|---|---|---|
CloudNATSelectorFieldOverlapsCode |
Conflito de configuração. O workloadSelector desta entrada corresponde às mesmas cargas de trabalho que outra entrada no seu projeto. Não é possível encaminhar o tráfego de forma determinística. |
|
CloudNATSubnetRefsFieldInvalidCode |
Sub-rede inválida. A sub-rede especificada em
|
|
CloudNATSubnetAlreadyInUseCode |
Conflito de sub-rede. A sub-rede que pediu já é "detida" por outro gateway NAT da nuvem. Uma sub-rede só pode ser anexada a um gateway de cada vez. |
|
UNETAPIServerErrorCode |
Erro do sistema. O controlador não consegue comunicar com o servidor da API para validar as sub-redes. | Ação: este é provavelmente um problema temporário da plataforma. Se o problema persistir, contacte o administrador da plataforma. |
Erros de configuração do perímetro (PerimeterConfigurationReady é False)
Esta condição reflete o estado dos gateways de perímetro.
| Código de erro | Significado | Passos de remediação |
|---|---|---|
NET-E0305 |
Conflito de configuração. (O mesmo que acima). Os seletores sobrepostos impedem o sistema de calcular o grupo de encaminhamento correto. |
|
NET-E0301 |
Esgotamento de recursos / falha do nó. O sistema criou a configuração, mas não conseguiu atribuir os seus IPs de saída a um nó físico em bom estado. Normalmente, isto significa que a sub-rede está sem IPs ou que os nós de gateway estão inativos. |
|
NET-E0001 |
Erro do sistema. Falha na comunicação do controlador. | Ação: contacte o administrador da plataforma. |
Erros de rota de saída (EgressRoutesReady é False)
Esta condição reflete o estado das políticas de encaminhamento no cluster.
| Código de erro | Significado | Passos de remediação |
|---|---|---|
NET-E0305 |
Conflito de configuração. (O mesmo que acima). |
|
NET-E0304 |
Falha de programação. O sistema não conseguiu programar as regras de encaminhamento (BPF) para os seus IPs de gateway específicos. | Ação: trata-se de um erro de programação interno ou de uma inconsistência de estado.
|
Outros problemas comuns
Se o estado do gateway for Ready: True, mas o tráfego continuar a falhar, verifique estas configurações incorretas comuns:
Autorização ao nível do projeto em falta
O seu projeto tem de estar explicitamente autorizado a enviar tráfego.
- Verifique: o recurso Project tem a etiqueta
networking.gdc.goog/enable-default-egress-allow-to-outside-the-org: "true"? - Correção: peça ao administrador do projeto para aplicar esta etiqueta.
Anotação de VM em falta (apenas para máquinas virtuais)
As VMs ignoram o caminho de saída do pod padrão e precisam de instruções explícitas para usar o Cloud NAT.
- Verifique: o objeto
VirtualMachineExternalAccess(VMEA) da sua VM tem a anotaçãoegress.networking.gke.io/use-cloud-nat: "true"? - Corrigir: adicione a anotação ao objeto VMEA.
Saída do nó do cluster padrão
Se estiver a executar um cluster padrão, os próprios nós precisam de autorização para sair.
- Verifique: o objeto
Clustertem a etiquetacluster.gdc.goog/enable-node-egress-to-outside-the-org: "true"? - Correção: peça ao administrador da plataforma para etiquetar o objeto Cluster.
Colisão entre o NAT de saída predefinido e o Cloud NAT
Ocorre um erro de configuração comum quando uma carga de trabalho está configurada para usar o mecanismo NAT de saída predefinido antigo e, simultaneamente, é selecionada por um gateway NAT da nuvem. Esta combinação resulta numa colisão em que o plano de dados recebe instruções de encaminhamento em conflito, o que leva à perda de pacotes ou a um comportamento de encaminhamento não determinístico.
Diagnostique colisões de agrupamentos
Para os pods, o NAT de saída predefinido é normalmente ativado adicionando uma etiqueta específica. Um Pod não pode ter esta etiqueta e ser segmentado por um gateway NAT da nuvem.
Identifique o Target Pod: obtenha as etiquetas do Pod que está a ter problemas de conetividade.
kubectl get pod <POD_NAME> -n <NAMESPACE> --show-labelsVerifique se existem etiquetas em conflito:
- Seleção de NAT da nuvem: as etiquetas do pod correspondem ao
workloadSelectorde qualquerCloudNatGatewayno espaço de nomes? - Etiqueta de saída predefinida: o pod tem a etiqueta
egress.networking.gke.io/enabled: "true"?
Condição: se AMBAS forem verdadeiras, tem uma colisão.
- Seleção de NAT da nuvem: as etiquetas do pod correspondem ao
Resolução: remova a etiqueta de saída predefinida antiga do pod (ou da respetiva implementação/conjunto com estado principal) para permitir que o Cloud NAT assuma o controlo exclusivo.
Diagnostique colisões de VMs
Para máquinas virtuais, o mecanismo é diferente. As VMs com objetos VirtualMachineExternalAccess (VMEA) são frequentemente configuradas para acesso predefinido. Para usar o Cloud NAT, têm de ativar explicitamente esta opção adicionando uma anotação para desativar o caminho predefinido e ativar o caminho do Cloud NAT.
Identifique o VMEA: encontre o objeto
VirtualMachineExternalAccessassociado à VM.kubectl get vmea -n <NAMESPACE>Verifique se existem anotações em falta:
- Seleção do Cloud NAT: as etiquetas da VM correspondem a um
CloudNatGateway? - Anotação de aceitação: verifique o VMEA da anotação
egress.networking.gke.io/use-cloud-nat: "true".
Condição: se a VM corresponder a um gateway, mas NÃO TIVER esta anotação, o tráfego vai entrar em conflito com o sistema de saída predefinido.
- Seleção do Cloud NAT: as etiquetas da VM correspondem a um
Resolução: adicione a anotação ao objeto VMEA.
kubectl annotate vmea <VMEA_NAME> -n <NAMESPACE> egress.networking.gke.io/use-cloud-nat="true"