Agente de mascaramento de IP

Nesta página, você vê como o mascaramento de IP funciona no GKE e as opções de configuração do agente relacionado.

Visão geral

O mascaramento de IP é uma forma de conversão de endereços de rede (NAT, na sigla em inglês) de muitos endereços IP para um. Com ela, vários clientes podem acessar um destino usando um endereço IP. Um cluster do GKE usa o mascaramento de IP para que destinos fora do cluster recebam apenas pacotes de endereços IP do nó, e não do pod. Isso é útil em ambientes que precisam receber somente pacotes de endereços IP do nó.

Veja nas seções a seguir como configurar o mascaramento de IP no cluster do GKE.

Antes de começar

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

Defina configurações gcloud padrão usando um dos métodos a seguir:

  • Use gcloud init se você quer orientações para definir os padrões.
  • Use gcloud config para definir separadamente a região, a zona e o ID do projeto.

Como usar o gcloud init

  1. Execute gcloud init e siga as instruções:

    gcloud init

    Se você usa o SSH em um servidor remoto, utilize a sinalização --console-only para impedir que o comando inicie um navegador:

    gcloud init --console-only
  2. Siga as instruções para autorizar a gcloud a usar sua conta do Google Cloud.
  3. Crie uma nova configuração ou selecione uma atual.
  4. Escolha um projeto do Google Cloud.
  5. Escolha uma zona padrão do Compute Engine.

Como usar o gcloud config

  • Defina o ID do projeto padrão:
    gcloud config set project project-id
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone compute-zone
  • Se você estiver trabalhando com clusters regionais, defina a região do Compute padrão:
    gcloud config set compute/region compute-region
  • Atualize gcloud para a versão mais recente:
    gcloud components update

Mascaramento no GKE

O GKE usa as regras iptables com o DaemonSet ip-masq-agent para alterar o endereço IP de origem dos pacotes enviados dos pods a determinados destinos. Quando um pod envia um pacote para um endereço IP de destino em um intervalo mascarado especificado, o endereço IP do nó é usado como o de origem do pacote, em vez do endereço IP do pod.

O GKE executa o mascaramento de IP para todos os destinos, exceto:

  • Se ip-masq-agent estiver instalado no cluster, e você tiver definido o próprio nonMasqueradeCIDRs no ConfigMap do ip-masq-agent, o GKE manterá os endereços IP de origem como endereços IP do pod dos pacotes enviados aos destinos especificados em nonMasqueradeCIDRs.

  • Se ip-masq-agent não estiver instalado, ou se nenhum CIDR for especificado em nonMasqueradeCIDRs, o GKE manterá os endereços IP de origem dos pacotes enviados a um conjunto de destinos não mascarados padrão. Esses padrões dependem da versão do GKE e do tipo de imagem do nó.

Você encontra mais informações no Guia de usuário do agente de mascaramento de IP (em inglês) na documentação do Kubernetes.

Quando ip-masq-agent é incluído

O DaemonSet ip-masq-agent é instalado automaticamente com o argumento --nomasq-all-reserved-ranges no cluster do GKE se um ou mais dos itens a seguir forem verdadeiros:

  • O cluster tem uma política de rede.
  • O intervalo CIDR do pod não está dentro de 10.0.0.0/8

Especifique nonMasqueradeCIDRs no ConfigMap do ip-agent-masq para alterar os intervalos de destino. Se o cluster não incluir ip-masq-agent, instale manualmente o ip-masq-agent.

Destinos não mascarados padrão

Veja na tabela a seguir um resumo dos intervalos de destino padrão não mascarados do GKE quando nonMasqueradeCIDRs não está especificado no ConfigMap do ip-masq-agent.

Versões do GKE Tipo de imagem do nó Intervalos de destino Observações
Todas as versões Todos os tipos de imagens 169.254.0.0/16
(intervalo de link-local)
Defina masqLinkLocal como True no ConfigMap do ip-masq-agent para alterar esse comportamento.
Versões anteriores à versão 1.14 Container-Optimized OS com o containerd (cos_containerd)
ou ip-masq-agent com o argumento --nomasq-all-reserved-ranges no início dele
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
Especifique uma lista de CIDRs em nonMasqueradeCIDRs no ConfigMap do ip-masq-agent para alterar esse comportamento.
Outros tipos de imagens sem ip-masq-agent ativado 10.0.0.0/8
Versões 1.14.1-gke.14, 1.14.2-gke.1 e posteriores Todos os tipos de imagens 10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
240.0.0.0/4

