

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 了解如何将 IPv6 地址分配给集群、容器组（pod）和服务
<a name="cni-ipv6"></a>

 **适用对象**：使用 Amazon EC2 实例的容器组（pod）和 Fargate 容器组（pod）

默认情况下，Kubernetes 会将 `IPv4` 地址分配给容器组（pod）和服务。您可以将集群配置为向其分配 `IPv6` 地址，而不是将 `IPv4` 地址分配给容器组（pod）和服务。Amazon EKS 不支持双堆栈容器组（pod）或服务，即使 Kubernetes 支持也是如此。因此，您无法将 `IPv4` 和 `IPv6` 地址同时分配给容器组（pod）和服务。

创建集群时，您可以选择要用于集群的 IP 系列。集群在创建之后无法更改系列。

有关部署 Amazon EKS `IPv6` 集群的教程，请参阅[部署 Amazon EKS `IPv6` 集群和 Amazon Linux 托管节点](deploy-ipv6-cluster.md)。

以下是使用该功能的注意事项：

## `IPv6` 功能支持
<a name="_ipv6_feature_support"></a>
+  **不支持 Windows**：不支持 Windows 容器组（pod）和服务。
+  **需要基于 Nitro 的 EC2 节点**：您只能将 AWS 与 `IPv6` 基于 Nitro 的 Amazon EC2 节点或 Fargate 节点结合使用。
+  **支持 EC2 和 Fargate 节点**：您可以将 `IPv6` 与具有 Amazon EC2 节点和 Fargate 节点的 [将安全组分配给各个容器组（pod）](security-groups-for-pods.md) 结合使用。
+  **不支持 Outposts**：您不能将 `IPv6` 与 [使用 AWS Outposts 在本地部署 Amazon EKS](eks-outposts.md) 结合使用。
+  **不支持 FSx for Lustre**：不支持 [将高性能应用程序存储与适用于 Lustre 的 Amazon FSx 结合使用](fsx-csi.md)。
+  **不支持自定义联网**：如果您以前使用过[使用自定义网络在备用子网中部署容器组（pod）](cni-custom-network.md)帮助缓解 IP 地址耗尽，您可以改用 `IPv6`。您不能将自定义联网与 `IPv6` 结合使用。如果您使用自定义联网进行网络隔离，则可能需要为集群继续使用自定义联网和 `IPv4` 系列。

## IP 地址分配
<a name="_ip_address_assignments"></a>
+  **Kubernetes 服务**：仅为 Kubernetes 服务分配一个 `IPv6` 地址。系统不会为其分配 IPv4 地址。
+  **容器组（pod）**：将为容器组（pod）分配一个 IPv6 地址和一个主机本地 IPv4 地址。主机本地 IPv4 地址是使用与 VPC CNI 关联的主机本地 CNI 插件分配的，并且该地址不会报告给 Kubernetes 控制面板。仅在有容器组需要与其他 Amazon VPC 或互联网中的外部 IPv4 资源通信时才会使用该地址。主机本地 IPv4 地址将（由 VPC CNI）SNAT 转换为 Worker 节点的主 ENI 的主 IPv4 地址。
+  **容器组和服务**：容器组和服务只接收 `IPv6` 地址，不接收 `IPv4` 地址。当容器组需要与外部 `IPv4` 端点通信时，它们会在节点本身上使用 NAT。这种内置的 NAT 功能无需 [DNS64 和 NAT64](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-nat64-dns64)。对于需要公共互联网访问的流量，容器组的流量将源网络地址转换为公有 IP 地址。
+  **路由地址**：当容器组与 VPC 外部通信时，其原始 `IPv6` 地址将被保留（不会转换为节点的 `IPv6` 地址）。此流量将直接通过互联网网关或仅出口互联网网关进行路由。
+  **节点**：所有节点均已分配 `IPv4` 和 `IPv6` 地址。
+  **Fargate 容器组（pod）**：每个 Fargate 容器组（pod）都会收到来自为其部署的子网指定的 CIDR 的 `IPv6` 地址。运行 Fargate 容器组（pod）的底层硬件单元从分配给部署硬件单元的子网的 CIDR 获取唯一的 `IPv4` 和 `IPv6` 地址。

