Com clusters do Anthos no VMware (GKE On-Prem), é possível configurar a conversão de endereços de rede de origem (SNAT) para que determinado tráfego de saída do cluster de usuário receba um endereço IP de origem previsível.
Neste documento, mostramos como configurar um gateway NAT de saída para um cluster de usuário.
Introdução
Às vezes, você tem pods em execução em um cluster de usuário que precisa enviar pacotes para componentes em execução na organização, mas fora do cluster. Projete esses componentes externos para que eles filtrem o tráfego de rede de entrada de acordo com um conjunto de endereços IP de origem conhecidos.
Veja alguns cenários:
Você tem um firewall em frente a um banco de dados que permite acesso apenas por endereço IP. E a equipe que gerencia o firewall do banco de dados é diferente da equipe que gerencia o cluster de usuário.
As cargas de trabalho no seu cluster de usuário precisam acessar uma API de terceiros pela Internet. Por motivos de segurança, o provedor da API autentica e autoriza o tráfego usando o endereço IP como a identidade.
Com um gateway NAT de saída, é possível ter um controle refinado sobre os endereços IP de origem usados para o tráfego de rede que sai de um cluster.
Preços
Não há cobrança pelo uso desse recurso durante a visualização.
Como funciona um gateway NAT de saída
Normalmente, quando um pod envia um pacote para fora do cluster, o pacote é convertido em SNAT com o endereço IP do nó em que o pod está sendo executado.
Quando um gateway NAT de saída está em vigor, é possível especificar que determinados pacotes de saída sejam enviados primeiro a um nó de gateway dedicado. A interface de rede no nó de gateway é configurada com dois endereços IP: o IP principal e um de origem de saída.
Quando um pacote selecionado para usar o gateway NAT de saída, ele sai do cluster do nó de gateway e é convertido SNAT com o endereço IP de origem de saída configurado na interface de rede.
O diagrama a seguir ilustra o fluxo de pacotes:
No diagrama anterior, é possível ver o fluxo de um pacote que é enviado do pod.
Em um nó com o endereço IP 192.168.1.1, um pod com endereço IP 10.10.10.1 gera um pacote de saída.
O pacote corresponde a uma regra de saída. Por isso, ele é encaminhado ao nó de gateway.
O nó de gateway altera o endereço IP de origem para 192.168.1.100 e envia o pacote do cluster.
O tráfego de retorno retorna ao nó de gateway com o destino 192.168.1.100.
O nó de gateway usa o conntrack para modificar o endereço IP de destino para 10.10.10.1.
O pacote é tratado como tráfego no cluster e encaminhado ao nó original e entregue de volta ao pod original.
Perfis
Este tópico se refere a dois perfis:
Administrador do cluster. Essa pessoa cria um cluster de usuário e especifica endereços IP flutuantes a serem usados pelo gateway de rede do Anthos.
Desenvolvedor. Essa pessoa executa cargas de trabalho no cluster de usuário e cria políticas de saída.
Ativar gateway NAT de saída
Esta seção é destinada aos administradores de cluster.
Para configurar um gateway NAT de saída, use os campos enableDataplaneV2
e advancedNetworking
no arquivo de configuração do cluster de usuário e crie um ou mais objetos NetworkGatewayGroup.
No arquivo de configuração do cluster, defina estes campos como true
:
enableDataplaneV2: true ... advancedNetworking: true
Especificar endereços IP flutuantes
Esta seção é destinada aos administradores de cluster.
Escolha um conjunto de endereços IP que você quer usar como endereços de origem de saída. Eles são chamados de endereços IP flutuantes, porque o Anthos Network Gateway os atribui, conforme necessário, às interfaces de rede dos nós escolhendo gateways de saída.
Os endereços IP flutuantes precisam estar na mesma sub-rede que os endereços IP do nó.
Seu conjunto de endereços IP flutuantes não pode se sobrepor ao conjunto de endereços IP especificados para seus nós.
Por exemplo, suponha que uma sub-rede tenha o intervalo de endereços 192.168.1.0/24. E suponha que você tenha escolhido usar 192.168.1.1 a 192.168.1.99 para nós. Em seguida, use 192.168.1.100 a 192.168.1.104 como endereços IP flutuantes.
Criar um objeto NetworkGatewayGroup
Esta seção é destinada aos administradores de cluster.
Veja um exemplo de manifesto para um objeto NetworkGatewayGroup:
kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: default spec floatingIPs: - 192.168.1.100 - 192.168.1.101 - 192.168.1.102 - 192.168.1.103 - 192.168.1.104
Substitua a matriz floatingIPs
pelos endereços IP flutuantes e salve o manifesto em um arquivo chamado my-ngg.yaml
.
Crie o objeto NetworkGatewayGroup:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-ngg.yaml
Exemplo de uma política de saída de NAT
Esta seção é destinada a desenvolvedores.
Aqui está um exemplo de um recurso personalizado EgressNatPolicy:
kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: alice-paul spec: sources: - namespaceSelector: matchLabels: user: alice podSelector: matchLabels: role: frontend - namespaceSelector: matchLabels: user: paul podSelector: matchLabels: role: frontend action: SNAT destinations: - cidr: 8.8.8.0/24 gatewayRef: name: default namespace: kube-system
No manifesto anterior, vemos:
Um pod é um candidato para a saída NAT se atender a um dos seguintes itens:
O pod tem o rótulo
role: frontend
e o pod está em um namespace que tem o rótulouser: alice
.O pod tem o rótulo
role: frontend
e está em um namespace que tem o rótulouser: paul
.
O tráfego de um pod candidato para um endereço no intervalo 8.8.8.0/24 é enviado para o gateway NAT de saída.
A seção
gatewayRef
determina o endereço IP de origem da saída. O recurso personalizado EgressNATPolicy usa os valoresgatewayRef.name
egatewayRef.namespace
para encontrar um objeto NetworkGatewayGroup. A política usa um dos endereços IP flutuantes do NetworkGatewayGroup como o endereço IP de origem para o tráfego de saída. Se houver vários endereços IP flutuantes no NetworkGatewayGroup correspondente, a política usará o primeiro endereço IP na lista dofloatingIPs
e ignorará os outros endereços IP. Se houver campos inválidos na seçãogatewayRef
, ocorrerá uma falha ao aplicar o objeto EgressNATPolicy.
Criar um objeto EgressNATPolicy
Crie seu próprio manifesto EgressNATPolicy. Defina metadata.name
como "my-policy"
.
Salve o manifesto em um arquivo chamado my-policy.yaml
.
Crie o objeto EgressNatPolicy:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-policy.yaml
Ver informações sobre sua política de saída de NAT
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get egressnatpolicy my-policy --output yaml kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get networkgatewaygroup --namespace kube-system --output yaml kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe egressnatpolicy my-policy
Ordem de operações
A política de saída NAT é compatível com as APIs da política de rede. A política de rede é avaliada antes da política NAT de saída. Se uma política de rede diz para descartar um pacote, o pacote é descartado, independentemente da política de saída NAT.
Várias políticas de saída
Conforme descrito anteriormente, cada EgressNATPolicy usa o primeiro endereço IP na lista floatingIPs
do NetworkGatewayGroup que corresponde a gatewayRef.name
e gatewayRef.namespace
. Se você criar várias políticas e quiser usar endereços IP diferentes, precisará criar vários objetos NetworkGatewayGroup e refere-los respectivamente. Se você criar várias políticas, o objeto gatewayRef
precisará ser exclusivo para cada política.
Uma limitação dos clusters do Anthos no VMware para esta versão é que somente o NetworkGatewayGroup que tem o nome default
no namespace kube-system
é reconciliado para alocações de IP flutuantes. Além disso, somente o NetworkGatewayGroup padrão informa o status de alocação de todos os endereços IP flutuantes.
Portanto, ao criar vários objetos NetworkGatewayGroup, verifique se os endereços IP dos objetos não padrão também estão especificados no manifesto NetworkGatewayGroup padrão. Caso contrário, eles não serão alocados como IPs flutuantes e, portanto, não podem ser usados pelo objeto EgressNATPolicies.
Para configurar várias políticas de saída e vários objetos NetworkGatewayGroup, faça o seguinte:
Verifique o objeto NetworkGatewayGroup padrão (
name: default
) comkubectl
para receber o status de alocação dos endereços IP flutuantes:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get networkgatewaygroup --name default --output yaml
A resposta de um cluster com dois nós,
worker1
eworker2
, pode ser semelhante a:kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: default spec: floatingIPs: — 192.168.1.100 — 192.168.1.101 — 192.168.1.102 status: ... floatingIPs: 192.168.1.100: worker1 192.168.1.101: worker2 192.168.1.102: worker1
Depois de verificar o status do NetworkGatewayGroup padrão, crie outros objetos NetworkGatewayGroup no namespace
kube-system
para "rastrear" cada IP flutuante.Esses novos objetos não informam o status de alocação, que está no
default
NetworkGatewayGroup.kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway1 spec: floatingIPs: — 192.168.1.100 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway2 spec: floatingIPs: — 192.168.1.101 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway3 spec: floatingIPs: — 192.168.1.102
Crie várias políticas que façam referência aos objetos "secundários" do NetworkGatewayGroup, como o
gateway1
criado na etapa anterior:kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egresspolicy1 spec: ... gatewayRef: name: gateway1 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egresspolicy2 spec: ... gatewayRef: name: gateway2 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egresspolicy3 spec: ... gatewayRef: name: gateway3 namespace: kube-system