我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中為 Pod 使用自訂子網路或 IP 位址範圍。
解決方法
若要從與工作節點子網路不同的子網路分配 Pod IP 位址,請使用自訂網路。
啟動自訂網路
在設定自訂網路之前,請查看以下預設行為:
- 節點和 Pod 在您的 Amazon 虛擬私有雲端 (VPC) 叢集內會使用相同 CIDR 範圍的 IP 位址。若要為您的 Amazon VPC 新增更多 IP 位址 CIDR 範圍,請參閱如何在 Amazon EKS 中使用多個 CIDR 範圍?
- Amazon EKS 會從工作節點的子網路中指派 Pod IP 位址。
- 您無法控制哪個子網路為 Pod 指派 IP 位址。
- 當節點的子網路中沒有可用的 IP 位址時,即使其他子網路有可用的位址,新的 Pod 也無法啟動。
- 所有從 Pods 到 Amazon EKS 叢集 CIDR 區塊外的 IP 位址的流量,都會使用節點的主要介面與 IP 位址。流量使用來自節點主要彈性網路介面的安全群組和子網路。它不使用您在 ENIConfig 物件中定義的子網路和安全群組。
- 如果您對 Pod 使用安全群組,則 Pod 將使用您在 SecurityGroupPolicy 中指定的安全群組。Pod 不使用您在 ENIConfig 物件中指定的安全群組。
**注意:**有關 Pod 流量路由的詳細資訊,請參閱啟用 Pod 的傳出網際網路存取。
在 Kubernetes 的 Amazon VPC 容器網路介面 (Amazon VPC CNI) 外掛程式中啟動自訂網路。使用與您的 Kubernetes 版本相符的 Amazon VPC CNI 外掛程式版本。若要存取該外掛程式,請參閱 GitHub 網站上的 amazon-vpc-cni-k8s。
執行以下命令,以驗證 Amazon EKS 叢集所使用的 Amazon VPC 版本:
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
如果您沒有正確的外掛程式版本,請更新 Amazon VPC CNI。
執行以下命令來啟動自訂網路:
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
VPC CNI v1.18 及更新版本支援自動子網路偵測,並根據可用子網路的 IP 位址使用情況動態分配位址。如需詳細資訊,請參閱 Amazon VPC CNI 推出增強型子網路偵測。
您也可以使用 Amazon VPC CNI 外掛程式執行以下動作:
- 指定用於 Pod 的 Amazon VPC 子網路。
- 為您的 Pod 定義單獨的安全群組。
建立 ENIConfig 物件
在您建立 ENIConfig 物件之前,請先檢視以下預設行為:
- 每個 ENIConfig 物件定義一個子網路和一個安全群組清單。
- 每個節點只能指派一個 ENIConfig 物件。不過,您可以將同一個 ENIConfig 物件指派給多個節點。
- 當您將 ENIConfig 物件指派給節點時,排程到該節點的 Pod 將使用 ENIConfig 物件中的子網路和安全群組。
- 您 ENIConfig 物件的名稱必須是您可用區域的名稱。
執行以下命令來建立您的 ENIConfig 物件:
cat EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
name: example-availability-zone
spec:
securityGroups:
- example-security-group-id
subnet: example-subnet-id
EOF
**注意:**將 example-availability-zone 替換為您的可用區域。將 example-security-group-id 替換為您安全群組的 ID。將 example-subnet-id 替換為您的子網路 ID。
指派 ENIConfig 物件
若要為一個 ENIConfig 物件指派一個可用區域,請自動將 ENIConfig 物件指派給您的節點。若要將多個 ENIConfig 物件與相同可用區域建立關聯,請手動將 ENIConfig 物件指派給您的節點。
自動指派 ENIConfig 物件
執行以下命令:
kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone
手動關聯 ENIConfig 物件
**重要:**請確保節點與其所關聯的 ENIConfig 物件中的子網路位於相同可用區域。
執行以下命令:
kubectl annotate node example-node-name k8s.amazonaws.com/eniConfig=example-availability-zone
**注意:**將 example-node-name 替換為您節點的完整識別碼。將 example-availability-zone 替換為您在建立 ENIConfig 物件時所使用的可用區域名稱。
啟動新節點
若要從 ENIConfig 子網路分配次要網路介面和 IP 位址,您必須啟動新節點。現有節點將繼續使用其原始網路組態,直到您替換它們為止。
請完成下列步驟:
- 檢查您是否將自訂 Amazon Machine Image (AMI) ID 與自我管理節點群組一起使用。
- 如果您使用自訂 AMI ID,請確定每個節點的最大 Pod 數量值。執行 max-pods-calculator.sh 指令碼時,必須加入 --cni-custom-networking-enabled 參數。
**注意:**如果您未使用啟動範本或 AMI ID,則 Amazon EKS 會自動設定 Pod 的最大數量。
- 請根據您的作業系統 (OS),更新新節點上的使用者資料指令碼,以設定您所需的最大 Pod 數量:
Amazon Linux 2、Bottlerocket、Ubuntu 20.04 及更新版本、Windows Server 2019 及更新版本
#!/bin/bash
/etc/eks/bootstrap.sh example-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=example-max-pods'
--user-data '#!/bin/bash /etc/eks/nodeadm init \ --container-runtime containerd \ --cluster-name example-cluster-name \ --max-pods example-max-pods'
**注意:**在上述命令中,將 example-cluster-name 替換為您的 EKS 叢集的名稱。將 example-max-pods 替換為每個節點的最大 Pod 數。
有關 bootstrap 的詳細資訊,請參閱 GitHub 網站上的 awslabs/amazon-eks-ami。有關 nodeadm 的資訊,請參閱從 Amazon Linux 2 升級到 Amazon Linux 2023。
Amazon Linux 2023 (AL2023)
- 重新建立您的 Pod,以使用新的自訂網路組態。