## 如何将 `IPv6` 与 EKS 结合使用。
<a name="_how_to_use_ipv6_with_eks"></a>
+  **创建新集群**：您必须创建新集群并指定该集群要使用 `IPv6` 系列。您无法为从前一版本更新的集群启用 `IPv6` 系列。有关如何创建新集群的说明，请参阅“注意事项”。
+  **使用最新的 VPC CNI**：部署 Amazon VPC CNI 版本 `1.10.1` 或更高版本。默认情况下，会部署此版本或更高版本。部署附加组件后，您无法在不先删除集群所有节点组中的所有节点的情况下将 Amazon VPC CNI 附加组件版本降级到 `1.10.1` 版以下。
+  **为 `IPv6` 配置 VPC CNI**：如果您使用 Amazon EC2 节点，则必须使用 IP 前缀委派和 `IPv6` 配置 Amazon VPC CNI 附加组件。如果您在创建集群时选择 `IPv6` 系列，则 `1.10.1` 版的附加组件默认采用此配置。自行管理或 Amazon EKS 附加组件均为属于此种情况。有关 IP 前缀委派的更多信息，请参阅 [为带前缀的 Amazon EKS 节点分配更多 IP 地址](cni-increase-ip-addresses.md)。
+  **配置 `IPv4` 和 `IPv6` 地址**：创建集群时，您指定的 VPC 和子网必须具有分配给您指定的 VPC 和子网的 `IPv6` CIDR 块。您还必须为其分配一个 `IPv4` CIDR 块。这是因为，即使您只想使用 `IPv6`，VPC 仍然需要 `IPv4` CIDR 块才能正常工作。有关更多信息，请参阅 Amazon VPC 用户指南中的[关联 IPv6 CIDR 块与 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#vpc-associate-ipv6-cidr)。
+  **自动将 IPv6 地址分配非节点**：创建节点时，必须指定配置为自动分配 `IPv6` 地址的子网。否则，您无法部署节点。默认情况下，将禁用此配置。有关更多信息，请参阅 Amazon VPC 用户指南中的[修改子网的 IPv6 寻址属性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-ipv6)。
+  **设置路由表以使用 `IPv6`**：分配给子网的路由表必须有 `IPv6` 地址的路由。有关更多信息，请参阅 Amazon VPC 用户指南中的[迁移到 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html)。
+  **为 `IPv6` 设置安全组**：您的安全组必须允许 `IPv6` 地址。有关更多信息，请参阅 Amazon VPC 用户指南中的[迁移到 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html)。
+  **设置负载均衡器**：使用 AWS 负载均衡器控制器版本 `2.3.1` 或更高版本，对 HTTP 应用程序（通过使用 [使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)）或流向 `IPv6` 容器组（pod）的网络流量（通过在 IP 模式下借助负载均衡器使用 [使用网络负载均衡器路由 TCP 和 UDP 流量](network-load-balancing.md)，不支持实例模式）进行负载均衡。有关更多信息，请参阅 [使用 AWS 负载均衡器控制器路由互联网流量](aws-load-balancer-controller.md)。
+  **添加 `IPv6` IAM 策略**：您必须将 `IPv6` IAM 策略附加到节点 IAM 或 CNI IAM 角色。在两者之间，我们建议您将其附加到 CNI IAM 角色。有关更多信息，请参阅[为使用 `IPv6` 系列的集群创建 IAM policy](cni-iam-role.md#cni-iam-role-create-ipv6-policy)和[步骤 1：创建适用于 Kubernetes 的 Amazon VPC CNI 插件 IAM 角色](cni-iam-role.md#cni-iam-role-create-role)。
+  **评估所有组件**：在部署 `IPv6` 集群之前对集成的应用程序、Amazon EKS 附加组件和 AWS 服务进行全面的评估。这是为了确保 `IPv6` 的所有功能按预期运行。

# 部署 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)。一些设置仅在创建集群时才能启用。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 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` 文档中的[安装](https://eksctl.io/installation)。
+ 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》**中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》**中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。如果您使用 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 负载均衡器控制器](aws-load-balancer-controller.md)和示例应用程序，对 HTTP 应用程序（通过[使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)）或流向 `IPv6` 容器组（pod）的网络流量（通过[使用网络负载均衡器路由 TCP 和 UDP 流量](network-load-balancing.md)）进行负载均衡。

1. 在使用完成针对本教程而创建的集群和节点后，应使用以下命令清理创建的资源。

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

## 使用 AWS CLI 部署 IPv6 集群
<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 个字符。它必须以字母或数字开头，但也可以包括其余字符的连字符和下划线。请将 *111122223333* 替换为您的账户 ID。

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

   默认情况下，`config` 文件创建在 `~/.kube` 中或者新集群的配置已添加到 `~/.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. 确认默认容器组（pod）分配到了 `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>
   ```

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 负载均衡器控制器](aws-load-balancer-controller.md)和示例应用程序，对 HTTP 应用程序（通过[使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)）或流向 `IPv6` 容器组（pod）的网络流量（通过[使用网络负载均衡器路由 TCP 和 UDP 流量](network-load-balancing.md)）进行负载均衡。

1. 在使用完成针对本教程而创建的集群和节点后，应使用以下命令清理创建的资源。删除之前，确保您没有使用本教程之外的任何资源。

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

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