Como configurar um agente de mascaramento de IP em clusters padrão

Nesta página, explicamos como configurar clusters criados no modo padrão do Google Kubernetes Engine (GKE) para executar mascaramento de IP com ip-masq-agent. Para mais informações sobre o mascaramento de IP no modo Autopilot do GKE, consulte Usar a política NAT de saída para configurar o mascaramento de IP em clusters do Autopilot.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e inicialize a gcloud CLI. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

Como verificar o status ip-masq-agent

Esta seção mostra como:

  • Determine se o 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á executando o DaemonSet ip-masq-agent, use a Google Cloud CLI ou o console Google Cloud .

gcloud

  1. Veja as credenciais do cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Substitua CLUSTER_NAME pelo nome do cluster.

  2. Pesquise ip-masq-agent no namespace kube-system:

    kubectl get daemonsets/ip-masq-agent -n kube-system
    

    Se o ip-masq-agent DaemonSet existir, a saída será semelhante a esta:

    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, a saída será semelhante a esta:

    Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
    
  3. Verifique se o DaemonSet ip-masq-agent está executando a versão mais recente:

    kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
    

    Esse comando precisa retornar a mesma imagem de contêiner especificada em Como implantar o DaemonSet ip-masq-agent.

Console

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

  2. Em Filtro , faça o seguinte:

    1. Clique em para limpar o filtro Is system object: False.
    2. Filtre as seguintes propriedades:
      • Nome: ip-masq-agent.
      • Cluster: o nome do cluster.

    Se houver um ip-masq-agent DaemonSet, você verá o registro DaemonSet na tabela. Se o ip-masq-agent DaemonSet não existir, nenhuma linha será exibida.

Para criar o ip-masq-agent ConfigMap e implantar o ip-masq-agent DaemonSet, consulte Como configurar e implantar o ip-masq-agent.

Como verificar o ip-masq-agent ConfigMap

Para verificar se o cluster está executando o ConfigMap ip-masq-agent, use a Google Cloud CLI ou o console Google Cloud .

gcloud

  1. Veja as credenciais do cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Substitua CLUSTER_NAME pelo nome do cluster.

  2. Descreva o ip-masq-agent ConfigMap no namespace kube-system:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    Se o ip-masq-agent ConfigMap existir, a saída será semelhante a esta:

    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 ip-masq-agent ConfigMap não existir, a saída será semelhante a esta:

    Error from server (NotFound): configmaps "ip-masq-agent" not found
    

Console

  1. Acesse a página Configuração no console do Google Cloud .

    Acessar as configurações

  2. Em Filtro , faça o seguinte:

    1. Clique em para limpar o filtro Is system object: False.
    2. Filtre as seguintes propriedades:
      • Nome: ip-masq-agent.
      • Cluster: o nome do cluster.

    Se o ip-masq-agent ConfigMap existir, você verá o registro do ConfigMap na tabela. Se o ip-masq-agent ConfigMap não existir, nenhuma linha será exibida.

Se o cluster já tiver o ip-masq-agent ConfigMap, será possível configurá-lo e implantá-lo.

Como configurar e implantar o ip-masq-agent

Nesta seção, mostramos como criar ou editar o ip-masq-agent ConfigMap e como implantar ou excluir o ip-masq-agent DaemonSet. Para determinar quais tarefas você precisa executar, é necessário determinar se o cluster já tem o ip-masq-agent ConfigMap e o ip-masq-agent DaemonSet.

Como criar o ip-masq-agent ConfigMap

As etapas a seguir mostram como criar o ip-masq-agent ConfigMap. Se seu cluster já tiver o ip-masq-agent ConfigMap, edite um ip-masq-agent ConfigMap.

  1. Crie um arquivo de configuração usando o modelo a seguir e salve-o localmente. Use qualquer nome para a cópia local desse arquivo de configuração.

    nonMasqueradeCIDRs:
      - CIDR_1
      - CIDR_2
    masqLinkLocal: false
    resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    

    Substitua:

    • CIDR_1 e CIDR_2: os intervalos de endereços IP estão no formato CIDR. Quando os pacotes são enviados para esses destinos, o cluster não mascara as origens de endereço IP de origem e preserva os endereços IP do pod de origem. Se você precisar de mais de dois CIDRs, adicione mais entradas à lista nonMasqueradeCIDRs seguindo o mesmo formato. No mínimo, a propriedade nonMasqueradeCIDRs precisa incluir os intervalos de endereços IP do nó e do pod do cluster.

    • SYNC_INTERVAL: quanto tempo depois que cada pod ip-masq-agent verifica o conteúdo do ip-masq-agent ConfigMap e grava todas as alterações no arquivo /etc/config/ip-masq-agent local. O padrão é 60.

    • UNIT_OF_TIME: a unidade de tempo do resyncInterval. Os valores válidos incluem s (para segundos) ou ms (para milissegundos). O padrão é s.

    Defina masqLinkLocal como falso (o padrão), a menos que você precise ativar o mascaramento de pacotes enviados para vincular endereços IPv4 locais. Para mais informações, consulte Mascaramento para destinos de link local.

  2. Criar 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 arquivo de configuração que você criou na etapa anterior.

  3. Descreva o ip-masq-agent ConfigMap no namespace kube-system:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    A saída será assim:

    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>
    
    

    Essa saída inclui o parâmetro config com as mudanças na configuração. Agora, é possível implantar o ip-masq-agent DeamonSet.

Como editar um ip-masq-agent ConfigMap

