協助改進此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定 Pod IP 地址的子網路選擇
適用於:包含 Amazon EC2 執行個體的 Linux 節點
適用於 Kubernetes 的 Amazon VPC CNI 外掛程式會在節點上建立次要彈性網路介面 (ENIs),並將這些 ENIs IP 地址指派給 Pod。根據預設,VPC CNI 會在與節點主要網路界面相同的子網路中建立次要 ENIs。您可以透過下列方法控制 VPC CNI 用於 Pod IP 地址的子網路:
-
增強型子網路探索 – VPC CNI 會自動探索並使用在相同 VPC 和可用
kubernetes.io/role/cni區域中以 標記的子網路。需要 VPC CNI 1.18.0 版或更新版本。對於大多數使用案例,我們建議使用此方法。 -
自訂聯網 – 使用
ENIConfig自訂資源,為每個可用區域手動指定子網路和安全群組。如需詳細資訊,請參閱使用自訂聯網在替代子網路中部署 Pod。
注意
啟用這兩個功能時,以自訂聯網為優先。
增強型子網路探索
VPC CNI 1.18.0 版及更新版本預設會啟用增強型子網路探索 (ENABLE_SUBNET_DISCOVERY=true)。VPC CNI 會自動探索與節點位於相同 VPC 和可用區域中的子網路,然後使用它們來建立次要 ENIs並配置 Pod IP 地址。這可展開可用的 IP 地址空間,無需手動ENIConfig設定。
若要確認已啟用此功能:
kubectl describe ds aws-node -n kube-system | grep ENABLE_SUBNET_DISCOVERY
若要停用此功能,請在 aws-node DaemonSet ENABLE_SUBNET_DISCOVERY=false上設定 。
子網路標籤行為 (kubernetes.io/role/cni)
kubernetes.io/role/cni 標籤控制 VPC CNI 如何處理 ENI 操作和 Pod IP 配置的子網路。標籤具有不同的效果,取決於 VPC CNI 是建立新的 ENI 還是協調現有的 ENI。
重要
叢集範圍和排除性標記機制只能從 VPC CNI v1.22.2 版本開始提供。在此版本之前,只有標準選擇加入行為可透過標籤 使用kubernetes.io/role/cni=1。
標籤值
下表摘要說明每個標籤值如何影響子網路行為:
| 標籤值 | 建立新的 ENI | 現有的 ENI 對帳 |
|---|---|---|
|
|
選擇加入:VPC CNI 會在此子網路中建立新的 ENIs。 |
ENI 仍可用於 Pod IP 配置。 |
|
|
排除:VPC CNI 不會在此子網路中建立新的 ENIs。 |
排除:VPC CNI 會從 Pod IP 配置中排除此子網路中的現有 ENIs。此 ENI 未指派新的 Pod IPs。 |
|
不存在 (無標籤) |
不用於新的 ENIs:VPC CNI 不會選取沒有新 ENI 建立標籤的次要子網路。主要子網路 (節點啟動的子網路) 仍會用於新的 ENI 建立,即使沒有 標籤也適用於回溯相容性。 |
不中斷:未標記子網路中的現有 ENIs 仍可用於 Pod IP 配置。VPC CNI 不會移除或排除這些 ENIs。 |
建立與對帳行為
VPC CNI 會在建立新 ENIs 和協調現有 ENIs 時刻意套用不同的政策:
-
建立 (次要子網路關閉失敗):當 VPC CNI 需要建立新的次要 ENI 時,它只會使用以 明確標記的次要子網路
kubernetes.io/role/cni=1。從未選取未標記的次要子網路來建立新的 ENI。這可確保新的網路界面僅放置在管理員明確核准的子網路中。 -
調校 (未標記的子網路無法開啟):VPC CNI 啟動或調校已連接到節點的現有 ENIs 時,不會排除 ENIs因為其子網路缺少
kubernetes.io/role/cni標籤。這可防止中斷已使用這些 ENIs IP 地址的執行中 Pod。
VPC CNI 刻意使用此設計。從未標記的子網路強制排除已連接的 ENI 會中斷目前使用該 ENI IP 地址的 Pod。
重要
為了防止子網路提供新的 Pod IPs,包括來自現有 ENIs 的 IP,請使用 標記子網路kubernetes.io/role/cni=0。缺少標籤只會防止在該子網路中建立新的 ENI。它不會從配置中排除現有的 ENIs。
主要子網路處理
VPC CNI 一律包含節點的主要子網路 (節點啟動的子網路) 以進行 ENI 建立,即使沒有 kubernetes.io/role/cni標籤也一樣。這可維持與現有叢集的回溯相容性。主要子網路行為:
-
包含用於建立 ENI,無論標籤是否存在 (除非已標記
0)。 -
如果使用 標記
kubernetes.io/role/cni=0,VPC CNI 會從新的 ENI 建立和現有的 ENI 配置中排除主要子網路。
叢集範圍子網路篩選
當子網路使用 標記時kubernetes.io/role/cni=1,VPC CNI 還會使用金鑰格式 檢查叢集特定的標籤cni.networking.k8s.aws/cluster/<cluster-name>。如果子網路具有此格式的任何叢集標籤,則只有名稱相符的叢集會使用該子網路。具有 kubernetes.io/role/cni=1且沒有叢集特定標籤的子網路可供 VPC 中的所有叢集使用。
例如,若要將子網路限制在特定叢集:
aws ec2 create-tags --resources subnet-example \ --tags Key=kubernetes.io/role/cni,Value=1 Key=cni.networking.k8s.aws/cluster/my-cluster,Value=shared
當多個 EKS 叢集共用 VPC 且您希望每個叢集針對 Pod IP 地址使用不同的子網路時,這會很有用。
建議的工作流程
若要為 Pod IP 地址新增子網路:
-
在與節點相同的 VPC 和可用區域中建立新的子網路。
-
使用 標記子網路
kubernetes.io/role/cni=1。 -
確保子網路具有適當的路由表和網路 ACLs。
-
確認 VPC CNI 發現並開始使用新的子網路。
若要從 Pod IP 配置中移除子網路:
-
使用 標記子網路
kubernetes.io/role/cni=0。 -
等待使用該子網路 IPs Pod 自然終止或重新排程。
-
確認 VPC CNI 停止從該子網路中的 ENIs 配置新的 Pod IPs。
重要
請勿移除kubernetes.io/role/cni標籤以停止使用子網路。移除標籤可防止建立新的 ENI,但不會將現有的 ENIs 從配置中排除。若要主動排除子網路,請使用 標記子網路kubernetes.io/role/cni=0。
考量事項
-
增強型子網路探索需要 Amazon VPC CNI 1.18.0 版或更新版本。
-
此功能需要 VPC CNI IAM 角色中的
ec2:DescribeSubnets許可。AmazonEKS_CNI_Policy受管政策包含此許可。IPv6 自我管理 IAM 政策不包含在內。如果您使用自我管理的 IAM 政策 (例如 IPv6 叢集),請ec2:DescribeSubnets手動新增 以啟用子網路探索。 -
此功能適用於次要 IP 地址模式和字首委派模式。
-
所有探索到的子網路都必須與節點位於相同的 VPC 中。
-
VPC CNI 只會在與節點位於相同可用區域的子網路中建立 ENIs。
-
無論標籤變更為何,VPC CNI 都不會取消配置仍有指派給 Pod 之 IP 地址的 ENIs。
-
使用共用 VPCs(跨帳戶子網路) 時,請在啟動叢集的參與者帳戶中標記子網路。
-
您可以搭配 Pod、網路政策、字首委派和 SNAT 的安全群組使用增強型子網路探索。