Configurar um agente de mascaramento de IP em clusters padrão

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.

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

  1. Obtenha as credenciais do seu cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Substitua CLUSTER_NAME pelo nome do seu cluster.

  2. Pesquise o ip-masq-agent no espaço de nomes kube-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
    
  3. 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

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Para 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 seu cluster.

    Se o ip-masq-agent DaemonSet existir, pode ver o registo do DaemonSet na tabela. Se o ip-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

  1. Obtenha as credenciais do seu cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Substitua CLUSTER_NAME pelo nome do seu cluster.

  2. Descreva o ip-masq-agent ConfigMap no espaço de nomes kube-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

  1. Aceda à página Configuração na Google Cloud consola.

    Aceda à configuração

  2. Para 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 seu cluster.

    Se ip-masq-agent ConfigMap existir, pode ver o registo ConfigMap na tabela. Se o ip-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.

  1. 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 e CIDR_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 nonMasqueradeCIDRs seguindo o mesmo formato. No mínimo, a propriedade nonMasqueradeCIDRs 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 cada ip-masq-agent Pod verifica o conteúdo do ip-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 incluem s (para segundos) ou ms (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.

  2. 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.

  3. Descreva o ip-masq-agent ConfigMap no espaço de nomes kube-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 o ip-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:

  1. Abra o ConfigMap num editor de texto:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. 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 e CIDR_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 propriedade nonMasqueradeCIDRs 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 cada ip-masq-agent Pod verifica o conteúdo do ip-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 incluem s (para segundos) ou ms (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.

  3. Descreva o ip-masq-agent ConfigMap no espaço de nomes kube-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.

  1. 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 volume config-volume no pod.

    • O nome da cadeia (--masq-chain) tem de ser IP-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 ficheiro ip-masq-agent é o valor da chave config no ConfigMap.

    • Se usar intervalos de IP reservados não mascarados por predefinição, descomente a linha - --nomasq-all-reserved-ranges na secção arg.

  2. 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-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:

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:

  1. Abra o ip-masq-agent ConfigMap:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Reveja a lista nonMasqueradeCIDRs no ConfigMap. A lista nonMasqueradeCIDRs deve estar presente e completa. Por exemplo:

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. 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 como 0.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.

  4. 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?