

 **帮助改进此页面** 

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

# 使用 AWS CLI 创建 EKS 自动模式集群
<a name="automode-get-started-cli"></a>

EKS 自动模式集群可自动执行计算、存储和联网等方面的例行集群管理任务。例如，EKS 自动模式集群会自动检测何时需要增加节点，并相应预置新的 EC2 实例来满足工作负载的需求。

本主题将演示使用 AWS CLI 创建新的 EKS 自动模式集群，以及（可选）部署示例工作负载的过程。

## 先决条件
<a name="_prerequisites"></a>
+ 已在您的设备上安装并配置了最新版本的 AWS 命令行界面（AWS CLI）。要查看当前版本，请使用 `aws --version`。要安装最新版本，请参阅《AWS 命令行界面用户指南》中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#cli-configure-quickstart-config)。
  + 使用创建 AWS 资源所需的充分 IAM 权限登录 CLI，包括 IAM 策略、IAM 角色和 EKS 集群等。
+ 已在您的设备上安装了 kubectl 命令行工具。AWS 建议使用与 EKS 集群的 Kubernetes 版本相同的 kubectl 版本。要安装或升级 kubectl，请参阅[设置 `kubectl` 和 `eksctl`](install-kubectl.md)。

## 指定 VPC 子网
<a name="_specify_vpc_subnets"></a>

Amazon EKS 自动模式会将节点部署到 VPC 子网。创建 EKS 集群时，必须指定要部署节点的 VPC 子网。可以使用您 AWS 账户中的默认 VPC 子网，也可以创建用于关键工作负载的专用 VPC。
+  AWS 建议为集群创建专用 VPC。了解如何[为您的 Amazon EKS 集群创建 Amazon VPC](creating-a-vpc.md)。
+ EKS 控制台可帮助创建新的 VPC。了解如何[使用 AWS 管理控制台创建 EKS 自动模式集群](automode-get-started-console.md)。
+ 您也可以使用您 AWS 账户的默认 VPC。按照以下说明查找子网 ID。

### 查找默认 VPC 的子网 ID
<a name="auto-find-subnet"></a>

 **使用 AWS CLI：**

1. 运行以下命令，列出默认 VPC 及其子网：

   ```
   aws ec2 describe-subnets --filters "Name=vpc-id,Values=$(aws ec2 describe-vpcs --query 'Vpcs[?IsDefault==`true`].VpcId' --output text)" --query 'Subnets[*].{ID:SubnetId,AZ:AvailabilityZone}' --output table
   ```

1. 保存输出并记下**子网 ID**。

   示例输出：

   ```
   ----------------------------------------
   |             DescribeSubnets          |
   ----------------------------------------
   |   SubnetId        |   AvailabilityZone  |
   |--------------------|---------------------|
   |   subnet-012345678 |   us-west-2a        |
   |   subnet-234567890 |   us-west-2b        |
   |   subnet-345678901 |   us-west-2c        |
   ----------------------------------------
   ```

## EKS 自动模式集群的 IAM 角色
<a name="auto-mode-create-roles"></a>

### 集群 IAM 角色
<a name="auto-roles-cluster-iam-role"></a>

EKS 自动模式需要集群 IAM 角色才能在您的 AWS 账户中执行操作，例如预置新的 EC2 实例。您必须创建此角色才能向 EKS 授予必要的权限。AWS 建议将以下 AWS 托管式策略附加到集群 IAM 角色：
+  [AmazonEKSComputePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonEKSComputePolicy) 
+  [AmazonEKSBlockStoragePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonEKSBlockStoragePolicy) 
+  [AmazonEKSLoadBalancingPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonEKSLoadBalancingPolicy) 
+  [AmazonEKSNetworkingPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonEKSNetworkingPolicy) 
+  [AmazonEKSClusterPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazoneksclusterpolicy) 

### 节点 IAM 角色
<a name="auto-roles-node-iam-role"></a>

