Em jogos e aplicações peer-to-peer (P2P), os clientes frequentemente precisam de acesso direto aos pods. Em vez de atribuir um Elastic IP Address (EIP) a cada pod — o que esbarra nas cotas de EIP e complica o gerenciamento de segurança — mapeie endpoints públicos para os pods por meio de regras de DNAT do NAT gateway.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster gerenciado ACK ou cluster dedicado ACK com Terway como plugin de rede.
Um NAT gateway de Internet criado na VPC do cluster e gerenciado pelo controlador natgw.
Conhecimento sobre o funcionamento das regras de DNAT. Elas mapeiam quatro valores: IP público (um EIP no NAT gateway), porta pública (alocada automaticamente do intervalo
portRangeStart–portRangeEnde registrada no CR PodDNAT), porta privada (porta de escuta do pod definida nas anotações) e IP privado (IP do pod). As regras de DNAT associam um endereço IP público e uma porta a um endereço IP privado e uma porta.
Limitações
Compatível apenas com nós ECS padrão; não há suporte para instâncias ECI.
As entradas DNAT estão sujeitas à cota do NAT gateway. Consulte as Perguntas frequentes sobre o recurso DNAT.
Como funciona
O ack-extend-network-controller executa um subcontrolador chamado controlador natgw. Ao anotar um pod para ativar o DNAT, o controlador natgw realiza as seguintes ações:
Seleciona um EIP do pool de EIPs do NAT gateway.
Aloca uma porta pública do intervalo configurado (
portRangeStart–portRangeEnd).Cria uma entrada de encaminhamento DNAT que mapeia o IP público e a porta para o IP privado e a porta do pod.
Registra a alocação em um Custom Resource (CR)
PodDNATcom o mesmo nome do pod.
Cada regra de DNAT mapeia quatro valores: endereço IP público, porta pública, endereço IP privado e porta privada.
O controlador natgw aloca portas públicas automaticamente a partir do intervalo configurado. Dimensione esse intervalo para comportar o número máximo de pods expostos simultaneamente.
Anotações de pod
Aplique estas anotações ao modelo de pod para controlar o comportamento do DNAT.
|
Anotação |
Descrição |
|
|
Ativa o DNAT para o pod. Defina como |
|
|
Porta de escuta do pod. Separe múltiplas portas com vírgulas. Exemplo: |
|
|
Protocolo utilizado. Valores válidos: |
|
|
Habilita a persistência de configuração para contêineres com estado. |
Adicione uma regra de entrada no grupo de segurança do pod para permitir tráfego na porta exposta. Sem essa regra, o grupo de segurança descarta o tráfego DNAT.
Ative o DNAT no ack-extend-network-controller
O ack-extend-network-controller chama OpenAPIs da Alibaba Cloud para criar recursos. Conceda as permissões RAM necessárias, instale o ack-extend-network-controller pelo Marketplace e use anotações de pod para criar e associar entradas DNAT.
O controlador natgw chama APIs da Alibaba Cloud para gerenciar entradas de encaminhamento NAT. Conceda permissões conforme o tipo do seu cluster.
Cluster gerenciado ou dedicado ACK
O controlador natgw utiliza a Worker RAM Role do cluster. Adicione uma política personalizada com as seguintes permissões à Worker RAM Role.
Faça login no Console de Gerenciamento do Container Service. No painel de navegação à esquerda, clique em Console de Gerenciamento do Container ServiceClusters.
Na página Clusters, clique no nome do cluster. No painel de navegação à esquerda, clique em Cluster Information.
Na aba Basic Information, clique no link ao lado de Worker RAM Role.
-
Crie uma política personalizada com o conteúdo abaixo. Consulte Etapa 1: Criar uma política personalizada.
{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": ["*"], "Condition": {} } Anexe a política à Worker RAM Role. Consulte Etapa 2: Conceder permissões à Worker RAM Role.
Cluster serverless ACK
Crie um par de AccessKey para um usuário RAM com permissões equivalentes. Consulte Criar um usuário RAM e Criar uma política personalizada.
Etapa 2: Instale e configure o controlador natgw
Instale o ack-extend-network-controller pelo Marketplace e ative o controlador natgw.
Configure o controlador natgw com os seguintes parâmetros:
clusterID: "c11ba338192xxxxxxx" # Your cluster ID
regionID: "cn-hangzhou" # Your region ID
vpcID: "vpc-bp1rkq0zxxxxxx" # Your VPC ID
enableControllers:
- natgw # Enable the natgw controller
networkController:
natGwPool:
- natgwId: "<nat-gateway-id>" # Internet NAT gateway ID
zoneId: "<zone-id>" # Zone of the NAT gateway, e.g., cn-hangzhou-j
portRangeStart: 512 # Start of the public port range
portRangeEnd: 1024 # End of the public port range
eips:
- "<eip-address>" # EIP on the NAT gateway. If omitted, all EIPs on the gateway are used.
credential: # For ACK clusters using the Worker RAM Role, omit this section.
accessKey: ""
accessSecret: ""
Exponha um pod com DNAT
Com o controlador natgw em execução, adicione anotações a um pod para criar automaticamente uma entrada DNAT.
-
Aplique um Deployment com anotações de DNAT. Este exemplo expõe a porta 80 de um pod nginx.
apiVersion: apps/v1 kind: Deployment metadata: name: example labels: app: example spec: replicas: 1 selector: matchLabels: app: example template: metadata: labels: app: example annotations: k8s.aliyun.com/pod-dnat: "" k8s.aliyun.com/pod-dnat-expose-port: "80" spec: containers: - name: example image: nginx -
Após o início do pod, o controlador natgw cria um CR
PodDNATcom o mesmo nome do pod. Visualize a alocação:Campo
Descrição
spec.externalIPEndereço IP público do NAT gateway. Use este endereço para acessar o pod pela internet.
spec.externalPortPorta pública alocada do intervalo
portRangeStart–portRangeEnd. Neste exemplo:512.spec.internalIPEndereço IP privado do pod.
spec.portMapping[].internalPortPorta de escuta do pod. Neste exemplo:
80.status.entries[].forwardEntryIdID da entrada de encaminhamento DNAT.
kubectl get poddnats -oyamlSaída esperada:
apiVersion: alibabacloud.com/v1 kind: PodDNAT metadata: creationTimestamp: "20**-09-20T03:26:44Z" finalizers: - natgw-controller generation: 2 name: example-6cd498d7b-9**** namespace: default ownerReferences: - apiVersion: v1 blockOwnerDeletion: true kind: Pod name: example-6cd498d7b-9**** uid: 7af54e1c-eeb7-4fd0-b070-ff99ddbd**** resourceVersion: "357150" uid: 2fad9bb7-cc84-46b4-b6eb-5d15f06c**** spec: eni: eni-xxx externalIP: 114.55.**.** internalIP: 172.16.**.** portMapping: - externalPort: "512" internalPort: "80" protocol: tcp tableId: ngw-xxx vswitch: vsw-xxx zoneID: cn-hangzhou-k status: entries: - externalIP: 114.55.**.** externalPort: "512" forwardEntryId: fwd-xxx internalIP: 172.16.**.** internalPort: "80" ipProtocol: tcpO pod está acessível pela internet em 114.55..:512.
Próximos passos
Para expor múltiplas portas, defina
k8s.aliyun.com/pod-dnat-expose-portcomo uma lista separada por vírgulas, por exemplo"80,443".Para usar UDP em vez de TCP, defina
k8s.aliyun.com/pod-dnat-expose-protocolcomoudp.Para manter a mesma porta pública entre reinicializações do pod, adicione a anotação
k8s.aliyun.com/pod-dnat-fixed.