自訂 Amazon EKS 節點中的次要網路介面 - Amazon EKS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

自訂 Amazon EKS 節點中的次要網路介面

在開始教學課程之前,請先完成下列操作:

  • 檢閱考量事項

  • 熟悉 Amazon VPC CNI plugin for Kubernetes 會建立次要網路介面,並將 IP 地址指派給 Pods。 如需詳細資訊,請參閱 上的 ENI 配置 GitHub.

  • 在您的裝置 2.12.3 or AWS CloudShell 上安裝和設定的 AWS 命令列介面 (AWS CLI) 版本 1.27.160 或更新版本。若要檢查您目前的版本,請使用 aws --version | cut -d / -f2 | cut -d ' ' -f1。套件管理員apt-get,例如 yum、 或 Homebrew for macOS 通常是最新版本 AWS CLI 後面的幾個版本。若要安裝最新版本,請參閱 AWS 命令列介面使用者指南中的使用 aws 設定安裝 和 快速組態。 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config安裝在 in AWS CLI 中的 AWS CloudShell 版本也可能是最新版本後面的幾個版本。若要更新它,請參閱 AWS CLI 使用者指南中的將 Word 安裝到您的主目錄 AWS CloudShell

  • kubectl 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與 相同,也可以比 更早或更晚的一個次要版本相同 Kubernetes 叢集的版本。例如,如果您的叢集版本為 1.29,則可以搭配使用 kubectl 1.281.291.30 版。若要安裝或升級 kubectl,請參閱 設定 kubectl 和 eksctl

  • 建議您在 Bash shell 中完成本主題中的步驟。如果您不使用 Bash Shell,則某些指令碼命令,例如換行字元和變數的設定和使用方式需要調整 Shell。此外,您的 Shell 的引用及轉義規則可能會有所不同。如需詳細資訊,請參閱 AWS 命令列介面使用者指南中的使用引號搭配 AWS CLI 中的字串

對於本教學課程,我們建議您使用 example values,除非已註明要取代它們。您可以取代任何 example value 完成生產叢集的步驟時。我們建議您在同一終端中完成所有步驟。這是因為在整個步驟中設定和使用變數,並且不會存在於不同的終端機中。

本主題中的命令會使用使用 AWS CLI 範例中列出的慣例進行格式化。如果您正在針對與您正在使用的 AWS CLI 設定檔中定義的預設 AWS 區域不同 AWS 區域中的資源,從命令列執行命令,則需要--region region-code 新增至命令。

當您想要將自訂聯網部署到生產叢集時,請跳至步驟 2:設定您的 VPC

步驟 1:建立測試 VPC 和叢集

