全部產品
Search
文件中心

Container Service for Kubernetes:使用網關DNAT規則直接存取Pod

更新時間:Jun 26, 2025

在遊戲、P2P等情境中,您通常需要用戶端直接存取Pod。傳統模式下,您可以為Pod分配EIP來訪問Pod。但這種方式存在一些問題,例如EIP數量限制、安全管理問題等。您可以在NAT Gateway上配置EIP,使用公網NAT Gateway的DNAT方式暴露Pod的訪問入口,從而節省EIP數量。

前提條件

使用限制

  • 本功能僅支援普通ECS節點,不支援ECI執行個體。

  • 配置條目數受限於NAT Gateway能力,使用約束請參見DNAT功能FAQ

Pod註解說明

您可以使用以下Pod Annotations配置:

Pod Annotations

Value

k8s.aliyun.com/pod-dnat

為Pod開啟DNAT能力,取值為true或空("")時都可開啟。如需關閉DNAT能力,請移除全部DNAT相關Annotations。

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

Pod監聽連接埠,多個連接埠使用逗號分隔,例如:"80,443"

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

協議類型,支援tcpudp。預設為tcp

k8s.aliyun.com/pod-dnat-fixed

為有狀態容器啟用配置保持。

重要

安全性群組配置:Pod所屬的安全性群組中需要開放入方向的允許規則,規則中的連接埠為暴露Pod的連接埠。

在ack-extend-network-controller中啟用DNAT功能

ack-extend-network-controller需要訪問阿里雲OpenAPI來建立資源,您需要在RAM中配置相應的許可權,然後在應用市場中安裝ack-extend-network-controller,並通過註解為指定Pod建立和關聯DNAT 。

步驟一:配置DNAT所需的RAM許可權

ACK叢集

  1. 登入Container Service管理主控台,在左側導覽列單擊叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊

  3. 叢集資訊頁面的基本資料頁簽下,單擊Worker RAM角色右側連結。

  4. 建立自訂權限原則,策略內容如下。具體操作,請參見步驟一:建立自訂權限原則

    {
          "Effect": "Allow",
          "Action": [
            "ecs:DescribeNetworkInterfaces",
            "vpc:DescribeNatGateways",
            "vpc:DescribeForwardTableEntries",
            "vpc:CreateForwardEntry",
            "vpc:DescribeEipAddresses",
            "vpc:DeleteForwardEntry",
            "vpc:DescribeRouteTableList",
            "vpc:DescribeRouteEntryList"
          ],
          "Resource": [
            "*"
          ],
          "Condition": {}
        }
  5. 為叢集的Worker RAM角色授權。具體操作,請參見步驟二:為叢集的Worker RAM角色授權

ACK Serverless叢集

請為RAM使用者產生存取金鑰(AccessKey)。具體操作,請參見建立RAM使用者建立自訂權限原則

步驟二:為ack-extend-network-controller組件開啟natgw控制器

您需要安裝ack-extend-network-controller組件,並且開啟natgw控制器。關於ack-extend-network-controller組件的安裝入口,請參見應用市場

natgw控制器配置參數如下。

clusterID: "c11ba338192xxxxxxx"          # 請按實際情況填寫。
regionID: "cn-hangzhou"                  # 請按實際情況填寫。
vpcID: "vpc-bp1rkq0zxxxxxx"              # 請按實際情況填寫。
enableControllers:
  - natgw                                  # 啟用DNAT。

networkController:
  natGwPool:
    - natgwId: "< nat gateway id. >"                   # nat 公網網關ID。
      zoneId: "< nat gateway zone id. cn-hangzhou-j >" # nat 公網網關可用性區域ID。
      portRangeStart: 512                              # 開始端點口。
      portRangeEnd: 1024                               # 結束連接埠。
      eips:
        - "<auto config all nat gateway eips if not config. 0.0.0.0 >"  # 使用公網網關EIP,如不設定,則使用網關上配置的全部EIP。

credential:                               # 使用AK/SK,ACK叢集推薦使用RamRole模式配置。 若使用步驟一為叢集的Worker RAM角色授權,此處無需配置。
  accessKey: ""
  accessSecret: ""

使用自訂資源跟蹤配置

  1. 建立Pod後,控制器會建立與Pod同名的自訂資源。以下樣本將為Pod配置DNAT規則,將Pod的80連接埠暴露到公網。

    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. 執行如下命令,讀取poddnats.alibabacloud.com中的分配資訊來擷取Pod的外部地址和連接埠。

    kubectl get poddnats -oyaml 

    預期輸出:

    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

    其中Pod的外部地址和連接埠如下:

    • externalIP:NAT Gateway的公網IP,即外部存取的地址。在本樣本中為114.55.**.**

    • externalPort:公網連接埠,由控制器在連接埠範圍中分配。在本樣本中為"512"