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

O mascaramento de IP é uma forma de conversão de endereços de rede (NAT, na sigla em inglês) de muitos para um, permitindo que vários clientes acessem um destino usando um único 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 de nós em vez de 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

Prepare-se para a tarefa tomando as seguintes medidas:

  • Verifique se você ativou a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Verifique se o SDK do Cloud está instalado.
  • 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, 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 com o argumento --nomasq-all-reserved-ranges no cluster do GKE, se um ou mais dos seguintes itens 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

É possível alterar os intervalos de destino especificando nonMasqueradeCIDRs no ConfigMap ip-agent-masq. 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.
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

O exemplo a seguir demonstra as 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

As seguintes chaves no ConfigMap ip-masq-agent permitem que você especifique intervalos de destino não mascarados e altere o comportamento de . É preciso escrever 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 preservação de endereços 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 sua configuração (gravar 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, 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 de IP para o 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ê escolher 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 seu 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