使用網(wǎng)關(guān)DNAT規(guī)則直接訪問Pod
在游戲、P2P等場(chǎng)景中,您通常需要客戶端直接訪問Pod。傳統(tǒng)模式下,您可以為Pod分配EIP來訪問Pod。但這種方式存在一些問題,例如EIP數(shù)量限制、安全管理問題等。您可以在NAT網(wǎng)關(guān)上配置EIP,使用公網(wǎng)NAT網(wǎng)關(guān)的DNAT方式暴露Pod的訪問入口,從而節(jié)省EIP數(shù)量。
前提條件
已創(chuàng)建ACK托管集群或ACK專有集群,且集群網(wǎng)絡(luò)插件為Terway。詳細(xì)信息,請(qǐng)參見創(chuàng)建ACK托管集群、創(chuàng)建ACK專有集群。
已在VPC中創(chuàng)建NAT網(wǎng)關(guān)并使用natgw控制器,如何創(chuàng)建NAT網(wǎng)關(guān)請(qǐng)參見創(chuàng)建和管理公網(wǎng)NAT網(wǎng)關(guān)實(shí)例。
已在DNAT規(guī)則中建立公網(wǎng)IP、公網(wǎng)端口、私網(wǎng)端口、私網(wǎng)IP的映射關(guān)系。關(guān)于DNAT原理請(qǐng)參見通過公網(wǎng)NAT網(wǎng)關(guān)DNAT功能實(shí)現(xiàn)ECS對(duì)外提供服務(wù)。
公網(wǎng)IP: 為公網(wǎng)NAT網(wǎng)關(guān)上配置的EIP。
公網(wǎng)端口:為natgw控制器配置文件中配置的
portRangeStart
、portRangeEnd
范圍,由natgw控制器自動(dòng)分配,分配后信息在Pod同名CRpoddnats.alibabacloud.com
中記錄。私網(wǎng)端口:為Pod Annotations中配置的Pod監(jiān)聽的端口。
私網(wǎng)IP: 為Pod IP。
使用限制
本功能僅支持普通ECS節(jié)點(diǎn),不支持ECI實(shí)例。
配置條目數(shù)受限于NAT網(wǎng)關(guān)能力,使用約束請(qǐng)參見DNAT功能FAQ。
Pod配置
您可以使用以下Pod Annotations配置:
Pod Annotations | Value |
k8s.aliyun.com/pod-dnat | 為Pod開啟DNAT能力,取值為空。 |
k8s.aliyun.com/pod-dnat-expose-port | Pod監(jiān)聽端口,多個(gè)端口使用逗號(hào)分隔,例如: '80,443'。 |
k8s.aliyun.com/pod-dnat-expose-protocol | 協(xié)議類型,支持 |
k8s.aliyun.com/pod-dnat-fixed | 為有狀態(tài)容器啟用配置保持。 |
安全組配置:Pod所屬的安全組中需要開放入方向的允許規(guī)則,規(guī)則中的端口為暴露Pod的端口。
在ack-extend-network-controller中啟用DNAT功能
ack-extend-network-controller需要訪問阿里云OpenAPI來創(chuàng)建資源,您需要在RAM中配置相應(yīng)的權(quán)限,然后在應(yīng)用市場(chǎng)中安裝ack-extend-network-controller,并通過注解為指定Pod創(chuàng)建和關(guān)聯(lián)DNAT 。
步驟一:配置DNAT所需的RAM權(quán)限
對(duì)于ACK集群:
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄單擊集群。
在集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇集群信息。
在集群信息頁(yè)面的基本信息頁(yè)簽下,單擊Worker RAM角色右側(cè)鏈接。
創(chuàng)建自定義權(quán)限策略,策略內(nèi)容如下。具體操作,請(qǐng)參見步驟一:創(chuàng)建自定義權(quán)限策略。
{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": [ "*" ], "Condition": {} }
為集群的Worker RAM角色授權(quán)。具體操作,請(qǐng)參見步驟二:為集群的Worker RAM角色授權(quán)。
對(duì)于ACK Serverless集群:
請(qǐng)為RAM用戶生成訪問密鑰(AccessKey)。具體操作,請(qǐng)參見創(chuàng)建RAM用戶和創(chuàng)建自定義權(quán)限策略。
步驟二:為ack-extend-network-controller組件開啟natgw控制器
您需要安裝ack-extend-network-controller組件,并且開啟natgw控制器。關(guān)于ack-extend-network-controller組件的安裝入口,請(qǐng)參見應(yīng)用市場(chǎng)。
natgw控制器配置參數(shù)如下。
clusterID: "c11ba338192xxxxxxx" # 請(qǐng)按實(shí)際情況填寫。
regionID: "cn-hangzhou" # 請(qǐng)按實(shí)際情況填寫。
vpcID: "vpc-bp1rkq0zxxxxxx" # 請(qǐng)按實(shí)際情況填寫。
enableControllers:
- natgw # 啟用DNAT。
networkController:
natGwPool:
- natgwId: "< nat gateway id. >" # nat 公網(wǎng)網(wǎng)關(guān)ID。
zoneId: "< nat gateway zone id. cn-hangzhou-j >" # nat 公網(wǎng)網(wǎng)關(guān)可用區(qū)ID。
portRangeStart: 512 # 起始端口。
portRangeEnd: 1024 # 結(jié)束端口。
eips:
- "<auto config all nat gateway eips if not config. 0.0.0.0 >" # 使用公網(wǎng)網(wǎng)關(guān)EIP,如不設(shè)置,則使用網(wǎng)關(guān)上配置的全部EIP。
credential: # 使用AK/SK,ACK集群推薦使用RamRole模式配置。 若使用步驟一為集群的Worker RAM角色授權(quán),此處無需配置。
accessKey: ""
accessSecret: ""
使用自定義資源跟蹤配置
創(chuàng)建Pod后,控制器會(huì)創(chuàng)建與Pod同名的自定義資源。以下示例將為Pod配置DNAT規(guī)則,將Pod 80端口暴露到公網(wǎng)。
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
執(zhí)行如下命令,讀取poddnats.alibabacloud.com
中的分配信息來獲取Pod的外部地址和端口。
kubectl get poddnats -oyaml
預(yù)期輸出:
apiVersion: alibabacloud.com/v1
kind: PodDNAT
metadata:
creationTimestamp: "2022-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
其中
externalPort
:公網(wǎng)端口,由控制器在端口范圍中分配。externalIP
:NAT網(wǎng)關(guān)的公網(wǎng)IP,即外部訪問的地址。