全部產品
Search
文件中心

Container Compute Service:通過配置註解為Pod掛載EIP

更新時間:Jul 26, 2025

在ACS叢集中,Pod的IP地址預設是私人IP地址。但在某些情境(多租戶隔離或安全隔離情境等)下,Pod可能需要一個獨立的公網IP地址,使得Pod可以獨立地與外部網路通訊。本文介紹如何通過配置註解為ACS叢集中的Pod掛載獨立的EIP。

背景資訊

一般情況下,Pod訪問公網的流量是通過公網NAT Gateway的方式實現,詳情請參見為叢集開啟公網訪問能力。對於Pod的公網入口流量,一般是通過LoadBalancer類型的Service流入。在一些特殊情境中Pod需要獨立的公網地址,例如:

  • 動態連接埠需求:如UDP遊戲伺服器或RTSP協議需為不同用戶端分配隨機連接埠,配置獨立IP以避免連接埠衝突。

  • 避免SNAT限制:Pod調用外部服務時,若服務需求固定IP白名單,共用SNAT的出口IP會被封鎖。

  • 直接IP標識需求:需通過獨立IP與外部系統建立端到端串連(如即時通訊協定)。

使用限制

  • 在使用Elastic IP Address(Elastic IP Address,簡稱EIP)前,請先瞭解EIP使用限制

  • 如果您使用自動分配EIP能力,在Pod重建、CNI執行失敗等情況下,可能會反覆申請、釋放EIP資源,這種情況下,可能會觸發EIP使用限制。如果您想避免這種情況,可以通過配置Pod Annotationnetwork.alibabacloud.com/allocated-eip-id為Pod指定EIP。

操作流程

為Pod掛載EIP,需要為叢集安裝ack-extend-network-controller組件,您可以在組件管理中進行安裝。具體的步驟流程如下:

步驟一:為叢集安裝或升級外掛程式

說明

開始安裝前,請確認是否已經通過Helm或者ACK應用市場安裝過組件。如有請先卸載。

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理組件管理

  3. 在頁面搜尋方塊中搜尋ack-extend-network-controller,在結果中單擊組件卡片右下角的安裝

    image

  4. 根據以下內容,在彈出框中進行配置。完成後單擊確定

    參數名稱

    功能說明

    enableControllers

    配置啟用功能:

    • eip:啟用EIP功能。

    • ipv6gw: 啟用IPv6功能。

    • natgw:啟用DNAT Gateway功能。

    eipipv6gw功能預設勾選,可以直接啟用,無需配置 RAM 許可權。

    使用natgw需配置RAM許可權,請按照配置DNAT所需的RAM許可權進行配置。

    natGwPool

    DNAT配置。

    customStatefulWorkloadKinds

    自訂有狀態容器類型。預設支援K8s StatefulSet和直接建立的Pod。若您有其他容器類型需要使用EIP,請單擊+ 添加

步驟二:啟用EIP功能

ACS支援使用Annotation的方式啟用EIP功能,通過指定Pod中的annotations可以建立或者關聯EIP到Pod中。關於啟用EIP功能註解的詳細內容,請參見啟用EIP的Annotation介紹

說明

您可以按需選擇自動分配EIP或者指定EIP執行個體的方式。這兩種方式除了使用的Annotation不同之外,在EIP回收策略上也有不同。對於指定EIP執行個體的方式,刪除Pod不會釋放EIP執行個體,而自動分配EIP的方式則預設釋放EIP執行個體。EIP回收策略的詳細資料,請參見設定EIP回收策略的Annotation介紹

自動分配EIP

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  2. 在頁面右上方,單擊使用YAML建立資源

  3. 使用如下YAML樣本建立一個名為example的無狀態工作負載。

    展開查看Deployment YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example
      labels:
        app: example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
          annotations:
            network.alibabacloud.com/pod-with-eip: "true"
            network.alibabacloud.com/eip-bandwidth: "5"
        spec:
          containers:
          - name: example
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80

    其中的annotations部分表示為每個Pod自動分配一個EIP執行個體,並且執行個體頻寬為5 Mbps。

  4. 建立成功後,進入名為example的Deployment。點擊Pod名稱(例如:example-78d17b7xxx-adxxx)進入Pod詳情頁面,在頁面註解部分查看建立出的EIP資訊。您也可以點擊編輯,在Pod YAML中查看建立出的EIP資訊。

    展開查看Pod YAML

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        ...
        network.alibabacloud.com/allocated-eip-id: eip-xxxxx0y884ucrevoxxxxx
        network.alibabacloud.com/allocated-eipAddress: xxx.xxx.xxx.xxx
        network.alibabacloud.com/allocated-eni-id: eni-xxxxx563trofuhaxxxxx
        network.alibabacloud.com/eip-bandwidth: '5'
        network.alibabacloud.com/pod-with-eip: 'true'
        ...
      labels:
        alibabacloud.com/compute-class: general-purpose
        app: example
      name: example-78d17b7xxx-adxxx
      namespace: default
    spec:
      ...
  5. 完成樣本後,刪除名為example的Deployment。由於在沒有指定Pod EIP執行個體ID的情況下,Pod EIP的預設回收策略是跟隨Pod生命週期。因此當Pod被刪除後,EIP會自動釋放。

