在遊戲、P2P等情境中,您通常需要用戶端直接存取Pod。傳統模式下,您可以為Pod分配EIP來訪問Pod。但這種方式存在一些問題,例如EIP數量限制、安全管理問題等。您可以在NAT Gateway上配置EIP,使用公網NAT Gateway的DNAT方式暴露Pod的訪問入口,從而節省EIP數量。
前提條件
已建立ACK託管叢集或ACK專有叢集,且叢集網路外掛程式為Terway。詳細資料,請參見建立ACK託管叢集、建立ACK專有叢集(已停止建立)。
已在VPC中建立NAT Gateway並使用natgw控制器,如何建立NAT Gateway請參見建立和管理公網NAT Gateway執行個體。
已在DNAT規則中建立公網IP、公網連接埠、私網連接埠、私網IP的映射關係。關於DNAT原理請參見通過公網NAT GatewayDNAT功能實現ECS對外提供服務。
公網IP: 為公網NAT Gateway上配置的EIP。
公網連接埠:為natgw控制器設定檔中配置的
portRangeStart、portRangeEnd範圍,由natgw控制器自動分配,分配後資訊在Pod同名CRpoddnats.alibabacloud.com中記錄。私網連接埠:為Pod Annotations中配置的Pod監聽的連接埠。
私網IP: 為Pod IP。
使用限制
本功能僅支援普通ECS節點,不支援ECI執行個體。
配置條目數受限於NAT Gateway能力,使用約束請參見DNAT功能FAQ。
Pod註解說明
您可以使用以下Pod Annotations配置:
Pod Annotations | Value |
k8s.aliyun.com/pod-dnat | 為Pod開啟DNAT能力,取值為 |
k8s.aliyun.com/pod-dnat-expose-port | Pod監聽連接埠,多個連接埠使用逗號分隔,例如: |
k8s.aliyun.com/pod-dnat-expose-protocol | 協議類型,支援 |
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叢集
登入Container Service管理主控台,在左側導覽列單擊叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊。
在叢集資訊頁面的基本資料頁簽下,單擊Worker RAM角色右側連結。
建立自訂權限原則,策略內容如下。具體操作,請參見步驟一:建立自訂權限原則。
{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": [ "*" ], "Condition": {} }為叢集的Worker RAM角色授權。具體操作,請參見步驟二:為叢集的Worker RAM角色授權。
ACK Serverless叢集
步驟二:為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: ""使用自訂資源跟蹤配置
建立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執行如下命令,讀取
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"。