Exemplo de saída iptables

Veja no exemplo a seguir uma demonstração das regras iptables na tabela NAT, conforme mantido por ip-masq-agent:

iptables -t nat -L IP-MASQ
    RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
    RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
    RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
    RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
    MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL
    

Parâmetros do ConfigMap ip-masq-agent

Com as chaves a seguir no ConfigMap do ip-masq-agent, é possível especificar intervalos de destino não mascarados e alterar o comportamento de ip-masq-agent. É preciso gravar o arquivo ConfigMap em YAML ou JSON e nomeá-lo como config.

  • nonMasqueradeCIDRs: uma lista de strings na notação CIDR que especifica os intervalos de endereços IP de destino para manter os endereços IP do pod.
  • masqLinkLocal: um valor booleano que indica se haverá mascaramento do tráfego para o prefixo link-local (169.254.0.0/16). O padrão é false.
  • resyncInterval: representa a quantidade de tempo decorrido antes de ip-masq-agent recarregar a configuração dele (gravação em /etc/config/ip-masq-agent a partir do ConfigMap). O formato é Nx, em que N é um número inteiro, e x é uma unidade de tempo como s ou ms. Se não for especificado, o padrão será 60 segundos.

Como especificar nonMasqueradeCIDRs

O seguinte ConfigMap, config, mantém o endereço de origem dos pacotes enviados a 10.0.0.0/8:

    nonMasqueradeCIDRs:
      - 10.0.0.0/8
    resyncInterval: 60s
    

Para que ip-masq-agent ative o mascaramento de IP no intervalo de link-local, defina o valor da chave masqLinkLocal como true no ConfigMap.

Por exemplo:

    nonMasqueradeCIDRs:
      - 10.0.0.0/8
    resyncInterval: 60s
    masqLinkLocal: true
    

Como adicionar um ConfigMap ao cluster

Para adicionar um ConfigMap ao cluster, execute o comando a seguir no shell ou na janela de terminal:

    kubectl create configmap [CONFIGMAP_NAME] \
    --from-file config \
    --namespace kube-system
    

em que:

  • [CONFIGMAP_NAME] é o nome que você escolhe para o recurso ConfigMap, como ip-masq-agent.

Por exemplo:

    kubectl create configmap ip-masq-agent --from-file config --namespace kube-system
    

Quando a sincronização é concluída, as alterações aparecem em iptables:

iptables -t nat -L IP-MASQ
    Chain IP-MASQ (1 references)
    target     prot opt source               destination
    RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
    RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local */
    MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL
    

Como criar um recurso ip-masq-agent manualmente (opcional)

Talvez você precise criar e configurar ip-masq-agent manualmente. Para fazer isso, é preciso implantar um recurso ip-masq-agent no cluster.

Primeiro, salve o seguinte código localmente em um arquivo chamado ip-masq-agent.yaml.

    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    spec:
      template:
        metadata:
          labels:
            k8s-app: ip-masq-agent
        spec:
          hostNetwork: true
          containers:
          - name: ip-masq-agent
            image: gcr.io/google-containers/ip-masq-agent-amd64:v2.4.1
            args:
                - --masq-chain=IP-MASQ
                # To non-masquerade reserved IP ranges by default, uncomment the line below.
                # - --nomasq-all-reserved-ranges
            securityContext:
              privileged: true
            volumeMounts:
              - name: config
                mountPath: /etc/config
          volumes:
            - name: config
              configMap:
                # Note this ConfigMap must be created in the same namespace as the daemon pods - this spec uses kube-system
                name: ip-masq-agent
                optional: true
                items:
                  # The daemon looks for its config in a YAML file at /etc/config/ip-masq-agent
                  - key: config
                    path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"
    

Em seguida, execute o comando:

kubectl apply -f ip-masq-agent.yaml

Isso criará um daemonset chamado ip-masq-agent que será executado em todos os nós do cluster.

Para configurar a ferramenta ip-masq-agent, consulte Como configurar o agente usando um ConfigMap.

A seguir