指定EIP執行個體

  1. 準備樣本使用的EIP執行個體,請先申請EIP

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 >有狀態

  3. 在頁面右上方,單擊使用YAML建立資源

  4. 使用如下YAML樣本建立一個名為example的有狀態工作負載。

    展開查看StatefulSet YAML

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        app: example
      name: example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
          annotations:
            network.alibabacloud.com/pod-eip-instanceid: eip-xxxxx66wjkj16lf9xxxxx
        spec:
          containers:
          - name: example
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80

    其中的annotations部分表示為Pod指定一個執行個體ID為eip-xxxxx66wjkj16lf9xxxxx的EIP執行個體,該執行個體ID需要替換成實際的值。

  5. 建立成功後,進入名為example的StatefulSet。點擊Pod名稱(例如:example-0)進入Pod詳情頁面,在頁面右側註解部分查看已綁定的EIP執行個體資訊。您也可以點擊編輯,在Pod YAML中查看已綁定的EIP執行個體資訊。

    展開查看Pod YAML

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        ...
        network.alibabacloud.com/allocated-eip-id: eip-xxxxx66wjkj16lf9xxxxx
        network.alibabacloud.com/allocated-eipAddress: xxx.xxx.xxx.xxx
        network.alibabacloud.com/allocated-eni-id: eni-xxxxx612ub33hunxxxxx
        network.alibabacloud.com/pod-eip-instanceid: eip-xxxxx66wjkj16lf9xxxxx
        ...
      labels:
        alibabacloud.com/compute-class: general-purpose
        app: example
      name: example-0
      namespace: default
    spec:
      ...
  6. 完成樣本後,刪除名為example的StatefulSet。由於在指定Pod EIP執行個體ID的情況下,Pod EIP的回收策略是不釋放EIP執行個體。因此當Pod被刪除後,EIP不會自動釋放。

相關操作

控制器會在Pod IP分配後,為Pod配置EIP地址,在這個過程中Pod可能在EIP綁定成功前進入Ready狀態。您可以嘗試使用以下方式來解決這類問題,確保Pod在進入服務可用狀態之前已完成EIP的綁定,避免可能出現的服務中斷或者連線逾時等情況。

使用Readiness gates檢查EIP綁定狀態

當在Pod中配置readinessGates,並且綁定EIP成功後,控制器會設定Podconditions。在EIP未綁定前,Pod不會處於Ready狀態。

kind: Pod
...
spec:
  readinessGates:
  - conditionType: "k8s.aliyun.com/eip"
status:
  conditions:
  - lastProbeTime: "2022-12-12T03:45:48Z"
    lastTransitionTime: "2022-12-12T03:45:48Z"
    reason: Associate eip succeed
    status: "True"
    type: k8s.aliyun.com/eip
...

使用initContainers檢查EIP綁定狀態

為Pod配置initContainers,在initContainers中檢查EIP是否已經分配成功。您可以參考以下樣本配置initContainers

apiVersion: v1
kind: Pod
metadata:
  name: example
  annotations:
    network.alibabacloud.com/pod-with-eip: "true"
spec:
  containers:
  - name: example
    image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init
    image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
    command: ['timeout', '-t' ,'60', 'sh','-c', "until grep -E '^k8s.aliyun.com\\/pod-ips=\\S?[0-9]+\\S?' /etc/podinfo/annotations; do echo waiting for annotations; sleep 2; done"]
    volumeMounts:
    - name: podinfo
      mountPath: /etc/podinfo
  volumes:
  - name: podinfo
    downwardAPI:
      items:
      - path: "labels"
        fieldRef:
          fieldPath: metadata.labels
      - path: "annotations"
        fieldRef:
          fieldPath: metadata.annotations

配置DNAT所需的RAM許可權

DNAT功能依賴於ack-extend-network-controller訪問阿里雲OpenAPI來建立資源,您需要在RAM中配置相應的許可權。

  1. 登入RAM控制台在左側導覽列中單擊權限原則,單擊建立權限原則

  2. 建立權限原則頁面單擊指令碼編輯,將以下內容粘貼至代碼地區的Statement中,單擊確定,配置策略名稱稱為DNAT-Policy,再次單擊確定

    {
          "Effect": "Allow",
          "Action": [
            "ecs:DescribeNetworkInterfaces",
            "vpc:DescribeNatGateways",
            "vpc:DescribeForwardTableEntries",
            "vpc:CreateForwardEntry",
            "vpc:DescribeEipAddresses",
            "vpc:DeleteForwardEntry",
            "vpc:DescribeRouteTableList",
            "vpc:DescribeRouteEntryList"
          ],
          "Resource": [
            "*"
          ],
          "Condition": {}
        }
  3. 單擊左側導覽列中的角色,在搜尋欄中搜尋AliyunCCNECRole,在操作列單擊新增授權

  4. 權限原則部分的搜尋欄中搜尋並勾選DNAT-Policy,單擊確認新增授權