创建 EKS 自动模式集群时，需要指定一个节点 IAM 角色。EKS 自动模式创建节点来处理待处理的工作负载时，将为每个新的 EC2 实例节点分配此节点 IAM 角色。此角色允许节点与 EKS 通信，但节点上运行的工作负载通常无法访问此角色。

要向在节点上运行的工作负载授予权限，请使用 EKS 容器组身份。有关更多信息，请参阅 [了解 EKS 容器组身份如何向容器组（pod）授予对 AWS 服务的访问权限](pod-identities.md)。

您必须创建此角色并附加以下 AWS 托管式策略：
+  [AmazonEKSWorkerNodeMinimalPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonEKSWorkerNodeMinimalPolicy) 
+  [AmazonEC2ContainerRegistryPullOnly](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerRegistryPullOnly) 

EKS 自动模式还需要一个将由 AWS 自动创建和配置的服务相关角色。有关更多信息，请参阅 [AWSServiceRoleForAmazonEKS](using-service-linked-roles-eks.md)。

## 创建 EKS 自动模式集群 IAM 角色
<a name="_create_an_eks_auto_mode_cluster_iam_role"></a>

### 第 1 步：创建信任策略
<a name="_step_1_create_the_trust_policy"></a>

创建信任策略以允许 Amazon EKS 服务代入该角色。将策略另存为 `trust-policy.json`：

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

### 第 2 步：创建 IAM 角色
<a name="_step_2_create_the_iam_role"></a>

使用信任策略创建集群 IAM 角色：

```
aws iam create-role \
    --role-name AmazonEKSAutoClusterRole \
    --assume-role-policy-document file://trust-policy.json
```

### 第 3 步：记下角色 ARN
<a name="_step_3_note_the_role_arn"></a>

检索并保存新角色的 ARN，以便在后续步骤中使用：

```
aws iam get-role --role-name AmazonEKSAutoClusterRole --query "Role.Arn" --output text
```

### 第 4 步：附加必需的策略
<a name="_step_4_attach_required_policies"></a>

将以下 AWS 托管式策略附加到集群 IAM 角色以授予必要的权限：

 **AmazonEKSClusterPolicy**：

```
aws iam attach-role-policy \
    --role-name AmazonEKSAutoClusterRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
```

 **AmazonEKSComputePolicy**：

```
aws iam attach-role-policy \
    --role-name AmazonEKSAutoClusterRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKSComputePolicy
```

 **AmazonEKSBlockStoragePolicy**：

```
aws iam attach-role-policy \
    --role-name AmazonEKSAutoClusterRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKSBlockStoragePolicy
```

 **AmazonEKSLoadBalancingPolicy**：

```
aws iam attach-role-policy \
    --role-name AmazonEKSAutoClusterRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKSLoadBalancingPolicy
```

 **AmazonEKSNetworkingPolicy**：

```
aws iam attach-role-policy \
    --role-name AmazonEKSAutoClusterRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKSNetworkingPolicy
```

## 创建 EKS 自动模式 节点 IAM 角色
<a name="_create_an_eks_auto_mode_node_iam_role"></a>

### 第 1 步：创建信任策略
<a name="_step_1_create_the_trust_policy_2"></a>

创建信任策略以允许 Amazon EKS 服务代入该角色。将策略另存为 `node-trust-policy.json`：

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

#### 第 2 步：创建节点 IAM 角色
<a name="_step_2_create_the_node_iam_role"></a>

使用上一步中的 **node-trust-policy.json** 文件来定义哪些实体可以代入该角色。运行以下命令以创建节点 IAM 角色：

```
aws iam create-role \
    --role-name AmazonEKSAutoNodeRole \
    --assume-role-policy-document file://node-trust-policy.json
```

#### 第 3 步：记下角色 ARN
<a name="_step_3_note_the_role_arn_2"></a>

创建角色后，检索并保存节点 IAM 角色的 ARN。在后续步骤中，您将需要此 ARN。使用以下命令来获取 ARN：

```
aws iam get-role --role-name AmazonEKSAutoNodeRole --query "Role.Arn" --output text
```

#### 第 4 步：附加必需的策略
<a name="_step_4_attach_required_policies_2"></a>