下列程序可協助您建立測試 VPC 和叢集,並為該叢集設定自訂聯網。我們不建議將測試叢集用於生產工作負載,因為本主題未涵蓋您可能在生產叢集上使用的幾個不相關功能。如需詳細資訊,請參閱建立 Amazon EKS 叢集

  1. 定義 cluster_nameaccount_id變數。

    export cluster_name=my-custom-networking-cluster account_id=$(aws sts get-caller-identity --query Account --output text)
  2. 建立 VPC。

    1. 如果您要部署到測試系統,請使用 Amazon VPC 範本建立 CloudFormation EKS AWS 。

      aws cloudformation create-stack --stack-name my-eks-custom-networking-vpc \ --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml \ --parameters ParameterKey=VpcBlock,ParameterValue=192.168.0.0/24 \ ParameterKey=PrivateSubnet01Block,ParameterValue=192.168.0.64/27 \ ParameterKey=PrivateSubnet02Block,ParameterValue=192.168.0.96/27 \ ParameterKey=PublicSubnet01Block,ParameterValue=192.168.0.0/27 \ ParameterKey=PublicSubnet02Block,ParameterValue=192.168.0.32/27

      建立 AWS CloudFormation 堆疊需要幾分鐘的時間。若要檢查堆疊的部署狀態,請執行下列命令。

      aws cloudformation describe-stacks --stack-name my-eks-custom-networking-vpc --query Stacks\[\].StackStatus --output text

      在命令的輸出為 之前,請勿繼續下一個步驟CREATE_COMPLETE

    2. 使用範本建立之私有子網路 IDs 的值來定義變數。

      subnet_id_1=$(aws cloudformation describe-stack-resources --stack-name my-eks-custom-networking-vpc \ --query "StackResources[?LogicalResourceId=='PrivateSubnet01'].PhysicalResourceId" --output text) subnet_id_2=$(aws cloudformation describe-stack-resources --stack-name my-eks-custom-networking-vpc \ --query "StackResources[?LogicalResourceId=='PrivateSubnet02'].PhysicalResourceId" --output text)
    3. 使用上一步中擷取的子網的可用區域來定義變數。

      az_1=$(aws ec2 describe-subnets --subnet-ids $subnet_id_1 --query 'Subnets[*].AvailabilityZone' --output text) az_2=$(aws ec2 describe-subnets --subnet-ids $subnet_id_2 --query 'Subnets[*].AvailabilityZone' --output text)
  3. 建立叢集 IAM 角色。

    1. 執行下列命令以建立 IAM 信任政策 JSON 檔案。

      cat >eks-cluster-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
    2. 建立 Amazon EKS 叢集 IAM 角色。如有必要,請在 eks-cluster-role-trust-policy.json 前面加上您在上一步中寫入檔案的電腦的路徑。命令會將您在上一步驟中建立的信任策略與角色相關聯。若要建立 IAM 角色,建立角色的 IAM 主體必須指派 iam:CreateRole動作 (許可)。

      aws iam create-role --role-name myCustomNetworkingAmazonEKSClusterRole --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
    3. 將名為 link:arn:aws: iam::aws:policy/AmazonEKSCluster Policy【AmazonEKSCluster Policy,type="console"】 的 Amazon EKS 受管政策連接至角色。若要將 IAM 政策連接至 IAM 主體,必須將連接政策的主體指派至下列其中一個 IAM 動作 (許可): iam:AttachUserPolicyiam:AttachRolePolicy

      aws iam attach-role-policy --policy-arn arn:aws: iam::aws:policy/AmazonEKSClusterPolicy --role-name myCustomNetworkingAmazonEKSClusterRole
  4. 建立 Amazon EKS 叢集,並將您的裝置設定為與其通訊。

    1. 建立叢集。

      aws eks create-cluster --name my-custom-networking-cluster \ --role-arn arn:aws: iam::$account_id:role/myCustomNetworkingAmazonEKSClusterRole \ --resources-vpc-config subnetIds=$subnet_id_1","$subnet_id_2
      注意

      您可能會收到錯誤,表示請求中的其中一個可用區域沒有足夠的容量來建立 Amazon EKS 叢集。如果發生這種情況,錯誤輸出包含的可用區域可支援新的叢集。使用至少兩個位於帳戶的支援可用區域子網路來建立您的叢集。如需詳細資訊,請參閱容量不足

    2. 建立叢集需要幾分鐘才能完成。若要檢查叢集的部署狀態,請執行下列命令。

      aws eks describe-cluster --name my-custom-networking-cluster --query cluster.status

      在命令的輸出為 之前,請勿繼續下一個步驟"ACTIVE"

    3. 設定 kubectl 以便與叢集通訊。

      aws eks update-kubeconfig --name my-custom-networking-cluster

步驟 2:設定您的 VPC