É possível modificar o conteúdo de um ip-masq-agent ConfigMap concluindo as seguintes etapas:

  1. Abra o ConfigMap em um editor de texto:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Edite o conteúdo do arquivo 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:

    • CIDR_1 e CIDR_2: os intervalos de endereços IP estão no formato CIDR. Quando os pacotes são enviados para esses destinos, o cluster não mascara as origens de endereço IP de origem e preserva os endereços IP do pod de origem. Se você precisar de mais de dois CIDRs, adicione mais entradas à lista nonMasqueradeCIDRs seguindo o mesmo formato. No mínimo, a propriedade nonMasqueradeCIDRs precisa incluir os intervalos de endereços IP do nó e do pod do cluster.

    • SYNC_INTERVAL: quanto tempo depois que cada pod ip-masq-agent verifica o conteúdo do ip-masq-agent ConfigMap e grava todas as alterações no arquivo /etc/config/ip-masq-agent local. O padrão é 60.

    • UNIT_OF_TIME: a unidade de tempo do resyncInterval. Os valores válidos incluem s (para segundos) ou ms (para milissegundos). O padrão é s.

    Defina masqLinkLocal como falso (o padrão), a menos que você precise ativar o mascaramento de pacotes enviados para vincular endereços IPv4 locais. Para mais informações, consulte Mascaramento para destinos de link local.

  3. Descreva o ip-masq-agent ConfigMap no namespace kube-system:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    A saída será assim:

    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>
    

    Essa saída inclui o parâmetro config, que corresponde ao valor de configuração do arquivo criado.

Como implantar o ip-masq-agent DaemonSet

Depois de criar ou editar o ip-masq-agent ConfigMap, implante o ip-masq-agent DaemonSet.

  1. Salve o seguinte manifesto como um arquivo:

    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"

    Esse manifesto cria um volume chamado config-volume, que é ativado conforme especificado pelo volumeMount do contêiner.

    Se você precisar editar esse manifesto, considere as seguintes condições:

    • O nome do volume pode ser qualquer um, mas precisa corresponder ao nome volumeMount do contêiner.

    • O nome do ConfigMap precisa corresponder ao nome do configMap referenciado no volume config-volume no pod.

    • O nome da cadeia (--masq-chain) precisa ser IP-MASQ. Caso contrário, o GKE não modificará as regras de mascaramento padrão.

    • Os pods do DaemonSet são lidos no arquivo ip-masq-agent. O conteúdo do arquivo ip-masq-agent é o valor da chave config no ConfigMap.

    • Se você usar intervalos de IP reservados não mascarados por padrão, remova a marca de comentário da linha - --nomasq-all-reserved-ranges na seção arg.

  2. Implante o DaemonSet:

    kubectl apply -f LOCAL_FILE_PATH
    

    Substitua LOCAL_FILE_PATH pelo caminho para o arquivo criado na etapa anterior.

É possível atualizar manualmente o DaemonSet ip-masq-agent que você criou. Para saber mais, consulte Como atualizar o DaemonSet.

Como excluir o ip-masq-agent

Nesta seção, mostramos como excluir o ip-masq-agent DaemonSet e o ip-masq-agent ConfigMap. A exclusão do ip-masq-agent não reverte as configurações de mascaramento de IP nos nós.

Como excluir o ip-masq-agent DaemonSet

Se você criou o ip-masq-agent DaemonSet manualmente, é possível excluí-lo executando o seguinte comando:

kubectl delete daemonsets ip-masq-agent -n kube-system

Como excluir o ip-masq-agent ConfigMap

Para excluir completamente o ip-masq-agent ConfigMap, execute o seguinte comando:

kubectl delete configmap ip-masq-agent -n kube-system

Solução de problemas

As seções a seguir fornecem dicas para solução de problemas.

Solução de problemas gerais

As etapas a seguir ajudam a diagnosticar problemas com o mascaramento de endereço IP:

Problema: o endereço IP do pod muda para o endereço IP do nó

Ao usar um agente de mascaramento de IP, você pode notar que o endereço IP de origem do pod usa inesperadamente o endereço IP do nó quando os pods se comunicam com destinos externos.

O problema é causado por uma lista de conversão de endereços de rede de origem (SNAT) personalizada ausente ou incompleta. Quando você usa um agente de mascaramento de IP, o SNAT padrão do cluster é usado quando o ConfigMap está ausente ou não contém uma lista nonMasqueradeCIDRs. Quando um pacote sai de um pod, o SNAT padrão muda o endereço IP de origem do IP do pod para o endereço IP interno do nó. Para saber mais sobre SNAT, consulte Agente de mascaramento de IP.

Para resolver o problema, configure uma lista de SNAT personalizada definindo uma lista nonMasqueradeCIDRs no ConfigMap ip-masq-agent:

  1. Abra o ConfigMap ip-masq-agent:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Revise a lista nonMasqueradeCIDRs no ConfigMap. A lista de nonMasqueradeCIDRs precisa estar presente e completa. Exemplo:

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. Se a lista estiver faltando ou incompleta, adicione ou modifique a lista nonMasqueradeCIDRs para incluir os intervalos de IP de destino em que você quer preservar os endereços IP de origem do pod. Essa lista também precisa incluir os endereços que você quer usar com o Cloud NAT.

    Se você não quiser que nenhum tráfego externo use SNAT, defina o campo nonMasqueradeCIDRs como 0.0.0.0/0. Exemplo:

    ...
    nonMasqueradeCIDRs:
      - 0.0.0.0/0
    ...
    

    Quando o tráfego não usa SNAT, todos os pacotes enviados dos pods retêm o endereço IP do pod como endereço IP de origem, independente do destino.

  4. Verifique o endereço IP de origem dos pacotes de saída dos seus pods. Para verificar esse endereço, faça uma captura de pacote. Se isso não for possível, verifique 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
    

A seguir