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

4 分的閱讀內容
0

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

簡短描述

在完成解決方法部分的步驟之前,確認您擁有下列項目:

注意:

**重要:**在某些情況下,Amazon EKS 無法與您在建立叢集後新增至 VPC 之 CIDR 區塊中的子網路中啟動的節點通訊。在將 CIDR 區塊新增到現有叢集時,更新的範圍最多可能需要 5 小時才會顯示。

解決方法

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

在下列解決方法中,首先設定您的 VPC。然後,設定 CNI 外掛程式使用新的 CIDR 範圍。

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

請完成下列步驟:

  1. 找到您的 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'
  2. 若要將您的 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 範圍建立子網絡

請完成下列步驟:

  1. 若要列出您區域中的所有可用區域,請執行下列命令:

    aws ec2 describe-availability-zones --region us-east-1 --query 'AvailabilityZones[*].ZoneName'

    **注意:**將 us-east-1 取代為您的區域。

  2. 選擇要在其中新增子網路的可用區域,然後將可用區域指派給變數。例如:

    export AZ1=us-east-1a
    export AZ2=us-east-1b
    export AZ3=us-east-1c

    **注意:**若要新增更多可用區域,請建立其他變數。

  3. 若要在使用新 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)
  4. (選用) 設定鍵值對,為子網路新增名稱標籤。例如:

    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

將新的子網路關聯至路由表

請完成下列步驟:

  1. 若要在 VPC 下列出整個路由表,請執行下列命令:

    aws ec2 describe-route-tables --filters Name=vpc-id,Values=$VPC_ID |jq -r '.RouteTables[].RouteTableId'
  2. 若要將路由表匯出至變數,請執行下列命令:

    export RTASSOC_ID=rtb-abcabcabc

    **注意:**將 rtb-abcabcabc 取代為上一步中的值。

  3. 將路由表關聯至所有新的子網路。例如:

    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 範圍

請完成下列步驟:

  1. 將最新版本的 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
  2. 若要新增 ENIConfig 標籤以識別您的工作節點,請執行下列命令:

    kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone
  3. 若要為所有子網路和可用區域建立 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 必須與工作節點的可用區域相符。

  4. 啟動工作節點,以便 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'>
  5. 記下子網路的安全群組,並將安全群組套用至關聯的 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 取代為您的安全群組。

  6. 終止舊工作節點

  7. 啟動新部署以測試組態:

    kubectl create deployment nginx-test --image=nginx --replicas=10   
    kubectl get pods -o wide --selector=app=nginx-test

    **注意:**在先前的測試部署中,新增了十個新的 Pod,並在新的工作節點上排定了新的 CIDR 範圍。

AWS 官方
AWS 官方已更新 1 個月前