本教學課程需要步驟 1 中建立的 VPC:建立測試 Word 和叢集。 VPC 對於生產叢集,VPC請取代所有 example values 使用您自己的 。

  1. 確認您目前已安裝 Amazon VPC CNI plugin for Kubernetes 是最新版本。若要判斷 Amazon EKS 附加元件類型的最新版本,並將您的版本更新為最新版本,請參閱 更新 Amazon EKS 附加元件。若要確定自我管理附加元件類型的最新版本並更新您的版本,請參閱 Amazon VPC CNI

  2. 擷取叢集 VPC 的 ID,並將其存放在變數中,以供後續步驟使用。對於生產叢集,請取代 my-custom-networking-cluster 您的叢集名稱。

    vpc_id=$(aws eks describe-cluster --name my-custom-networking-cluster --query "cluster.resourcesVpcConfig.vpcId" --output text)
  3. 將額外的無類別網域間路由 (CIDR) 區塊與叢集的 VPC 建立關聯。CIDR 區塊不能與任何現有關聯的 CIDR 區塊重疊。

    1. 檢視與 CIDR 相關聯的目前 VPC 區塊。

      aws ec2 describe-vpcs --vpc-ids $vpc_id \ --query 'Vpcs[*].CidrBlockAssociationSet[*].{CIDRBlock: CidrBlock, State: CidrBlockState.State}' --out table

      範例輸出如下。

      ---------------------------------- | DescribeVpcs | +-----------------+--------------+ | CIDRBlock | State | +-----------------+--------------+ | 192.168.0.0/24 | associated | +-----------------+--------------+
    2. 將其他 CIDR 區塊與 VPC 建立關聯。如需詳細資訊,請參閱 Amazon CIDR IPv4 使用者指南中的將其他 VPC 區塊與 Word 建立關聯。 VPC

      aws ec2 associate-vpc-cidr-block --vpc-id $vpc_id --cidr-block 192.168.1.0/24
    3. 確認新區塊已關聯。

      aws ec2 describe-vpcs --vpc-ids $vpc_id --query 'Vpcs[*].CidrBlockAssociationSet[*].{CIDRBlock: CidrBlock, State: CidrBlockState.State}' --out table

      範例輸出如下。

      ---------------------------------- | DescribeVpcs | +-----------------+--------------+ | CIDRBlock | State | +-----------------+--------------+ | 192.168.0.0/24 | associated | | 192.168.1.0/24 | associated | +-----------------+--------------+

    在新的 CIDR 區塊State為 之前,請勿繼續下一個步驟associated

  4. 在現有子網所在的每個可用區域中建立任意數量的子網。指定您在上一個步驟中與 CIDR 相關聯的 CIDR 區塊內的 VPC 區塊。

    1. 建立新子網。子網路必須在與現有子網路不同的 CIDRVPC 區塊中建立,但與現有子網路位於相同的可用區域中。在此範例中,會在目前私有子網路所在的每個可用區域中的新 CIDR 區塊中建立一個子網路。所建立子網路的 IDs 會儲存在變數中,以供後續步驟使用。這些Name值與上一個步驟中使用 Amazon EKS VPC 範本建立的子網路所指派的值相符。不需要名稱。您可以使用不同的名稱。

      new_subnet_id_1=$(aws ec2 create-subnet --vpc-id $vpc_id --availability-zone $az_1 --cidr-block 192.168.1.0/27 \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=my-eks-custom-networking-vpc-PrivateSubnet01},{Key=kubernetes.io/role/internal-elb,Value=1}]' \ --query Subnet.SubnetId --output text) new_subnet_id_2=$(aws ec2 create-subnet --vpc-id $vpc_id --availability-zone $az_2 --cidr-block 192.168.1.32/27 \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=my-eks-custom-networking-vpc-PrivateSubnet02},{Key=kubernetes.io/role/internal-elb,Value=1}]' \ --query Subnet.SubnetId --output text)
      重要

      根據預設,您的新子網路會隱含地與 VPC 的主要路由表相關聯。此路由表允許在 VPC 中部署的所有資源之間進行通訊。但是,它不允許與 IP 地址位於與您的 CIDR 相關聯的 VPC 區塊之外的資源進行通訊。您可以將自己的路由表與子網相關聯以變更此行為。如需詳細資訊,請參閱 Amazon VPC 使用者指南中的子網路路由表

    2. 檢視 VPC 中的目前子網路。

      aws ec2 describe-subnets --filters "Name=vpc-id,Values=$vpc_id" \ --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \ --output table

      範例輸出如下。

      ---------------------------------------------------------------------- | DescribeSubnets | +------------------+--------------------+----------------------------+ | AvailabilityZone | CidrBlock | SubnetId | +------------------+--------------------+----------------------------+ | us-west-2d | 192.168.0.0/27 | subnet-example1 | | us-west-2a | 192.168.0.32/27 | subnet-example2 | | us-west-2a | 192.168.0.64/27 | subnet-example3 | | us-west-2d | 192.168.0.96/27 | subnet-example4 | | us-west-2a | 192.168.1.0/27 | subnet-example5 | | us-west-2d | 192.168.1.32/27 | subnet-example6 | +------------------+--------------------+----------------------------+

      您可以在 CIDR 192.168.1.0 區塊中看到您建立的子網路與 CIDR 192.168.0.0 區塊中的子網路位於相同的可用區域中。

