Agente de mascaramento de IP

Nesta página, explicamos como o mascaramento de IP do GKE funciona e as opções de configuração do agente de mascaramento de IP.

Visão geral

Mascaramento de IP é uma forma de conversão de endereços de rede (NAT, na sigla em inglês) usada para realizar conversões de endereço IP de muitos para um, o que permite a vários clientes acessar um destino usando um único endereço IP. Um cluster do GKE usa o mascaramento de IP para que destinos fora do cluster só recebam pacotes de endereços IP do nó, e não dos endereços IP do pod. Isso é útil em ambientes que esperam receber somente pacotes de endereços IP de nós.

As seções a seguir descrevem 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 as configurações padrão da gcloud usando um dos métodos a seguir:

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

Como usar o gcloud init

Se você receber o erro One of [--zone, --region] must be supplied: Please specify location, conclua esta seção.

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

    gcloud init

    Se você estiver usando 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

Como mascarar no GKE

O GKE usa as regras iptables, juntamente com o DaemonSet ip-masq-agent, para alterar o endereço IP de origem dos pacotes enviados dos pods para 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 endereç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 em seu cluster e você tiver definido seu próprio nonMasqueradeCIDRs no ConfigMap ip-masq-agent, o GKE vai preservar os endereços IP de origem como endereços IP do pod dos pacotes enviados para destinos especificados em nonMasqueradeCIDRs.

  • Se ip-masq-agent não estiver instalado ou se nenhum CIDR for especificado em nonMasqueradeCIDRs, o GKE vai preservar os endereços IP de origem para pacotes enviados para 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ó.

Informações adicionais estão disponíveis no Guia do usuário do agente de mascaramento de IP na documentação do Kubernetes.

Quando ip-masq-agent é incluído

O DaemonSet ip-masq-agent é instalado automaticamente como um complemento com o argumento --nomasq-all-reserved-ranges em um cluster do GKE, se uma ou mais das seguintes condições forem verdadeiras:

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

É possível alterar os intervalos de destino especificando nonMasqueradeCIDRs no ConfigMap ip-masq-agent. Se o cluster não incluir ip-masq-agent, instale manualmente ip-masq-agent.

Destinos não mascarados padrão

A tabela a seguir resume os intervalos de destino padrão não mascarados do GKE quando nonMasqueradeCIDRs não está especificado no ConfigMap 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)
Altere esse comportamento configurando masqLinkLocal como True no ConfigMap ip-masq-agent.
Versões anteriores à versão 1.14 Container-Optimized OS with containerd (cos_containerd)
ou ip-masq-agent começou com o argumento --nomasq-all-reserved-ranges
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
É possível alterar esse comportamento especificando uma lista de CIDRs em nonMasqueradeCIDRs no ConfigMap ip-masq-agent.

Consulte os intervalos válidos das redes VPC para informações sobre o uso de intervalos de endereços reservados não RFC 1918.
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

Como verificar as regras de mascaramento em iptables

Use SSH em um dos nós e execute o seguinte comando:

iptables -t nat -L IP-MASQ

Veja um exemplo de saída de um cluster que não executa o daemonset ip-masq-agent, com o pool de nós em uma versão anterior à 1.14 e usando uma imagem cos_cointainerd. Consulte a tabela na seção acima para mais detalhes:

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

As seguintes chaves no ConfigMap ip-masq-agent permitem que você especifique intervalos de destino não mascarados e altere 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 preservar endereços IP do pod.
  • masqLinkLocal: um valor booleano que indica se o tráfego deve ser mascarado com o prefixo link-local (169.254.0.0/16). O padrão é false.
  • resyncInterval: representa o tempo decorrido até ip-masq-agent recarregar a configuração (gravação em /etc/config/ip-masq-agent pelo 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, preserva o endereço de origem dos pacotes enviados para 10.0.0.0/8:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

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

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 escolhido 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 manualmente um recurso ip-masq-agent (opcional)

Talvez você precise criar e configurar ip-masq-agent manualmente. Para isso, você precisa implantar um ip-masq-agent no seu cluster.

  1. Salve o manifesto a seguir em um arquivo chamado ip-masq-agent.yaml localmente:

    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: 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"
    
  2. Execute este 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.

Restrições

Os clusters que executam ip-masq-agent têm as seguintes restrições:

  • Se você ativar a visibilidade intranó e usar ip-masq-agent configurado com o parâmetro nonMasqueradeCIDRs, o nonMasqueradeCIDRs precisará incluir o CIDR do pod. Caso contrário, talvez você tenha problemas de conectividade intranó.

A seguir