部署 Amazon EKS IPv6叢集和受管 Amazon Linux 節點 - Amazon EKS

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

部署 Amazon EKS IPv6叢集和受管 Amazon Linux 節點

在本教學課程中,您會部署 IPv6 Amazon VPC、具有 IPv6 系列 的 Amazon EKS 叢集,以及具有 Amazon EC2 Amazon Linux 節點的受管節點群組。您無法部署 Amazon EC2 Windows IPv6 叢集中的節點。您也可以將 Fargate 節點部署至叢集,但為了簡化起見,本主題中並未提供這些指示。

必要條件

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

安裝並設定建立和管理 Amazon EKS 叢集所需的下列工具和資源。

您可以使用 eksctl 或 CLI 來部署IPv6叢集。

使用 部署 IPv6 叢集 eksctl

  1. 建立 ipv6-cluster.yaml 檔案。將隨後的命令複製到您的裝置。視需要對命令進行下列修改,然後執行修改後的命令:

    • Replace (取代) my-cluster 叢集的名稱。此名稱僅能使用英數字元 (區分大小寫) 和連字號。它必須以英數字元開頭,且長度不得超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。

    • Replace (取代) region-code Amazon EKS 支援的任何 AWS 區域。如需 AWS 區域清單,請參閱 AWS 一般參考指南中的 Amazon EKS 端點和配額

    • 包含叢集版本的 version 值。如需詳細資訊,請參閱了解 EKS 上的 Kubernetes 版本生命週期

    • Replace (取代) my-nodegroup 節點群組的名稱。節點群組名稱不能超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。

    • Replace (取代) t3.medium 任何 AWS Nitro System 執行個體類型

      cat >ipv6-cluster.yaml <<EOF --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: "X.XX" kubernetesNetworkConfig: ipFamily: IPv6 addons: - name: vpc-cni version: latest - name: coredns version: latest - name: kube-proxy version: latest iam: withOIDC: true managedNodeGroups: - name: my-nodegroup instanceType: t3.medium EOF
  2. 建立叢集。

    eksctl create cluster -f ipv6-cluster.yaml

    叢集建立需要幾分鐘的時間。在看到最後一行輸出之前,請勿繼續,這看起來類似於下列輸出。

    [...] [✓] EKS cluster "my-cluster" in "region-code" region is ready
  3. 確認該預設值 Pods 是指派IPv6的地址。

    kubectl get pods -n kube-system -o wide

    範例輸出如下。

    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES aws-node-rslts 1/1 Running 1 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> aws-node-t74jh 1/1 Running 0 5m32s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-cw7w2 1/1 Running 0 56m 2600:1f13:b66:8203:34e5:: ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-tx6n8 1/1 Running 0 56m 2600:1f13:b66:8203:34e5::1 ip-192-168-253-70.region-code.compute.internal <none> <none> kube-proxy-btpbk 1/1 Running 0 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> kube-proxy-jjk2g 1/1 Running 0 5m33s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none>
  4. 確認已為預設服務指派 IPv6 地址。

    kubectl get services -n kube-system -o wide

    範例輸出如下。

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kube-dns ClusterIP fd30:3087:b6c2::a <none> 53/UDP,53/TCP 57m k8s-app=kube-dns
  5. (選用) 部署範例應用程式或部署 AWS Load Balancer 控制器和範例應用程式,以將 HTTP 應用程式與 使用 Application Load Balancer 路由應用程式和 HTTP 流量或 網路流量與 載入平衡 使用 Network Load Balancer 路由 TCP 和 UDP 流量 IPv6 Pods.

  6. 完成您為本教學課程建立的叢集和節點之後,您應該清除使用下列命令建立的資源。

    eksctl delete cluster my-cluster

使用 IPv6 部署 叢集 AWS CLI

重要
  • 您必須以同一位使用者的身分完成本程序中的所有步驟。若要檢查目前使用者,請執行以下命令:

    aws sts get-caller-identity
  • 必須在同一 shell 中完成此程序中的所有步驟。若干步驟使用前面步驟中設定的變數。如果在不同的 Shell 中設定變數值,使用變數的步驟將無法正常運作。如果您使用 AWS CloudShell 完成下列程序,請記住,如果您未使用鍵盤或指標與其互動約 20-30 分鐘,則 shell 工作階段會結束。正在執行的進程不算作互動。

  • 這些指示是針對 Bash shell 編寫的,在其他 shell 中可能需要進行調整。