步驟 3:設定 Kubernetes resources

  1. true中將AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG環境變數設定為 aws-node DaemonSet.

    kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  2. 擷取叢集安全群組的 ID,並將其存放在變數中以供下一步驟使用。當您建立叢集時,Amazon EKS 會自動建立此安全群組。

    cluster_security_group_id=$(aws eks describe-cluster --name $cluster_name --query cluster.resourcesVpcConfig.clusterSecurityGroupId --output text)
  3. 為您要部署的每個子網路建立ENIConfig自訂資源 Pods in.

    1. 為每個網路介面組態建立唯一的檔案。

      + 下列命令會為上一個步驟中建立的兩個子網路建立個別ENIConfig的檔案。name 的值必須是唯一的值。此名稱與子網所在的可用區域相同。叢集安全群組指派給 ENIConfig

      +

cat >$az_1.yaml <<EOF
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
  name: $az_1
spec:
  securityGroups:
    - $cluster_security_group_id
  subnet: $new_subnet_id_1
EOF
cat >$az_2.yaml <<EOF apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $az_2 spec: securityGroups: - $cluster_security_group_id subnet: $new_subnet_id_2 EOF

+ 對於生產叢集,您可以對先前的命令進行下列變更:

+ * 取代 $cluster_security_group_id 包含您要用於每個 的現有安全群組 IDENIConfig* 我們建議您盡可能將 命名為與您將使用 ENIConfig的可用區域ENIConfigs相同的 。由於各種原因,您可能需要為您的 ENIConfigs 使用與可用區域名稱不同的名稱。例如,如果您在同一可用區域中有兩個以上的子網,並且希望將其與自訂聯網一起使用,則需要多個 ENIConfigs 用於相同的可用區域。由於每個 ENIConfig都需要唯一的名稱,因此您不能ENIConfigs使用可用區域名稱來命名多個 。

+ 如果您的ENIConfig名稱與可用區域名稱不同,請取代 $az_1 以及 $az_2 在先前的命令中使用您自己的名稱,並在本教學稍後的 ENIConfig 中註釋節點

+ NOTE:如果您未指定與生產叢集搭配使用的有效安全群組,且正在使用:

  • 版本 1.8.0或更新版本的 Amazon VPC CNI plugin for Kubernetes,則使用與節點的主要彈性網路介面相關聯的安全群組。

  • 的 版本 Amazon VPC CNI plugin for Kubernetes 早於 1.8.0,則 VPC 的預設安全群組會指派給次要網路介面。

    IMPORTANT:

  • AWS_VPC_K8S_CNI_EXTERNALSNAT=false 是 的 Amazon VPC CNI 外掛程式組態中的預設設定 Kubernetes。 如果您使用的是預設設定,則目的地為 IP 地址的流量不在與 Word 相關聯的其中一個 CIDRVPC 區塊內,請使用節點主要網路界面的安全群組和子網路。您 中定義用來建立次要網路介面ENIConfigs的子網路和安全群組不會用於此流量。如需有關此設定的詳細資訊,請參閱 啟用 的傳出網際網路存取 pods

  • 如果您也使用 的安全群組 Pods,SecurityGroupPolicy會使用在 中指定的安全群組,而不是在 中指定的安全群組ENIConfigs。如需詳細資訊,請參閱將安全群組指派給個別 pods

    1. 使用下列命令,將您建立的每個自訂資源檔案套用到叢集。

      kubectl apply -f $az_1.yaml kubectl apply -f $az_2.yaml
      1. 確認您的 ENIConfigs 已建立。

        kubectl get ENIConfigs

        範例輸出如下。

        NAME AGE us-west-2a 117s us-west-2d 105s
      2. 如果您要在生產叢集上啟用自訂聯網,並為您的可用區域以外的ENIConfigs項目命名,請跳至下一個步驟以部署 Amazon EC2 節點。

        Enable Kubernetes 將ENIConfig可用區域的 自動套用至叢集中建立的任何新 Amazon EC2 節點。

    2. 對於本教學課程中的測試叢集,請跳至下一步

      對於生產叢集,請檢查 annotation ENI_CONFIG_ANNOTATION_DEF 環境變數k8s.amazonaws.com/eniConfig的金鑰存在於 的容器規格中 aws-node DaemonSet.

      kubectl describe daemonset aws-node -n kube-system | grep ENI_CONFIG_ANNOTATION_DEF

      如果傳回輸出,則表示註釋已存在。如果未傳回輸出,表示變數尚未設定。對於生產叢集,您可以使用此設定或以下步驟中的設定。如果使用此設定,將會覆寫以下步驟中的設定。在本教學課程中,將使用下一步中的設定。

    3. 更新您的 aws-node DaemonSet 將ENIConfig可用區域的 自動套用至叢集中建立的任何新 Amazon EC2 節點。

      kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone

