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 update
para 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-agent
DaemonSet. - Verifique o recurso
ip-masq-agent
ConfigMap.
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_NAME
Substitua
CLUSTER_NAME
pelo nome do seu cluster.Pesquise o
ip-masq-agent
no espaço de nomeskube-system
:kubectl get daemonsets/ip-masq-agent -n kube-system
Se o
ip-masq-agent
DaemonSet 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> 13d
Se o
ip-masq-agent
DaemonSet não existir, o resultado é semelhante ao seguinte:Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
Verifique se o
ip-masq-agent
DaemonSet 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-agent
DaemonSet existir, pode ver o registo do DaemonSet na tabela. Se oip-masq-agent
DaemonSet 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_NAME
Substitua
CLUSTER_NAME
pelo nome do seu cluster.Descreva o
ip-masq-agent
ConfigMap no espaço de nomeskube-system
:kubectl describe configmaps/ip-masq-agent -n kube-system
Se o
ip-masq-agent
ConfigMap 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-agent
nã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-agent
ConfigMap existir, pode ver o registo ConfigMap na tabela. Se oip-masq-agent
ConfigMap 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_TIME
Substitua o seguinte:
CIDR_1
eCIDR_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 à listanonMasqueradeCIDRs
seguindo o mesmo formato. No mínimo, a propriedadenonMasqueradeCIDRs
deve 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-agent
Pod verifica o conteúdo doip-masq-agent
ConfigMap e escreve quaisquer alterações no respetivo ficheiro/etc/config/ip-masq-agent
local. 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
masqLinkLocal
como 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_PATH
Substitua
LOCAL_CONFIG_FILE_PATH
pelo caminho para o ficheiro de configuração que criou no passo anterior.Descreva o
ip-masq-agent
ConfigMap no espaço de nomeskube-system
:kubectl describe configmaps/ip-masq-agent -n kube-system
O 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
config
com as alterações de configuração. Já pode implementar oip-masq-agent
DeamonSet.
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-system
Edite 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-system
Substitua o seguinte:
CIDR_1
eCIDR_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.nonMasqueradeCIDRs
No mínimo, a propriedadenonMasqueradeCIDRs
deve 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-agent
Pod verifica o conteúdo doip-masq-agent
ConfigMap e escreve quaisquer alterações no respetivo ficheiro/etc/config/ip-masq-agent
local. 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
masqLinkLocal
como 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-agent
ConfigMap no espaço de nomeskube-system
:kubectl describe configmaps/ip-masq-agent -n kube-system
O 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
config
que 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-volume
que é 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
volumeMount
nome do contentor.O nome do ConfigMap tem de corresponder ao nome
configMap
referenciado no volumeconfig-volume
no 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 chaveconfig
no ConfigMap.Se usar intervalos de IP reservados não mascarados por predefinição, descomente a linha
- --nomasq-all-reserved-ranges
na secçãoarg
.
Implemente o DaemonSet:
kubectl apply -f LOCAL_FILE_PATH
Substitua
LOCAL_FILE_PATH
pelo caminho para o ficheiro que criou no passo anterior.
Pode atualizar manualmente o ip-masq-agent
DaemonSet 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-agent
especificada no DaemonSet. Se a versão doip-masq-agent
DaemonSet 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-MASQ
no nó afetado. Se ononMasqueradeCIDRs
definido 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-agent
ConfigMap:kubectl edit configmap ip-masq-agent --namespace=kube-system
Reveja a lista
nonMasqueradeCIDRs
no ConfigMap. A listanonMasqueradeCIDRs
deve estar presente e completa. Por exemplo:... nonMasqueradeCIDRs: - 35.100.0.0/16 ...
Se a lista estiver em falta ou incompleta, adicione ou modifique a
nonMasqueradeCIDRs
lista 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
nonMasqueradeCIDRs
como0.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.