Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何對 Amazon EKS 使用多個 CIDR 範圍?
我想使用 Amazon Elastic Kubernetes Service (Amazon EKS) 的多個 CIDR 範圍來解決 Pod 問題。
簡短描述
若要在 Amazon EKS 中使用多個 CIDR 範圍,請完成下列步驟:
- 新增更多 CIDR 範圍,擴大您的虛擬私有雲端 (VPC) 網路。
- 建立具有新 CIDR 範圍的子網路。
- 將您的新子網路關聯到路由表。
- 設定 Amazon Virtual Private Cloud (Amazon VPC) 容器網路介面 (CNI) 外掛程式以使用新的 CIDR 範圍。
**注意:**最佳實務是使用業者級 NAT (CGN) 空間中的 CIDR (/16),例如 100.64.0.0/10 或 198.19.0.0/16。您可以使用有效的 VPC 範圍作為自訂網路中的次要 CIDR 範圍。然而,這些範圍在公司環境中使用的可能性較小。如需自訂網路要求的詳細資訊,請參閱注意事項。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
**先決條件:**您必須具有以下組態:
- 正在執行的 Amazon EKS 叢集
- 用於管理 Amazon VPC 的 AWS Identity and Access Management (IAM) 權限
- 具有建立自訂資源和編輯 DaemonSet 權限的 kubectl
- 您的系統上已安裝 jq 版本
**注意:**若要下載並安裝 jq,請參閱 jq 網站上的下載 jq。 - 具有 Bash Shell 的 Unix 系統
- 已設定的 VPC
新增更多 CIDR 範圍,擴大您的 VPC 網路
請完成下列步驟:
- 若要擷取叢集 VPC 的 ID 並將其儲存在變數中,請執行下列 AWS CLI describe-cluster 命令:
**注意:**將 CLUSTER_NAME 替換為您的叢集名稱,並將 REGION_CODE 替換為您部署叢集的 AWS 區域。VPC_ID=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query "cluster.resourcesVpcConfig.vpcId" --output text) - 若要將另一個具有 100.64.0.0/16 範圍的 CIDR 區塊與 VPC 建立關聯,請執行下列 associate-vpc-cidr-block 命令:
aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 100.64.0.0/16
使用新的 CIDR 範圍建立子網路
請完成下列步驟:
- 若要列出您所在區域的所有可用區域,請執行以下 describe-availability-zones 命令:
**注意:**將 REGION_CODE 替換為您部署資源的區域。aws ec2 describe-availability-zones --region REGION_CODE --query 'AvailabilityZones[*].ZoneName' - 在現有子網路所在的每個可用區域中,建立要使用的子網路。若要在 VPC 下使用新的 CIDR 範圍建立新的子網路,請執行以下 create-subnet 命令。
**注意:**將 AZ1、AZ2 和 AZ3 替換為您現有的子網路可用區域。CUST_SNET1=$(aws ec2 create-subnet --cidr-block 100.64.0.0/19 --vpc-id $VPC_ID --availability-zone AZ1 | jq -r .Subnet.SubnetId) CUST_SNET2=$(aws ec2 create-subnet --cidr-block 100.64.32.0/19 --vpc-id $VPC_ID --availability-zone AZ2 | jq -r .Subnet.SubnetId) CUST_SNET3=$(aws ec2 create-subnet --cidr-block 100.64.64.0/19 --vpc-id $VPC_ID --availability-zone AZ3 | jq -r .Subnet.SubnetId) - (選用) 若要設定鍵值組,以將名稱標籤新增至子網路,請執行下列 create-tags 命令:
**注意:**將 KEY 替換為標籤鍵,將 VALUE 替換為標籤值。aws ec2 create-tags --resources $CUST_SNET1 --tags Key=KEY,Value=VALUE aws ec2 create-tags --resources $CUST_SNET2 --tags Key=KEY,Value=VALUE aws ec2 create-tags --resources $CUST_SNET3 --tags Key=KEY,Value=VALUE
將新子網路關聯到路由表
預設情況下,Amazon VPC 會將您的新子網路與您 VPC 的主路由表建立關聯。此路由表僅允許在 VPC 中部署的資源之間進行通訊。若要允許與 VPC CIDR 區塊以外的 IP 位址進行通訊,您必須為子網路建立自己的路由表。
設定 Amazon VPC CNI 外掛程式,以使用新的 CIDR 範圍
請完成下列步驟:
-
確定您執行的是適合您 Kubernetes 版本的正確外掛程式版本。若要驗證版本,請執行以下命令:
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2如果您沒有正確的外掛程式版本,請更新 Amazon VPC CNI。
-
若要啟動 Amazon VPC CNI 外掛程式的自訂網路組態,請執行以下命令:
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true -
若要新增 ENIConfig 標籤來識別您的工作者節點,請執行下列命令:
kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone -
若要為所有子網路和可用區域建立 ENIConfig 自訂資源,請執行下列命令:
cat <<EOF | kubectl apply -f -apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ1 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET1 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ2 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET2 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ3 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET3 EOF**注意:**將 cluster_security_group_id 替換為您要用於每個 ENIConfig 資源之現有安全群組的 ID。ENIConfig 資源名稱與您建立新子網路的可用區域名稱相同。
-
如果您使用自我管理節點群組,請啟動自我管理工作節點,以允許外掛程式為其指派 IP 位址。在 Subnets (子網路),請使用您在建立叢集時選擇的原始子網路,而不是 ENIConfig 資源中使用的新子網路。您也可以使用具有啟動範本的受管節點群組來啟動節點。在這兩種情況下,您都必須為您的執行個體類型指定正確的 max-pods 值。這是因為 Amazon EKS 中的自訂網路在配置 Pod 時,不會使用主網路介面。請務必在執行 max-pods-calculator.sh 指令碼時,新增 --cni-custom-networking-enabled 參數。
然後,執行以下命令為您的自管理節點指定 max-pods 值:--use-max-pods false --kubelet-extra-args '--max-pods=20'注意:將 20 替換為您計算的 max-pods 值。
對於受管節點群組,將以下指令碼新增至使用者資料:#!/bin/bash /etc/eks/bootstrap.sh my-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=20'注意:將 my-cluster-name 替換為您的叢集名稱,並將 20 替換為您計算的 max-pods 值。在啟動範本中,指定 Amazon EKS 最佳化的 Amazon Machine Image (AMI) ID,或根據 Amazon EKS 最佳化 AMI 建置的自訂 AMI。Amazon Linux 2023 (AL2023) AMI 使用 nodeadm 程序。如需如何變更使用者資料組態的資訊,請參閱從 Amazon Linux 2 升級到 Amazon Linux 2023。
如果您使用沒有啟動範本或指定 AMI ID 的受管節點群組,則受管節點群組會自動計算 max-pods 值。 -
新節點準備好後,請清空先前的節點以正常關閉 Pod。如需詳細資訊,請參閱 Kubernetes 網站上的安全清空節點。如果節點位於現有的受管節點群組中,則執行下列命令以刪除該節點群組:
aws eks delete-nodegroup --cluster-name CLUSTER_NAME --nodegroup-name my-nodegroup**注意:**將 CLUSTER_NAME 替換為您的叢集名稱,並將 my-nodegroup 替換為您的節點群組名稱。
-
若要啟動新部署來測試組態,請執行下列命令:
kubectl create deployment nginx-test --image=nginx --replicas=10 kubectl get pods -o wide --selector=app=nginx-test**注意:**上述命令會新增 10 個新 Pod,並將其排程到使用新 CIDR 範圍的新工作節點上。
**重要:**叢集最多可能需要 5 個小時才能識別與 VPC 關聯的新 CIDR 區塊,並將其列入允許清單。在此期間,Amazon EKS 控制平面無法與您在新子網路中啟動的 Pod 通訊。如果 api-server 使用 webhook、kubectl logs 命令或 kubectl exec 命令聯絡 Pod,那麼您可能會收到下列錯誤訊息:
"failed calling webhook "linkerd-proxy-injector.linkerd.io": failed to call webhook: Post "https://linkerd-proxy-injector.linkerd.svc:443/?timeout=10s": Address is not allowed"
- 語言
- 中文 (繁體)

相關內容
- 已提問 1 年前