步驟 4:部署 Amazon EC2 節點

  1. 建立節點 IAM 角色。

    1. 執行下列命令以建立 IAM 信任政策 JSON 檔案。

      cat >node-role-trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
    2. 執行下列命令,以設定角色名稱的變數。您可以取代 myCustomNetworkingNodeRole 任何您選擇的名稱。

      export node_role_name=myCustomNetworkingNodeRole
    3. 建立 IAM 角色,並將其傳回的 Amazon Resource Name (ARN) 存放在變數中,以供後續步驟使用。

      node_role_arn=$(aws iam create-role --role-name $node_role_name --assume-role-policy-document file://"node-role-trust-relationship.json" \ --query Role.Arn --output text)
    4. 將三個必要的 IAM 受管政策連接至 IAM 角色。

      aws iam attach-role-policy \ --policy-arn arn:aws: iam::aws:policy/AmazonEKSWorkerNodePolicy \ --role-name $node_role_name aws iam attach-role-policy \ --policy-arn arn:aws: iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name $node_role_name aws iam attach-role-policy \ --policy-arn arn:aws: iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name $node_role_name
      重要

      為了簡化本教學課程,AmazonEKS_CNI_Policy 政策會連接至節點 IAM 角色。不過,在生產叢集中,我們建議將政策連接至僅與 搭配使用的個別 IAM 角色 Amazon VPC CNI plugin for Kubernetes。 如需詳細資訊,請參閱 設定 Amazon VPC CNI 外掛程式以使用 IRSA

  2. 建立下列其中一種節點群組類型。若要確定您想要部署的執行個體類型,請參閱 選擇最佳的 Amazon EC2 節點執行個體類型。針對本教學課程,完成 Managed沒有啟動範本或使用沒有指定 AMI ID 選項的啟動範本。如果您要將節點群組用於生產工作負載,建議您先熟悉所有受管節點群組為您的叢集建立受管節點群組和自我管理節點群組使用自我管理節點自行維護節點選項,再部署節點群組。

    • 受管:使用下列其中一個選項,部署節點群組:

      • 沒有啟動範本或沒有指定 AMI ID 的啟動範本 – 執行下列命令。對於本教學課程,請使用 example values。 對於生產節點群組,請取代所有 example values 使用您自己的 。節點群組名稱不能超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。

        aws eks create-nodegroup --cluster-name $cluster_name --nodegroup-name my-nodegroup \ --subnets $subnet_id_1 $subnet_id_2 --instance-types t3.medium --node-role $node_role_arn
      • 具有指定 AMI ID 的啟動範本::

        1. 判斷 Amazon EKS 建議的上限數量 Pods `for your nodes. Follow the instructions in 每個 Amazon EKS 執行個體類型的 Amazon EC2 建議最大 Pod, adding `--cni-custom-networking-enabled 該主題中的步驟 3。請記下輸出,以便在下一個步驟中使用。

        2. 在啟動範本中,指定 Amazon EKS 最佳化 AMI ID 或AMI建置於 Amazon EKS 最佳化 AMI 的自訂 Word,然後使用啟動範本部署節點群組,並在啟動範本中提供下列使用者資料。此使用者資料會將引數傳遞至 bootstrap.sh 檔案。如需引導檔案的詳細資訊,請參閱 上的 https://bootstrap.sh GitHub。 您可以取代 20 使用上一個步驟的值 (建議) 或您自己的值。

          /etc/eks/bootstrap.sh my-cluster --use-max-pods false --kubelet-extra-args '--max-pods=20'

          如果您建立的自訂 AMI 並非以 Amazon EKS 最佳化 AMI 建置,則需要自行自訂建立組態。

    • 自我管理

      1. 判斷 Amazon EKS 建議的上限數量 Pods 節點。請遵循 Amazon EKS 中針對每個 Amazon EC2 執行個體類型建議的最大 Pod 指示,--cni-custom-networking-enabled將 新增至該主題中的步驟 3。請記下輸出,以便在下一個步驟中使用。

      2. 使用建立自我管理的 Amazon Linux 節點中的說明部署節點群組。為 BootstrapArguments 參數指定下列文字。您可以取代 20 使用上一個步驟的值 (建議) 或您自己的值。

        --use-max-pods false --kubelet-extra-args '--max-pods=20'
        注意

        如果您想要生產叢集中的節點支援顯著較多的 Pods,在 Amazon EKS 中再次針對每個 Amazon EC2 執行個體類型執行指令碼建議的 Pod 上限。此外,將 --cni-prefix-delegation-enabled 選項新增制命令中。例如 110 會針對m5.large執行個體類型傳回 。如需有關如何啟用此功能的說明,請參閱 使用字首將更多 IP 地址指派給 Amazon EKS 節點。您可將此功能與自訂聯網搭配使用。

        建立節點群組需要幾分鐘的時間。您可以使用以下命令檢查受管節點群組的建立狀態。

        aws eks describe-nodegroup --cluster-name $cluster_name --nodegroup-name my-nodegroup --query nodegroup.status --output text

        在傳回的輸出為 之前,請勿繼續下一個步驟ACTIVE

  3. 針對本教學課程,您可以略過此步驟。

    對於生產叢集,如果您未將 命名為與正在使用的可用區域ENIConfigs相同,則必須使用應與節點搭配使用ENIConfig的名稱來註釋節點。如果您在每個可用區域中只有一個子網路,而且您使用與可用區域相同的名稱命名您的 ENIConfigs,則不需要此步驟。這是因為 Amazon VPC CNI plugin for Kubernetes 當您在上一個步驟中啟用正確 時, 會自動將其ENIConfig與節點建立關聯。

    1. 取得您叢集中的節點清單。

      kubectl get nodes

      範例輸出如下。

      NAME STATUS ROLES AGE VERSION ip-192-168-0-126.us-west-2.compute.internal Ready <none> 8m49s v1.22.9-eks-810597c ip-192-168-0-92.us-west-2.compute.internal Ready <none> 8m34s v1.22.9-eks-810597c
    2. 確定每個節點所在的可用區域。針對先前步驟傳回的每個節點執行下列命令。

      aws ec2 describe-instances --filters Name=network-interface.private-dns-name,Values=ip-192-168-0-126.us-west-2.compute.internal \ --query 'Reservations[].Instances[].{AvailabilityZone: Placement.AvailabilityZone, SubnetId: SubnetId}'

      範例輸出如下。

      [ { "AvailabilityZone": "us-west-2d", "SubnetId": "subnet-Example5" } ]
    3. 使用您為子網 ID 和可用區域建立的 ENIConfig 註釋每個節點。您只能使用一個 ENIConfig 註釋一個節點,但可以使用相同的 ENIConfig 註釋多個節點。取代 example values 使用您自己的 。

      kubectl annotate node ip-192-168-0-126.us-west-2.compute.internal k8s.amazonaws.com/eniConfig=EniConfigName1 kubectl annotate node ip-192-168-0-92.us-west-2.compute.internal k8s.amazonaws.com/eniConfig=EniConfigName2
  4. 如果您的生產叢集中有執行中的節點 Pods 在您使用自訂聯網功能切換到 之前,請完成下列任務:

    1. 確保您具有使用自訂聯網功能的可用節點。

    2. 封鎖並耗盡節點,以正常關閉 Pods。 如需詳細資訊,請參閱中的安全地排放節點 Kubernetes 文件中)。

    3. 終止節點。如果節點位於現有的受管節點群組中,則可以刪除該節點群組。將隨後的命令複製到您的裝置。視需要對命令進行下列修改,然後執行修改後的命令:

      • Replace (取代) my-cluster 叢集的名稱。

      • Replace (取代) my-nodegroup 節點群組的名稱。

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

    只有使用 k8s.amazonaws.com/eniConfig 標籤註冊的新節點能使用自訂聯網功能。

  5. 確認 Pods 會從與您在上一個步驟中建立的其中一個子網路相關聯的 CIDR 區塊指派 IP 地址。

    kubectl get pods -A -o wide

    範例輸出如下。

    NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system aws-node-2rkn4 1/1 Running 0 7m19s 192.168.0.92 ip-192-168-0-92.us-west-2.compute.internal <none> <none> kube-system aws-node-k96wp 1/1 Running 0 7m15s 192.168.0.126 ip-192-168-0-126.us-west-2.compute.internal <none> <none> kube-system coredns-657694c6f4-smcgr 1/1 Running 0 56m 192.168.1.23 ip-192-168-0-92.us-west-2.compute.internal <none> <none> kube-system coredns-657694c6f4-stwv9 1/1 Running 0 56m 192.168.1.28 ip-192-168-0-92.us-west-2.compute.internal <none> <none> kube-system kube-proxy-jgshq 1/1 Running 0 7m19s 192.168.0.92 ip-192-168-0-92.us-west-2.compute.internal <none> <none> kube-system kube-proxy-wx9vk 1/1 Running 0 7m15s 192.168.0.126 ip-192-168-0-126.us-west-2.compute.internal <none> <none>

    您可以看到 coredns Pods 是從您新增至 CIDR 192.168.1.0 的 VPC 區塊指派的 IP 地址。如果沒有自訂聯網,它們就會從 CIDR 192.168.0.0 區塊中指派地址,因為它是唯一最初與 CIDR 相關聯的 VPC 區塊。

    如果 Pod’s spec 包含 hostNetwork=true,它會指派節點的主要 IP 地址。它不會從您新增的子網路指派地址。依預設,此值是設為 false。此值true針對 kube-proxy和 設定為 。Amazon VPC CNI plugin for Kubernetes (aws-node) Pods 在叢集上執行的 。這就是為什麼 kube-proxy和 外掛程式的 aws-node Pods 未在上一個輸出中指派192.168.1.x 地址。如需 的詳細資訊 Pod’s hostNetwork 設定,請參閱 中的 PodSpec v1 核心 Kubernetes API參考。

