Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Expose pods with NAT gateway DNAT rules

Última atualização: Jun 27, 2026

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 portRangeStartportRangeEnd e 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

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:

  1. Seleciona um EIP do pool de EIPs do NAT gateway.

  2. Aloca uma porta pública do intervalo configurado (portRangeStartportRangeEnd).

  3. Cria uma entrada de encaminhamento DNAT que mapeia o IP público e a porta para o IP privado e a porta do pod.

  4. Registra a alocação em um Custom Resource (CR) PodDNAT com 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

k8s.aliyun.com/pod-dnat

Ativa o DNAT para o pod. Defina como true ou "" para ativar. Para desativar, remova todas as anotações relacionadas ao DNAT.

k8s.aliyun.com/pod-dnat-expose-port

Porta de escuta do pod. Separe múltiplas portas com vírgulas. Exemplo: "80,443".

k8s.aliyun.com/pod-dnat-expose-protocol

Protocolo utilizado. Valores válidos: tcp, udp. Padrão: tcp.

k8s.aliyun.com/pod-dnat-fixed

Habilita a persistência de configuração para contêineres com estado.

Importante

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.

  1. Faça login no Console de Gerenciamento do Container Service. No painel de navegação à esquerda, clique em Console de Gerenciamento do Container ServiceClusters.

  2. Na página Clusters, clique no nome do cluster. No painel de navegação à esquerda, clique em Cluster Information.

  3. Na aba Basic Information, clique no link ao lado de Worker RAM Role.

  4. 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": {}
    }
  5. 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.

  1. 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
  2. Após o início do pod, o controlador natgw cria um CR PodDNAT com o mesmo nome do pod. Visualize a alocação:

    Campo

    Descrição

    spec.externalIP

    Endereço IP público do NAT gateway. Use este endereço para acessar o pod pela internet.

    spec.externalPort

    Porta pública alocada do intervalo portRangeStartportRangeEnd. Neste exemplo: 512.

    spec.internalIP

    Endereço IP privado do pod.

    spec.portMapping[].internalPort

    Porta de escuta do pod. Neste exemplo: 80.

    status.entries[].forwardEntryId

    ID da entrada de encaminhamento DNAT.

    kubectl get poddnats -oyaml

    Saí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: tcp

    O 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-port como uma lista separada por vírgulas, por exemplo "80,443".

  • Para usar UDP em vez de TCP, defina k8s.aliyun.com/pod-dnat-expose-protocol como udp.

  • Para manter a mesma porta pública entre reinicializações do pod, adicione a anotação k8s.aliyun.com/pod-dnat-fixed.