Esta página explica como configurar clusters criados no modo padrão do Google Kubernetes Engine (GKE) para realizar a ocultação de IP com o ip-masq-agent. Para mais informações sobre a ocultação de IP no modo Autopilot do GKE, consulte o artigo Use a política de NAT de saída para configurar a ocultação de IP em clusters do Autopilot.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute o comando
gcloud components updatepara obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.
- Certifique-se de que tem um cluster padrão existente. Se precisar de um, crie um cluster padrão.
A verificar o estado da ip-masq-agent
Esta secção mostra como:
- Determine se o seu cluster tem um
ip-masq-agentDaemonSet. - Verifique o recurso
ip-masq-agentConfigMap.
Verifique o DaemonSet ip-masq-agent
Para verificar se o cluster está a executar o ip-masq-agent DaemonSet, use a CLI Google Cloud ou a Google Cloud consola.
gcloud
Obtenha as credenciais do seu cluster:
gcloud container clusters get-credentials CLUSTER_NAMESubstitua
CLUSTER_NAMEpelo nome do seu cluster.Pesquise o
ip-masq-agentno espaço de nomeskube-system:kubectl get daemonsets/ip-masq-agent -n kube-systemSe o
ip-masq-agentDaemonSet existir, a saída é semelhante à seguinte:NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ip-masq-agent 3 3 3 3 3 <none> 13dSe o
ip-masq-agentDaemonSet não existir, o resultado é semelhante ao seguinte:Error from server (NotFound): daemonsets.apps "ip-masq-agent" not foundVerifique se o
ip-masq-agentDaemonSet está a executar a versão mais recente:kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'Este comando tem de devolver a mesma imagem do contentor especificada em Implementar o DaemonSet ip-masq-agent.
Consola
Aceda à página Workloads na Google Cloud consola.
Para Filtro, faça o seguinte:
- Clique em para limpar o filtro Is system object: False.
- Filtre as seguintes propriedades:
- Nome:
ip-masq-agent. - Cluster: o nome do seu cluster.
- Nome:
Se o
ip-masq-agentDaemonSet existir, pode ver o registo do DaemonSet na tabela. Se oip-masq-agentDaemonSet não existir, não são apresentadas linhas.
Para criar o ip-masq-agent ConfigMap e implementar o ip-masq-agent DaemonSet,
consulte o artigo Configurar e implementar o ip-masq-agent.
Verificar o ConfigMap ip-masq-agent
Para verificar se o cluster está a executar o ip-masq-agent ConfigMap, use a CLI Google Cloud ou a Google Cloud consola.
gcloud
Obtenha as credenciais do seu cluster:
gcloud container clusters get-credentials CLUSTER_NAMESubstitua
CLUSTER_NAMEpelo nome do seu cluster.Descreva o
ip-masq-agentConfigMap no espaço de nomeskube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemSe o
ip-masq-agentConfigMap existir, a saída é semelhante à seguinte:Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>Se o ConfigMap
ip-masq-agentnão existir, o resultado é semelhante ao seguinte:Error from server (NotFound): configmaps "ip-masq-agent" not found
Consola
Aceda à página Configuração na Google Cloud consola.
Para Filtro, faça o seguinte:
- Clique em para limpar o filtro Is system object: False.
- Filtre as seguintes propriedades:
- Nome:
ip-masq-agent. - Cluster: o nome do seu cluster.
- Nome:
Se
ip-masq-agentConfigMap existir, pode ver o registo ConfigMap na tabela. Se oip-masq-agentConfigMap não existir, não são apresentadas linhas.
Se o cluster já tiver o ip-masq-agent ConfigMap, pode configurá-lo e implementá-lo.
Configurar e implementar o ip-masq-agent
Esta secção mostra como criar ou editar o ip-masq-agent
ConfigMap e como implementar ou eliminar o ip-masq-agent DaemonSet. Para determinar que tarefas tem de realizar, primeiro, tem de determinar se o seu cluster já tem o ip-masq-agent ConfigMap e o ip-masq-agent
DaemonSet.
Criar o ConfigMap ip-masq-agent
Os passos seguintes mostram como criar o ip-masq-agent ConfigMap. Se o cluster já tiver o ip-masq-agent ConfigMap, edite um ConfigMap ip-masq-agent existente.
Crie um ficheiro de configuração com o modelo seguinte e guarde-o localmente. Pode usar qualquer nome para a cópia local deste ficheiro de configuração.
nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIMESubstitua o seguinte:
CIDR_1eCIDR_2: os intervalos de endereços IP no formato CIDR. Quando os pacotes são enviados para estes destinos, o seu cluster não mascara as origens de endereços IP e preserva os endereços IP dos pods de origem. Se precisar de mais de dois CIDRs, adicione mais entradas à listanonMasqueradeCIDRsseguindo o mesmo formato. No mínimo, a propriedadenonMasqueradeCIDRsdeve incluir os intervalos de endereços IP do nó e do pod do seu cluster.SYNC_INTERVAL: a quantidade de tempo após a qual cadaip-masq-agentPod verifica o conteúdo doip-masq-agentConfigMap e escreve quaisquer alterações no respetivo ficheiro/etc/config/ip-masq-agentlocal. A predefinição é60.UNIT_OF_TIME: a unidade de tempo para o resyncInterval. Os valores válidos incluems(para segundos) oums(para milissegundos). A predefinição és.
Defina
masqLinkLocalcomo falso (predefinição), a menos que precise de ativar a ocultação para pacotes enviados para endereços IPv4 locais de ligação. Para mais informações, consulte o artigo Mascarar para destinos locais de ligação.Crie o recurso ConfigMap:
kubectl create configmap ip-masq-agent \ --namespace=kube-system \ --from-file=config=LOCAL_CONFIG_FILE_PATHSubstitua
LOCAL_CONFIG_FILE_PATHpelo caminho para o ficheiro de configuração que criou no passo anterior.Descreva o
ip-masq-agentConfigMap no espaço de nomeskube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemO resultado é semelhante ao seguinte:
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>Este resultado inclui o parâmetro
configcom as alterações de configuração. Já pode implementar oip-masq-agentDeamonSet.
Editar um ip-masq-agent ConfigMap existente
Pode modificar o conteúdo de um ip-masq-agent ConfigMap existente
concluindo os seguintes passos:
Abra o ConfigMap num editor de texto:
kubectl edit configmap ip-masq-agent --namespace=kube-systemEdite o conteúdo do ficheiro ConfigMap:
apiVersion: v1 data: config: | nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIME kind: ConfigMap metadata: name: ip-masq-agent namespace: kube-systemSubstitua o seguinte:
CIDR_1eCIDR_2: os intervalos de endereços IP no formato CIDR. Quando os pacotes são enviados para estes destinos, o seu cluster não mascara as origens de endereços IP e preserva os endereços IP dos pods de origem. Se precisar de mais de dois CIDRs, adicione mais entradas à lista seguindo o mesmo formato.nonMasqueradeCIDRsNo mínimo, a propriedadenonMasqueradeCIDRsdeve incluir os intervalos de endereços IP do nó e do pod do seu cluster.SYNC_INTERVAL: a quantidade de tempo após a qual cadaip-masq-agentPod verifica o conteúdo doip-masq-agentConfigMap e escreve quaisquer alterações no respetivo ficheiro/etc/config/ip-masq-agentlocal. A predefinição é60.UNIT_OF_TIME: a unidade de tempo para o resyncInterval. Os valores válidos incluems(para segundos) oums(para milissegundos). A predefinição és.
Defina
masqLinkLocalcomo falso (predefinição), a menos que precise de ativar a ocultação para pacotes enviados para endereços IPv4 locais de ligação. Para mais informações, consulte o artigo Mascarar para destinos locais de ligação.Descreva o
ip-masq-agentConfigMap no espaço de nomeskube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemO resultado é semelhante ao seguinte:
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>Esta saída inclui o parâmetro
configque corresponde ao valor de configuração do ficheiro que criou.
Implementar o DaemonSet ip-masq-agent
Depois de criar ou editar o ip-masq-agent ConfigMap, implemente o
ip-masq-agent DaemonSet.
Guarde o seguinte manifesto como um ficheiro YAML:
apiVersion: apps/v1 kind: DaemonSet metadata: name: ip-masq-agent namespace: kube-system spec: selector: matchLabels: k8s-app: ip-masq-agent template: metadata: labels: k8s-app: ip-masq-agent spec: hostNetwork: true containers: - name: ip-masq-agent image: gke.gcr.io/ip-masq-agent:v2.12.3-gke.4@sha256:b5db41ddaf863b660da330322714f668101482b528829c50c53229d901d11af5 args: - --v=2 - --logtostderr=false - --log_file=/dev/stdout - --log_file_max_size=0 # The masq-chain must be IP-MASQ - --masq-chain=IP-MASQ # To non-masquerade reserved IP ranges by default, # uncomment the following line. # - --nomasq-all-reserved-ranges # Must be set to false when using Dataplane V2. - --random-fully=false securityContext: privileged: false capabilities: drop: ["ALL"] add: ["NET_ADMIN", "NET_RAW"] allowPrivilegeEscalation: false seccompProfile: type: RuntimeDefault volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: ip-masq-agent optional: true items: - key: config path: ip-masq-agent tolerations: - effect: NoSchedule operator: Exists - effect: NoExecute operator: Exists - key: "CriticalAddonsOnly" operator: "Exists"
Este manifesto cria um volume denominado
config-volumeque é montado conforme especificado pelo volumeMount do contentor.Se precisar de editar este manifesto, considere as seguintes condições:
O nome do volume pode ser qualquer um, mas tem de corresponder ao
volumeMountnome do contentor.O nome do ConfigMap tem de corresponder ao nome
configMapreferenciado no volumeconfig-volumeno pod.O nome da cadeia (
--masq-chain) tem de serIP-MASQ. Caso contrário, o GKE não substitui as regras de mascaramento predefinidas.Os pods do DaemonSet leem a partir do ficheiro
ip-masq-agent. O conteúdo do ficheiroip-masq-agenté o valor da chaveconfigno ConfigMap.Se usar intervalos de IP reservados não mascarados por predefinição, descomente a linha
- --nomasq-all-reserved-rangesna secçãoarg.
Implemente o DaemonSet:
kubectl apply -f LOCAL_FILE_PATHSubstitua
LOCAL_FILE_PATHpelo caminho para o ficheiro que criou no passo anterior.
Pode atualizar manualmente o ip-masq-agentDaemonSet que criou. Para saber mais, consulte o artigo Atualizar um DaemonSet.
Eliminar o ip-masq-agent
Esta secção mostra como eliminar o ip-masq-agent DaemonSet e o ip-masq-agent ConfigMap. A eliminação do ip-masq-agent não reverte as definições de ocultação de IP existentes nos nós.
Eliminar o DaemonSet ip-masq-agent
Se criou manualmente o ip-masq-agent DaemonSet, pode eliminá-lo
executando o seguinte comando:
kubectl delete daemonsets ip-masq-agent -n kube-system
Eliminar o ConfigMap ip-masq-agent
Para eliminar completamente o ip-masq-agent ConfigMap, execute o seguinte comando:
kubectl delete configmap ip-masq-agent -n kube-system
Resolução de problemas
As secções seguintes fornecem conselhos de resolução de problemas.
Resolução de problemas gerais
Os passos seguintes ajudam a diagnosticar problemas com a ocultação de endereços IP:
- Confirme o estado do
ip-masq-agent. Se o ConfigMap não estiver definido, o tráfego para todos os destinos predefinidos não é mascarado e preserva o endereço IP do pod. O tráfego para outros destinos preserva o endereço IP do nó. - Confirme a versão da imagem
ip-masq-agentespecificada no DaemonSet. Se a versão doip-masq-agentDaemonSet não for a mais recente, siga os passos de implementação para atualizar o DaemonSet. - Verifique se a cadeia IP-MASQ está corretamente preenchida nas tabelas de IP NAT executando o comando
sudo iptables -t nat -L IP-MASQno nó afetado. Se ononMasqueradeCIDRsdefinido no ConfigMap não estiver a ser apresentado nas tabelas de IP NAT, verifique se não existem erros ortográficos no ficheiro de configuração que foi usado para criar o ConfigMap. - Confirme se o destino permite os intervalos de endereços IP do nó e do pod.
- Se o tráfego não estiver acessível a partir do nó ou do pod, execute um teste de conetividade.
Problema: o endereço IP do pod é alterado para o endereço IP do nó
Ao usar um agente de ocultação de IP, pode reparar que o endereço IP de origem do pod usa inesperadamente o endereço IP do nó quando os seus pods comunicam com destinos externos.
O problema é causado por uma lista de tradução de endereços de rede de origem (SNAT) personalizada em falta ou incompleta. Quando usa um agente de ocultação de IP, é usado o SNAT predefinido do cluster quando o ConfigMap está em falta ou não contém uma lista nonMasqueradeCIDRs. Quando um pacote sai de um Pod, o SNAT predefinido altera o endereço IP de origem do endereço IP do Pod para o endereço IP interno do nó. Para saber mais acerca do SNAT, consulte o artigo
Agente de mascaramento de IP.
Para resolver o problema, configure uma lista SNAT personalizada definindo uma lista nonMasqueradeCIDRs no ip-masq-agent ConfigMap:
Abra o
ip-masq-agentConfigMap:kubectl edit configmap ip-masq-agent --namespace=kube-systemReveja a lista
nonMasqueradeCIDRsno ConfigMap. A listanonMasqueradeCIDRsdeve estar presente e completa. Por exemplo:... nonMasqueradeCIDRs: - 35.100.0.0/16 ...Se a lista estiver em falta ou incompleta, adicione ou modifique a
nonMasqueradeCIDRslista para incluir os intervalos de IP de destino para os quais quer preservar os endereços IP do pod de origem. Esta lista também deve incluir os endereços que quer usar com o Cloud NAT.Se não quiser que nenhum tráfego externo use o SNAT, defina o campo
nonMasqueradeCIDRscomo0.0.0.0/0. Por exemplo:... nonMasqueradeCIDRs: - 0.0.0.0/0 ...Quando o seu tráfego não usa SNAT, todos os pacotes enviados a partir de pods retêm o endereço IP do pod como o respetivo endereço IP de origem, independentemente do destino.
Verifique o endereço IP de origem dos pacotes de saída dos seus pods. Para verificar este endereço, faça uma captura de pacotes. Se isso não for viável, pode verificar o endereço IP do nó, que deve ser o endereço IP de origem dos pacotes de saída sujeitos a SNAT, com o seguinte comando:
kubectl get nodes -o wide
O que se segue?
- Saiba como usar a política de NAT de saída para configurar a ocultação de IP em clusters do Autopilot.
- Saiba como criar um cluster nativo da VPC.
- Leia a vista geral da rede do GKE.
- Saiba como configurar redes autorizadas.