Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
如何對 Amazon EKS 使用多個 CIDR 範圍?
我想對 Amazon Elastic Kubernetes Service (Amazon EKS) 使用多個 CIDR 範圍來解決 Pod 的問題。
簡短描述
在完成解決方法部分的步驟之前,確認您擁有下列項目:
- 正在執行的 Amazon EKS 叢集
- 最新版本的 AWS Command Line Interface (AWS CLI)
- 管理 Amazon Virtual Private Cloud (Amazon VPC) 的 AWS Identity and Access Management (IAM) 許可
- 具有建立自訂資源和編輯 DaemonsSet 許可的 kubectl
- 您的系統上安裝了 jq 版本
**注意:**若要下載並安裝 jq,請參閱 jq 網站上的下載 jq。 - 具有 Bash Shell 的 Unix 系統
- 已設定的 VPC
注意:
- 在建立叢集之前或之後,您可以將私有 (RFC 1918) 和公有 (非 RFC 1918) CIDR 區塊與 VPC 關聯。
- 在業者級網路位址轉譯 (NAT) 的情況下,100.64.0.0/10 是私有網路範圍。私有網路範圍在共用位址空間中使用,用於服務提供者與其訂閱用戶之間的通訊。為使 Pod 與網際網路通訊,必須在路由表中設定 NAT 閘道。AWS Fargate 叢集不支援 DaemonSets。若要將次要 CIDR 範圍新增至 Fargate 設定檔,請使用 VPC 次要 CIDR 區塊中的子網路。然後,在將子網路新增至 Fargate 設定檔之前,標記新的子網路。
**重要:**在某些情況下,Amazon EKS 無法與您在建立叢集後新增至 VPC 之 CIDR 區塊中的子網路中啟動的節點通訊。在將 CIDR 區塊新增到現有叢集時,更新的範圍最多可能需要 5 小時才會顯示。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
在下列解決方法中,首先設定您的 VPC。然後,設定 CNI 外掛程式使用新的 CIDR 範圍。
新增更多 CIDR 範圍以擴大您的 VPC 網路
請完成下列步驟:
-
找到您的 VPC。
如果您的 VPC 具有標籤,請執行下列命令以尋找您的 VPC:VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values=yourVPCName | jq -r '.Vpcs[].VpcId')
如果您的 VPC 沒有標籤,請執行下列命令以列出 AWS 區域中的所有 VPC:
aws ec2 describe-vpcs --filters | jq -r '.Vpcs[].VpcId'
-
若要將您的 VPC 連接至 VPC_ID 變數,請執行下列命令:
export VPC_ID=vpc-xxxxxxxxxxxx
若要將範圍為 100.64.0.0/16 的其他 CIDR 區塊關聯至 VPC,請執行下列命令:
aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 100.64.0.0/16
使用新的 CIDR 範圍建立子網絡
請完成下列步驟:
-
若要列出您區域中的所有可用區域,請執行下列命令:
aws ec2 describe-availability-zones --region us-east-1 --query 'AvailabilityZones[*].ZoneName'
**注意:**將 us-east-1 取代為您的區域。
-
選擇要在其中新增子網路的可用區域,然後將可用區域指派給變數。例如:
export AZ1=us-east-1a export AZ2=us-east-1b export AZ3=us-east-1c
**注意:**若要新增更多可用區域,請建立其他變數。
-
若要在使用新 CIDR 範圍的 VPC 下建立新的子網路,請執行下列命令:
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)
-
(選用) 設定鍵值對,為子網路新增名稱標籤。例如:
aws ec2 create-tags --resources $CUST_SNET1 --tags Key=Name,Value=SubnetA aws ec2 create-tags --resources $CUST_SNET2 --tags Key=Name,Value=SubnetB aws ec2 create-tags --resources $CUST_SNET3 --tags Key=Name,Value=SubnetC
將新的子網路關聯至路由表
請完成下列步驟:
-
若要在 VPC 下列出整個路由表,請執行下列命令:
aws ec2 describe-route-tables --filters Name=vpc-id,Values=$VPC_ID |jq -r '.RouteTables[].RouteTableId'
-
若要將路由表匯出至變數,請執行下列命令:
export RTASSOC_ID=rtb-abcabcabc
**注意:**將 rtb-abcabcabc 取代為上一步中的值。
-
將路由表關聯至所有新的子網路。例如:
aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET1 aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET2 aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET3
如需詳細資訊,請參閱路由一節 (在範例: 在私有子網路和 NAT 中具有伺服器的 VPC 中)。
設定 CNI 外掛程式使用新的 CIDR 範圍
請完成下列步驟:
-
將最新版本的 vpc-cni 外掛程式新增至叢集。若要驗證叢集中的版本,請執行下列命令:
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
若要開啟 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=failure-domain.beta.kubernetes.io/zone
-
若要為所有子網路和可用區域建立 ENIConfig 自訂資源,請執行下列命令:
cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ1 spec: subnet: $CUST_SNET1 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ2 spec: subnet: $CUST_SNET2 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ3 spec: subnet: $CUST_SNET3 EOF
**注意:**ENIConfig 必須與工作節點的可用區域相符。
-
啟動工作節點,以便 CNI 外掛程式 (ipamd) 可以將新 CIDR 範圍中的 IP 位址分配給新的工作節點。
如果您使用自訂網路,則主要網路介面不會用於 Pod 佈置。在這種情況下,必須先使用下列公式更新 max-pods:maxPods = (number of interfaces - 1) \* (max IPv4 addresses per interface - 1) + 2
如果您使用自我管理的節點群組,請依照啟動自我管理的 Amazon Linux 節點中的步驟操作。請勿指定您在 ENIConfig 資源中使用的子網路。而應為 BootstrapArguments 參數指定下列項目:
--use-max-pods false --kubelet-extra-args '--max-pods=<20>'
如果您使用沒有啟動範本或指定的 Amazon Machine Image (AMI) ID 的管理員節點群組,則受管理節點群組會自動計算最大 Pod 值。請遵循建立受管理節點群組中的步驟。或者,使用 Amazon EKS CLI 建立受管理的節點群組:
aws eks create-nodegroup --cluster-name <sample-cluster-name> --nodegroup-name <sample-nodegroup-name> --subnets <subnet-123 subnet-456> --node-role <arn:aws:iam::123456789012:role/SampleNodeRole>
如果您使用具有指定的 AMI ID 的受管理節點群組啟動範本,請在啟動範本中指定 Amazon EKS 最佳化的 AMI ID。或者,使用基於 Amazon EKS 最佳化 AMI 的自訂 AMI。然後,使用啟動範本來部署節點群組,並在啟動範本中提供下列使用者資料:
#!/bin/bash /etc/eks/bootstrap.sh <my-cluster-name> --kubelet-extra-args <'--max-pods=20'>
-
記下子網路的安全群組,並將安全群組套用至關聯的 ENIConfig:
cat <<EOF | kubectl apply -f -apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ1 spec: securityGroups: - sg-xxxxxxxxxxxx subnet: $CUST_SNET1 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ2 spec: securityGroups: - sg-xxxxxxxxxxxx subnet: $CUST_SNET2 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ3 spec: securityGroups: - sg-xxxxxxxxxxxx subnet: $CUST_SNET3 EOF
**注意:**將 sg-xxxxxxxxxxxx 取代為您的安全群組。
-
啟動新部署以測試組態:
kubectl create deployment nginx-test --image=nginx --replicas=10 kubectl get pods -o wide --selector=app=nginx-test
**注意:**在先前的測試部署中,新增了十個新的 Pod,並在新的工作節點上排定了新的 CIDR 範圍。

相關內容
- 已提問 7 個月前lg...
- 已提問 5 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前