如何對 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 年前