

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

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

# 部署 Amazon EKS `IPv6` 叢集和受管 Amazon Linux 節點
<a name="deploy-ipv6-cluster"></a>

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

## 先決條件
<a name="_prerequisites"></a>

開始本教學之前，先完成下列動作：

安裝和設定下列所需工具和資源，以便建立和管理 Amazon EKS 叢集。
+ 建議您先熟悉所有設定，再使用符合需求的設定來部署叢集。如需詳細資訊，請參閱此主題的 [建立 Amazon EKS 叢集](create-cluster.md)、[透過受管節點群組來簡化節點生命週期](managed-node-groups.md) 與[考量](cni-ipv6.md)。您只可在建立叢集時啟用某些設定。
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 您使用的 IAM 安全主體必須具有使用 Amazon EKS IAM 角色、服務連結角色、 AWS CloudFormation、VPC 和相關資源的許可。如需詳細資訊，請參閱《IAM 使用者指南》中的[動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html)和[使用服務連結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html)。
+ 如果您使用 eksctl，在電腦上安裝版本 `0.215.0` 或更新版本。如需有關安裝或更新的指示，請參閱 `eksctl` 文件中的 [Installation](https://eksctl.io/installation) 一節。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` `2.12.3`或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell * 如果您使用 AWS CloudShell，您可能需要[安裝 2.12.3 版或更新版本，或 1.27.160 版或更新版本的 AWS CLI](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)，因為安裝在 AWS CloudShell 中的預設 AWS CLI 版本可能是舊版。

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

## 使用 eksctl 部署 IPv6 叢集
<a name="_deploy_an_ipv6_cluster_with_eksctl"></a>

1. 建立 `ipv6-cluster.yaml` 檔案。將隨後的命令複製到您的裝置。視需要對命令進行下列修改，然後執行修改後的命令：
   + 使用您的叢集名稱取代 *my-cluster*。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭，且長度不可超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。
   + 將 *region-code* 取代為 Amazon EKS 支援的任何 AWS 區域。如需 AWS 區域清單，請參閱《 AWS 一般參考指南》中的 [Amazon EKS 端點和配額](https://docs.aws.amazon.com/general/latest/gr/eks.html)。
   + 包含叢集版本的 `version` 值。如需詳細資訊，請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。
   + 將 *my-nodegroup* 取代為您的節點群組名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。
   + 將 *t3.medium* 取代為任何 [AWS Nitro 系統執行個體類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances)。

     ```
     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
     ```

1. 建立叢集。

   ```
   eksctl create cluster -f ipv6-cluster.yaml
   ```

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

   ```
   [...]
   [✓]  EKS cluster "my-cluster" in "region-code" region is ready
   ```

1. 確認已為預設 Pod 指派 `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>
   ```

1. 確認已為預設服務指派 `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
   ```

1. (選用) [部署範例應用程式](sample-deployment.md)或部署 [AWS Load Balancer 控制器](aws-load-balancer-controller.md)和範例應用程式，以透過 [透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md) 對 HTTP 應用程式進行負載平衡，或透過 [透過 Network Load Balancer 路由 TCP 與 UDP 流量](network-load-balancing.md) 對 `IPv6` Pod 的網路流量進行負載平衡。

1. 在完成為本教學建立的叢集和節點後，您應該使用如下命令清除所建立的資源。

   ```
   eksctl delete cluster my-cluster
   ```

## 使用 CLI 部署 IPv6 AWS 叢集
<a name="deploy_an_ipv6_cluster_with_shared_aws_cli"></a>

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

  ```
  aws sts get-caller-identity
  ```
必須在同一 shell 中完成此程序中的所有步驟。若干步驟使用前面步驟中設定的變數。如果在其他 shell 中設定變數值，則使用此變數的步驟將無法正常工作。如果您使用 [AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html) 完成以下程序，請記住，如果您在大約 20—30 分鐘內沒有使用鍵盤或指標與其互動，則 shell 工作階段將結束。正在執行的進程不算作互動。
這些指示是針對 Bash shell 編寫的，在其他 shell 中可能需要進行調整。

將程序此步驟中的所有範例值取代為您自己的值。

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

   ```
   export region_code=region-code
   export cluster_name=my-cluster
   export nodegroup_name=my-nodegroup
   export account_id=111122223333
   ```

1. 使用符合 Amazon EKS 和 `IPv6` 要求的公有和私有子網建立 Amazon VPC。

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

      ```
      export vpc_stack_name=my-eks-ipv6-vpc
      ```

   1. 使用 AWS CloudFormation 範本建立 `IPv6` VPC。

      ```
      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
      ```

   1. 檢索已建立的公有子網路的 ID。

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

      範例輸出如下。

      ```
      subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE
      ```

   1. 為已建立的公有子網啟用自動指派 `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
      ```

   1. 從部署的 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}
      ```

1. 建立叢集 IAM 角色，並將所需的 Amazon EKS IAM 受管政策連接到該角色。Amazon EKS 管理的 Kubernetes 叢集會代表您呼叫其他 AWS 服務，以管理您與服務搭配使用的資源。

   1. 執行下列命令以建立 `eks-cluster-role-trust-policy.json` 檔案。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "eks.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      ```

   1. 執行下列命令，以設定角色名稱的變數。您可以將 *myAmazonEKSClusterRole* 取代為選擇的任何名稱。

      ```
      export cluster_role_name=myAmazonEKSClusterRole
      ```

   1. 建立角色。

      ```
      aws iam create-role --role-name $cluster_role_name --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
      ```

   1. 擷取 IAM 角色的 ARN 並將其儲存在變數中，以便在稍後的步驟中使用。

      ```
      CLUSTER_IAM_ROLE=$(aws iam get-role --role-name $cluster_role_name --query="Role.Arn" --output text)
      ```

   1. 將必要的 Amazon EKS 受管 IAM 政策連接到角色。

      ```
      aws iam attach-role-policy --policy-arn arn:aws: iam::aws:policy/AmazonEKSClusterPolicy --role-name $cluster_role_name
      ```

1. 建立叢集。

   ```
   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. 請注意：您可能會收到錯誤，表示在請求中的其中一個可用區域沒有足夠的容量可建立 Amazon EKS 叢集。如果發生這種情況，錯誤輸出包含的可用區域可支援新的叢集。使用至少兩個位於帳戶的支援可用區域子網路來建立您的叢集。如需詳細資訊，請參閱[容量不足](troubleshooting.md#ice)。

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

      ```
      aws eks describe-cluster --region $region_code --name $cluster_name --query cluster.status
      ```

1. 為叢集建立或更新 `kubeconfig` 檔案，以便能夠與您的叢集通訊。

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

   根據預設，已在 `~/.kube` 建立了 `config` 檔案，或者已將新叢集的組態新增至 `~/.kube` 中的現有 `config` 檔案。

1. 建立節點 IAM 角色。

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

      ```
      {
          "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/*"
                  ]
              }
          ]
      }
      ```

   1. 建立 IAM 政策。

      ```
      aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json
      ```

   1. 執行下列命令以建立 `node-role-trust-relationship.json` 檔案。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      ```

   1. 執行下列命令，以設定角色名稱的變數。您可以將 *AmazonEKSNodeRole* 取代為選擇的任何名稱。

      ```
      export node_role_name=AmazonEKSNodeRole
      ```

   1. 建立 IAM 角色。

      ```
      aws iam create-role --role-name $node_role_name --assume-role-policy-document file://"node-role-trust-relationship.json"
      ```

   1. 將 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](cni-iam-role.md)。

   1. 將兩個所需的 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
      ```

   1. 擷取 IAM 角色的 ARN 並將其儲存在變數中，以便在稍後的步驟中使用。

      ```
      node_iam_role=$(aws iam get-role --role-name $node_role_name --query="Role.Arn" --output text)
      ```

1. 建立受管節點群組。

   1. 查看您在上一個步驟中建立的子網路的 ID。

      ```
      echo $subnets
      ```

      範例輸出如下。

      ```
      subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE,subnet-0377963d69EXAMPLE,subnet-0c05f819d5EXAMPLE
      ```

   1. 建立節點群組。將 *0a1a56c486EXAMPLE*、*099e6ca77aEXAMPLE*、*0377963d69EXAMPLE* 和 *0c05f819d5EXAMPLE* 取代為上一個步驟輸出中傳回的值。請確保從以下命令中的上一個輸出刪除子網路 ID 之間的逗號。您可以將 *t3.medium* 取代為任何 [AWS Nitro 系統執行個體類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances)。

      ```
      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
      ```

1. 確認在 `IP` 欄中已為預設 Pod 指派 `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>
   ```

1. 確認在 `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
   ```

1. (選用) [部署範例應用程式](sample-deployment.md)或部署 [AWS Load Balancer 控制器](aws-load-balancer-controller.md)和範例應用程式，以透過 [透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md) 對 HTTP 應用程式進行負載平衡，或透過 [透過 Network Load Balancer 路由 TCP 與 UDP 流量](network-load-balancing.md) 對 `IPv6` Pod 的網路流量進行負載平衡。

1. 在完成為本教學建立的叢集和節點後，您應該使用如下命令清除所建立的資源。在刪除之前，請確保您沒有使用本教程以外的任何資源。

   1. 如果您在與完成之前步驟不同的 shell 中完成此步驟，請設定之前步驟中使用的所有變數的值，並將範例值取代為在完成之前步驟時指定的值。如果您要在與完成之前步驟相同的 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
      ```

   1. 刪除節點群組。

      ```
      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
      ```

   1. 刪除叢集。

      ```
      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.
      ```

   1. 刪除您建立的 IAM 資源。將 *AmazonEKS\$1CNI\$1IPv6\$1Policy* 取代為您選擇的名稱 (如果您選擇的名稱與之前步驟中使用的名稱不同)。

      ```
      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
      ```

   1. 刪除建立 VPC 的 AWS CloudFormation 堆疊。

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