取代全部 example values 此程序的步驟中,使用您自己的值。

  1. 執行下列命令以設定稍後步驟中使用的某些變數。Replace (取代) region-code 您想要部署資源 AWS 的區域。此值可以是 Amazon EKS 支援的任何 AWS 區域。如需 AWS 區域清單,請參閱 AWS 一般參考指南中的 Amazon EKS 端點和配額。Replace (取代) my-cluster 叢集的名稱。此名稱僅能使用英數字元 (區分大小寫) 和連字號。它必須以英數字元開頭,且長度不得超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。Replace (取代) my-nodegroup 節點群組的名稱。節點群組名稱不能超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。Replace (取代) 111122223333 使用您的帳戶 ID。

    export region_code=region-code export cluster_name=my-cluster export nodegroup_name=my-nodegroup export account_id=111122223333
  2. 使用符合 Amazon VPC 和IPv6要求的公有和私有子網路建立 Amazon EKS。

    1. 執行下列命令來設定 AWS CloudFormation 堆疊名稱的變數。您可以取代 my-eks-ipv6-vpc 任何您選擇的名稱。

      export vpc_stack_name=my-eks-ipv6-vpc
    2. 使用 IPv6 VPC 範本建立 AWS CloudFormation 。

      aws cloudformation create-stack --region $region_code --stack-name $vpc_stack_name \ --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-ipv6-vpc-public-private-subnets.yaml

      堆疊需要幾分鐘的時間建立。執行下列命令。在命令的輸出為 之前,請勿繼續下一個步驟CREATE_COMPLETE

      aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name --query Stacks[].StackStatus --output text
    3. 擷取已建立之公有子網路的 IDs。

      aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPublic`].OutputValue' --output text

      範例輸出如下。

      subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE
    4. 為已建立的公有子網啟用自動指派 IPv6 地址選項。

      aws ec2 modify-subnet-attribute --region $region_code --subnet-id subnet-0a1a56c486EXAMPLE --assign-ipv6-address-on-creation aws ec2 modify-subnet-attribute --region $region_code --subnet-id subnet-099e6ca77aEXAMPLE --assign-ipv6-address-on-creation
    5. 從部署的 AWS CloudFormation 堆疊中擷取範本建立的子網路和安全群組名稱,並將其存放在變數中,以供後續步驟使用。

      security_groups=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SecurityGroups`].OutputValue' --output text) public_subnets=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPublic`].OutputValue' --output text) private_subnets=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPrivate`].OutputValue' --output text) subnets=${public_subnets},${private_subnets}
  3. 建立叢集 IAM 角色,並將必要的 Amazon EKS IAM受管政策連接至該角色。Kubernetes 由 Amazon EKS 管理的 叢集會代表您呼叫其他 AWS 服務,以管理您使用 服務的資源。

    1. 執行下列命令以建立 eks-cluster-role-trust-policy.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. 執行下列命令,以設定角色名稱的變數。您可以取代 myAmazonEKSClusterRole 任何您選擇的名稱。

      export cluster_role_name=myAmazonEKSClusterRole
    3. 建立角色。

      aws iam create-role --role-name $cluster_role_name --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
    4. 擷取 ARN 角色的 IAM,並將其存放在變數中以供後續步驟使用。

      CLUSTER_IAM_ROLE=$(aws iam get-role --role-name $cluster_role_name --query="Role.Arn" --output text)
    5. 將所需的 Amazon EKS 受管 IAM 政策連接至角色。

      aws iam attach-role-policy --policy-arn arn:aws: iam::aws:policy/AmazonEKSClusterPolicy --role-name $cluster_role_name
  4. 建立叢集。

    aws eks create-cluster --region $region_code --name $cluster_name --kubernetes-version 1.XX \ --role-arn $CLUSTER_IAM_ROLE --resources-vpc-config subnetIds=$subnets,securityGroupIds=$security_groups \ --kubernetes-network-config ipFamily=ipv6
    1. NOTE:您可能會收到錯誤,表示請求中的其中一個可用區域沒有足夠的容量來建立 Amazon EKS 叢集。如果發生這種情況,錯誤輸出包含的可用區域可支援新的叢集。使用至少兩個位於帳戶的支援可用區域子網路來建立您的叢集。如需詳細資訊,請參閱容量不足

      建立叢集需要幾分鐘才能完成。執行下列命令。在命令的輸出為 之前,請勿繼續下一個步驟ACTIVE

      aws eks describe-cluster --region $region_code --name $cluster_name --query cluster.status
  5. 為叢集建立或更新 kubeconfig 檔案,以便能夠與您的叢集通訊。

    aws eks update-kubeconfig --region $region_code --name $cluster_name

    根據預設, config 檔案是在 中建立,~/.kube或新叢集的組態會新增至 中的現有config檔案~/.kube

  6. 建立節點 IAM 角色。

    1. 執行下列命令以建立 vpc-cni-ipv6-policy.json 檔案。

      cat >vpc-cni-ipv6-policy <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws: ec2:*:*:network-interface/*" ] } ] } EOF
    2. 建立 IAM 政策。

      aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json
    3. 執行下列命令以建立 node-role-trust-relationship.json 檔案。

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

      export node_role_name=AmazonEKSNodeRole
    5. 建立 IAM 角色。

      aws iam create-role --role-name $node_role_name --assume-role-policy-document file://"node-role-trust-relationship.json"
    6. 將 IAM 政策連接至 IAM 角色。

      aws iam attach-role-policy --policy-arn arn:aws: iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name $node_role_name
      重要

      為了簡化本教學課程,政策會連接至此 IAM 角色。不過,在生產叢集中,我們建議將政策連接至單獨的 IAM 角色。如需詳細資訊,請參閱設定 Amazon VPC CNI 外掛程式以使用 IRSA

    7. 將兩個必要的 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
    8. 擷取 ARN 角色的 IAM,並將其存放在變數中以供後續步驟使用。

      node_iam_role=$(aws iam get-role --role-name $node_role_name --query="Role.Arn" --output text)
  7. 建立受管節點群組。

    1. 檢視您在上一個步驟中建立的子網路的 IDs。

      echo $subnets

      範例輸出如下。

      subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE,subnet-0377963d69EXAMPLE,subnet-0c05f819d5EXAMPLE
    2. 建立節點群組。Replace (取代) 0a1a56c486EXAMPLE, 099e6ca77aEXAMPLE, 0377963d69EXAMPLE0c05f819d5EXAMPLE 在上一個步驟的輸出中傳回值。請務必從下列命令中的上一個輸出中移除子網路 IDs 之間的逗號。您可以取代 t3.medium 任何 AWS Nitro System 執行個體類型

      aws eks create-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name \ --subnets subnet-0a1a56c486EXAMPLE subnet-099e6ca77aEXAMPLE subnet-0377963d69EXAMPLE subnet-0c05f819d5EXAMPLE \ --instance-types t3.medium --node-role $node_iam_role

      此節點群組需要幾分鐘的時間建立。執行下列命令。在傳回的輸出為 之前,請勿繼續下一個步驟ACTIVE

      aws eks describe-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name \ --query nodegroup.status --output text
  8. 確認預設值 Pods 是IP欄中的指派IPv6地址。

    kubectl get pods -n kube-system -o wide

    範例輸出如下。

    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES aws-node-rslts 1/1 Running 1 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> aws-node-t74jh 1/1 Running 0 5m32s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-cw7w2 1/1 Running 0 56m 2600:1f13:b66:8203:34e5:: ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-tx6n8 1/1 Running 0 56m 2600:1f13:b66:8203:34e5::1 ip-192-168-253-70.region-code.compute.internal <none> <none> kube-proxy-btpbk 1/1 Running 0 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> kube-proxy-jjk2g 1/1 Running 0 5m33s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none>
  9. 確認在 IP 欄中已為預設服務指派 IPv6 地址。

    kubectl get services -n kube-system -o wide

    範例輸出如下。

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kube-dns ClusterIP fd30:3087:b6c2::a <none> 53/UDP,53/TCP 57m k8s-app=kube-dns
  10. (選用) 部署範例應用程式或部署 AWS Load Balancer 控制器和範例應用程式,以將 HTTP 應用程式與 使用 Application Load Balancer 路由應用程式和 HTTP 流量或 網路流量與 進行負載平衡 使用 Network Load Balancer 路由 TCP 和 UDP 流量 IPv6 Pods.

  11. 完成您為本教學課程建立的叢集和節點之後,您應該清除使用下列命令建立的資源。刪除之前,請確定您未使用本教學課程以外的任何資源。

    1. 如果您要在與完成先前步驟不同的 Shell 中完成此步驟,請設定先前步驟中使用的所有變數值,取代 example values 以及您完成先前步驟時指定的值。如果您在完成先前步驟的相同 shell 中完成此步驟,請跳至下一個步驟。

      export region_code=region-code export vpc_stack_name=my-eks-ipv6-vpc export cluster_name=my-cluster export nodegroup_name=my-nodegroup export account_id=111122223333 export node_role_name=AmazonEKSNodeRole export cluster_role_name=myAmazonEKSClusterRole
    2. 刪除節點群組。

      aws eks delete-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name

      刪除需要幾分鐘的時間。執行下列命令。如果傳回任何輸出,請勿繼續下一個步驟。

      aws eks list-nodegroups --region $region_code --cluster-name $cluster_name --query nodegroups --output text
    3. 刪除叢集。

      aws eks delete-cluster --region $region_code --name $cluster_name

      叢集需要幾分鐘的時間刪除。在繼續之前,請務必使用下列命令來確定叢集已被刪除。

      aws eks describe-cluster --region $region_code --name $cluster_name

      在輸出類似於下列輸出之前,請勿繼續下一個步驟。

      An error occurred (ResourceNotFoundException) when calling the DescribeCluster operation: No cluster found for name: my-cluster.
    4. 刪除您建立的 IAM 資源。Replace (取代) AmazonEKS_CNI_IPv6_Policy 如果您選擇與先前步驟中使用的名稱不同的名稱,請使用您選擇的名稱。

      aws iam detach-role-policy --role-name $cluster_role_name --policy-arn arn:aws: iam::aws:policy/AmazonEKSClusterPolicy aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws: iam::aws:policy/AmazonEKSWorkerNodePolicy aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws: iam::aws:policy/AmazonEC2ContainerRegistryReadOnly aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws: iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy aws iam delete-policy --policy-arn arn:aws: iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy aws iam delete-role --role-name $cluster_role_name aws iam delete-role --role-name $node_role_name
    5. 刪除建立 AWS CloudFormation 的 VPC 堆疊。

      aws cloudformation delete-stack --region $region_code --stack-name $vpc_stack_name