将以下 AWS 托管式策略附加到节点 IAM 角色，以提供必要的权限：

 **AmazonEKSWorkerNodeMinimalPolicy**：

```
aws iam attach-role-policy \
    --role-name AmazonEKSAutoNodeRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodeMinimalPolicy
```

 **AmazonEC2ContainerRegistryPullOnly**：

```
aws iam attach-role-policy \
    --role-name AmazonEKSAutoNodeRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
```

## 创建 EKS 自动模式集群
<a name="_create_an_eks_auto_mode_cluster"></a>

### 概述
<a name="_overview"></a>

要使用 AWS CLI 创建 EKS 自动模式集群，您需要以下参数：
+  `cluster-name`：集群的名称。
+  `k8s-version`：Kubernetes 版本（例如 1.31）。
+  `subnet-ids`：之前步骤中确定的子网 ID。
+  `cluster-role-arn`：集群 IAM 角色的 ARN。
+  `node-role-arn`：节点 IAM 角色的 ARN。

#### 默认集群配置
<a name="_default_cluster_configurations"></a>

在创建集群之前，请检查以下默认值和功能：
+  `nodePools`：EKS 自动模式包含通用节点池和系统默认节点池。了解有关[节点池](create-node-pool.md)的更多信息。

 **注意：**EKS 自动模式下的节点池与 Amazon EKS 托管式节点组不同，但可以共存于同一个集群中。
+  `computeConfig.enabled`：自动执行例行计算任务，例如创建和删除 EC2 实例。
+  `kubernetesNetworkConfig.elasticLoadBalancing.enabled`：自动执行负载均衡任务，包括创建和删除弹性负载均衡器。
+  `storageConfig.blockStorage.enabled`：自动执行存储任务，例如创建和删除 Amazon EBS 卷。
+  `accessConfig.authenticationMode`：需要 EKS 访问条目。了解有关 [EKS 身份验证模式](grant-k8s-access.md)的更多信息。

#### 运行命令
<a name="_run_the_command"></a>

使用下面的命令创建集群：

```
aws eks create-cluster \
  --region ${AWS_REGION} \
  --cli-input-json \
  "{
      \"name\": \"${CLUSTER_NAME}\",
      \"version\": \"${K8S_VERSION}\",
      \"roleArn\": \"${CLUSTER_ROLE_ARN}\",
      \"resourcesVpcConfig\": {
        \"subnetIds\": ${SUBNETS_JSON},
        \"endpointPublicAccess\": true,
        \"endpointPrivateAccess\": true
      },
      \"computeConfig\": {
        \"enabled\": true,
        \"nodeRoleArn\":\"${NODE_ROLE_ARN}\",
        \"nodePools\": [\"general-purpose\", \"system\"]
      },
      \"kubernetesNetworkConfig\": {
        \"elasticLoadBalancing\": {
          \"enabled\": true
        }
      },
      \"storageConfig\": {
        \"blockStorage\": {
          \"enabled\": true
        }
      },
      \"accessConfig\": {
        \"authenticationMode\": \"API\"
      }
    }"
```

### 检查集群状态
<a name="_check_cluster_status"></a>

#### 第 1 步：验证集群创建
<a name="_step_1_verify_cluster_creation"></a>

运行以下命令来检查集群的状态。创建集群通常需要大约 15 分钟时间：

```
aws eks describe-cluster --name "${CLUSTER_NAME}" --output json
```

#### 第 2 步：更新 kubeconfig
<a name="_step_2_update_kubeconfig"></a>

集群准备就绪后，更新本地 kubeconfig 文件以便 `kubectl` 可以与集群通信。此配置使用 AWS CLI 进行身份验证。

```
aws eks update-kubeconfig --name "${CLUSTER_NAME}"
```

#### 第 3 步：验证节点池
<a name="_step_3_verify_node_pools"></a>

使用以下命令列出集群中的节点池：

```
kubectl get nodepools
```

## 后续步骤
<a name="_next_steps"></a>
+ 了解如何将[示例工作负载部署](automode-workload.md)到新的 EKS 自动模式集群。