在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 Annotation
network.alibabacloud.com/allocated-eip-id為Pod指定EIP。
操作流程
為Pod掛載EIP,需要為叢集安裝ack-extend-network-controller組件,您可以在組件管理中進行安裝。具體的步驟流程如下:
步驟一:為叢集安裝或升級外掛程式
開始安裝前,請確認是否已經通過Helm或者ACK應用市場安裝過組件。如有請先卸載。
登入容器計算服務控制台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理。
在頁面搜尋方塊中搜尋ack-extend-network-controller,在結果中單擊組件卡片右下角的安裝。

根據以下內容,在彈出框中進行配置。完成後單擊確定。
參數名稱
功能說明
enableControllers
配置啟用功能:
eip:啟用EIP功能。
ipv6gw: 啟用IPv6功能。
natgw:啟用DNAT Gateway功能。
eip,ipv6gw功能預設勾選,可以直接啟用,無需配置 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
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態。
在頁面右上方,單擊使用YAML建立資源。
使用如下YAML樣本建立一個名為example的無狀態工作負載。
建立成功後,進入名為example的Deployment。點擊Pod名稱(例如:example-78d17b7xxx-adxxx)進入Pod詳情頁面,在頁面註解部分查看建立出的EIP資訊。您也可以點擊編輯,在Pod YAML中查看建立出的EIP資訊。
完成樣本後,刪除名為example的Deployment。由於在沒有指定Pod EIP執行個體ID的情況下,Pod EIP的預設回收策略是跟隨Pod生命週期。因此當Pod被刪除後,EIP會自動釋放。
指定EIP執行個體
準備樣本使用的EIP執行個體,請先申請EIP。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 >有狀態。
在頁面右上方,單擊使用YAML建立資源。
使用如下YAML樣本建立一個名為example的有狀態工作負載。
建立成功後,進入名為example的StatefulSet。點擊Pod名稱(例如:example-0)進入Pod詳情頁面,在頁面右側註解部分查看已綁定的EIP執行個體資訊。您也可以點擊編輯,在Pod YAML中查看已綁定的EIP執行個體資訊。
完成樣本後,刪除名為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中配置相應的許可權。
登入RAM控制台,在左側導覽列中單擊權限原則,單擊建立權限原則。
在建立權限原則頁面單擊指令碼編輯,將以下內容粘貼至代碼地區的
Statement中,單擊確定,配置策略名稱稱為DNAT-Policy,再次單擊確定。{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": [ "*" ], "Condition": {} }單擊左側導覽列中的角色,在搜尋欄中搜尋AliyunCCNECRole,在操作列單擊新增授權。
在權限原則部分的搜尋欄中搜尋並勾選DNAT-Policy,單擊確認新增授權。