步驟 5:刪除教學課程資源

完成本教學課程後,建議您刪除您建立的資源。然後,您可以調整步驟以啟用生產叢集的自訂聯網。

  1. 如果您建立的節點群組僅用於測試,請將其刪除。

    aws eks delete-nodegroup --cluster-name $cluster_name --nodegroup-name my-nodegroup

    即使 AWS CLI 輸出顯示叢集已刪除後,刪除程序仍可能實際上未完成。刪除程序需要幾分鐘。執行下列命令以確認已完成。

    aws eks describe-nodegroup --cluster-name $cluster_name --nodegroup-name my-nodegroup --query nodegroup.status --output text

    在傳回的輸出類似於下列輸出之前,請勿繼續。

    An error occurred (ResourceNotFoundException) when calling the DescribeNodegroup operation: No node group found for name: my-nodegroup.
  2. 如果您建立的節點群組僅用於測試,請刪除節點 IAM 角色。

    1. 將策略與角色分離。

      aws iam detach-role-policy --role-name myCustomNetworkingNodeRole --policy-arn arn:aws: iam::aws:policy/AmazonEKSWorkerNodePolicy aws iam detach-role-policy --role-name myCustomNetworkingNodeRole --policy-arn arn:aws: iam::aws:policy/AmazonEC2ContainerRegistryReadOnly aws iam detach-role-policy --role-name myCustomNetworkingNodeRole --policy-arn arn:aws: iam::aws:policy/AmazonEKS_CNI_Policy
    2. 刪除角色。

      aws iam delete-role --role-name myCustomNetworkingNodeRole
  3. 刪除叢集。

    aws eks delete-cluster --name $cluster_name

    請使用下列命令來確認刪除叢集。

    aws eks describe-cluster --name $cluster_name --query cluster.status --output text

    如果傳回類似以下的輸出,則已成功刪除叢集。

    An error occurred (ResourceNotFoundException) when calling the DescribeCluster operation: No cluster found for name: my-cluster.
  4. 刪除叢集 IAM 角色。

    1. 將策略與角色分離。

      aws iam detach-role-policy --role-name myCustomNetworkingAmazonEKSClusterRole --policy-arn arn:aws: iam::aws:policy/AmazonEKSClusterPolicy
    2. 刪除角色。

      aws iam delete-role --role-name myCustomNetworkingAmazonEKSClusterRole
  5. 刪除您在上一個步驟中建立的子網。

    aws ec2 delete-subnet --subnet-id $new_subnet_id_1 aws ec2 delete-subnet --subnet-id $new_subnet_id_2
  6. 刪除您建立的 VPC。

    aws cloudformation delete-stack --stack-name my-eks-custom-networking-vpc