View a markdown version of this page

設定 Pod IP 地址的子網路選擇 - Amazon EKS

協助改進此頁面

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 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 對帳

1

選擇加入:VPC CNI 會在此子網路中建立新的 ENIs。

ENI 仍可用於 Pod IP 配置。

0

排除: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 地址新增子網路:

  1. 在與節點相同的 VPC 和可用區域中建立新的子網路。

  2. 使用 標記子網路kubernetes.io/role/cni=1

  3. 確保子網路具有適當的路由表和網路 ACLs。

  4. 確認 VPC CNI 發現並開始使用新的子網路。

若要從 Pod IP 配置中移除子網路:

  1. 使用 標記子網路kubernetes.io/role/cni=0

  2. 等待使用該子網路 IPs Pod 自然終止或重新排程。

  3. 確認 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 的安全群組使用增強型子網路探索。