跳至內容

如何對 Amazon EKS 使用多個 CIDR 範圍?

3 分的閱讀內容
0

我想使用 Amazon Elastic Kubernetes Service (Amazon EKS) 的多個 CIDR 範圍來解決 Pod 問題。

簡短描述

若要在 Amazon EKS 中使用多個 CIDR 範圍,請完成下列步驟:

  1. 新增更多 CIDR 範圍,擴大您的虛擬私有雲端 (VPC) 網路。
  2. 建立具有新 CIDR 範圍的子網路。
  3. 將您的新子網路關聯到路由表。
  4. 設定 Amazon Virtual Private Cloud (Amazon VPC) 容器網路介面 (CNI) 外掛程式以使用新的 CIDR 範圍。

**注意:**最佳實務是使用業者級 NAT (CGN) 空間中的 CIDR (/16),例如 100.64.0.0/10198.19.0.0/16。您可以使用有效的 VPC 範圍作為自訂網路中的次要 CIDR 範圍。然而,這些範圍在公司環境中使用的可能性較小。如需自訂網路要求的詳細資訊,請參閱注意事項

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

**先決條件:**您必須具有以下組態:

新增更多 CIDR 範圍,擴大您的 VPC 網路

請完成下列步驟:

  1. 若要擷取叢集 VPC 的 ID 並將其儲存在變數中,請執行下列 AWS CLI describe-cluster 命令:
    VPC_ID=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query "cluster.resourcesVpcConfig.vpcId" --output text)
    **注意:**將 CLUSTER_NAME 替換為您的叢集名稱,並將 REGION_CODE 替換為您部署叢集的 AWS 區域。
  2. 若要將另一個具有 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 範圍建立子網路

請完成下列步驟:

  1. 若要列出您所在區域的所有可用區域,請執行以下 describe-availability-zones 命令:
    aws ec2 describe-availability-zones --region REGION_CODE --query 'AvailabilityZones[*].ZoneName'
    **注意:**將 REGION_CODE 替換為您部署資源的區域。
  2. 在現有子網路所在的每個可用區域中,建立要使用的子網路。若要在 VPC 下使用新的 CIDR 範圍建立新的子網路,請執行以下 create-subnet 命令。
    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)
    **注意:**將 AZ1AZ2AZ3 替換為您現有的子網路可用區域。
  3. (選用) 若要設定鍵值組,以將名稱標籤新增至子網路,請執行下列 create-tags 命令:
    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
    **注意:**將 KEY 替換為標籤鍵,將 VALUE 替換為標籤值。

將新子網路關聯到路由表

預設情況下,Amazon VPC 會將您的新子網路與您 VPC 的主路由表建立關聯。此路由表僅允許在 VPC 中部署的資源之間進行通訊。若要允許與 VPC CIDR 區塊以外的 IP 位址進行通訊,您必須為子網路建立自己的路由表

設定 Amazon VPC CNI 外掛程式,以使用新的 CIDR 範圍

請完成下列步驟:

  1. 確定您執行的是適合您 Kubernetes 版本的正確外掛程式版本。若要驗證版本,請執行以下命令:

    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

    如果您沒有正確的外掛程式版本,請更新 Amazon VPC CNI

  2. 若要啟動 Amazon VPC CNI 外掛程式的自訂網路組態,請執行以下命令:

    kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  3. 若要新增 ENIConfig 標籤來識別您的工作者節點,請執行下列命令:

    kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone
  4. 若要為所有子網路和可用區域建立 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 資源名稱與您建立新子網路的可用區域名稱相同。

  5. 如果您使用自我管理節點群組,請啟動自我管理工作節點,以允許外掛程式為其指派 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 值。

  6. 新節點準備好後,請清空先前的節點以正常關閉 Pod。如需詳細資訊,請參閱 Kubernetes 網站上的安全清空節點。如果節點位於現有的受管節點群組中,則執行下列命令以刪除該節點群組:

    aws eks delete-nodegroup --cluster-name CLUSTER_NAME --nodegroup-name my-nodegroup

    **注意:**將 CLUSTER_NAME 替換為您的叢集名稱,並將 my-nodegroup 替換為您的節點群組名稱。

  7. 若要啟動新部署來測試組態,請執行下列命令:

    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"

AWS 官方已更新 4 個月前