Todos los productos
Search
Centro de documentos

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

Última actualización: Sep 05, 2026

En aplicaciones de videojuegos y peer-to-peer (P2P), los clientes suelen necesitar acceso directo a los pods. En lugar de asignar una dirección IP elástica (EIP) a cada pod, lo cual está limitado por las cuotas de EIP y complica la gestión de seguridad, asigne endpoints públicos a los pods mediante reglas DNAT de NAT gateway.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

  • Un ACK managed cluster o ACK dedicated cluster que utilice Terway como plugin de red.

  • Un Internet NAT gateway creado en la VPC del clúster y gestionado por el controlador natgw.

  • Conocimiento sobre cómo las reglas DNAT asignan cuatro valores: IP pública (una EIP en el NAT gateway), puerto público (asignado automáticamente desde portRangeStart–portRangeEnd y registrado en el CR PodDNAT), puerto privado (el puerto de escucha del pod definido en las anotaciones) e IP privada (la IP del pod). Las reglas DNAT rules asignan una dirección IP y un puerto públicos a una dirección IP y un puerto privados.

Limitaciones

  • Compatible únicamente con nodos ECS estándar; no admite instancias ECI.

  • Las entradas DNAT están sujetas a la cuota del NAT gateway. Consulte DNAT feature FAQ.

Funcionamiento

El componente ack-extend-network-controller ejecuta un subcontrolador denominado natgw controller. Cuando se añade una anotación a un pod para habilitar DNAT, el natgw controller realiza las siguientes acciones:

  1. Selecciona una EIP del pool de EIP del NAT gateway.

  2. Asigna un puerto público del rango configurado (portRangeStart–portRangeEnd).

  3. Crea una entrada de reenvío DNAT que asigna la IP y el puerto públicos a la IP y el puerto privados del pod.

  4. Registra la asignación en un Custom Resource (CR) PodDNAT con el mismo nombre del pod.

Cada regla DNAT asigna cuatro valores: dirección IP pública, puerto público, dirección IP privada y puerto privado.

El natgw controller asigna automáticamente los puertos públicos dentro del rango configurado. Dimensione este rango según la cantidad máxima de pods que necesite exponer de forma simultánea.

Anotaciones de pod

Aplique las siguientes anotaciones en la plantilla del pod para controlar el comportamiento de DNAT.

Annotation

Description

k8s.aliyun.com/pod-dnat

Habilita DNAT para el pod. Establezca el valor en true o "" para activar la función. Para deshabilitarla, elimine todas las anotaciones relacionadas con DNAT.

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

Puerto de escucha del pod. Separe varios puertos con comas. Por ejemplo: "80,443".

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

Protocolo de red. Valores válidos: tcp, udp. Valor predeterminado: tcp.

k8s.aliyun.com/pod-dnat-fixed

Habilita la persistencia de configuración para contenedores con estado.

Importante

Agregue una regla de entrada al security group del pod para permitir tráfico en el puerto expuesto. Sin esta regla, el security group descartará el tráfico DNAT.

Habilitación de DNAT en ack-extend-network-controller

El ack-extend-network-controller invoca las OpenAPI de Alibaba Cloud para crear recursos. Otorgue los permisos de RAM necesarios, instale ack-extend-network-controller desde el Marketplace y utilice anotaciones de pod para crear y asociar entradas DNAT.

Paso 1: Configuración de permisos de RAM

El natgw controller llama a las API de Alibaba Cloud para gestionar entradas de reenvío NAT. Otorgue los permisos correspondientes según el tipo de clúster.

ACK managed or dedicated cluster

El natgw controller utiliza el Worker RAM Role del clúster. Agregue una directiva personalizada con los siguientes permisos al Worker RAM Role.

  1. Inicie sesión en la Container Service Management Console. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Cluster Information.

  3. En la pestaña Basic Information, haga clic en el vínculo junto a Worker RAM Role.

  4. Cree una directiva personalizada con el siguiente contenido. Consulte Step 1: Create a custom policy.

    {
      "Effect": "Allow",
      "Action": [
        "ecs:DescribeNetworkInterfaces",
        "vpc:DescribeNatGateways",
        "vpc:DescribeForwardTableEntries",
        "vpc:CreateForwardEntry",
        "vpc:DescribeEipAddresses",
        "vpc:DeleteForwardEntry",
        "vpc:DescribeRouteTableList",
        "vpc:DescribeRouteEntryList"
      ],
      "Resource": ["*"],
      "Condition": {}
    }
  5. Asocie la directiva al Worker RAM Role. Consulte Step 2: Grant permissions to the Worker RAM Role.

ACK serverless cluster

Cree un par de AccessKey para un usuario de RAM con los permisos equivalentes. Consulte Create a RAM user y Create a custom policy.

Paso 2: Instalación y configuración del natgw controller

Instale ack-extend-network-controller desde Marketplace y habilite el natgw controller.

Configure el natgw controller con los siguientes 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: ""

Exposición de un pod con DNAT

Una vez que el natgw controller esté en ejecución, añada una anotación al pod para crear automáticamente una entrada DNAT.

  1. Aplique un Deployment con anotaciones DNAT. Este ejemplo expone el puerto 80 de un 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. Después de que el pod se inicie, el natgw controller crea un CR PodDNAT con el nombre del pod. Consulte la asignación:

    Field

    Description

    spec.externalIP

    Dirección IP pública del NAT gateway. Utilice esta dirección para acceder al pod desde internet.

    spec.externalPort

    Puerto público asignado del rango portRangeStart–portRangeEnd. En este ejemplo: 512.

    spec.internalIP

    Dirección IP privada del pod.

    spec.portMapping[].internalPort

    Puerto de escucha del pod. En este ejemplo: 80.

    status.entries[].forwardEntryId

    ID de la entrada de reenvío DNAT.

    kubectl get poddnats -oyaml

    Salida 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

    El pod es accesible desde internet en 114.55.**.**:512.

Siguientes pasos

  • Para exponer varios puertos, establezca k8s.aliyun.com/pod-dnat-expose-port como una lista separada por comas; por ejemplo, "80,443".

  • Para usar UDP en lugar de TCP, configure k8s.aliyun.com/pod-dnat-expose-protocol con el valor udp.

  • Para conservar el mismo puerto público tras reiniciar el pod, agregue la anotación k8s.aliyun.com/pod-dnat-fixed.