

 **帮助改进此页面** 

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

# 使用 AWS Outposts 在本地部署 Amazon EKS
<a name="eks-outposts"></a>

您可以使用 Amazon EKS 在 AWS Outposts 上运行本地 Kubernetes 应用程序。您可以通过以下方式在 Outpost 上部署 Amazon EKS：
+  **扩展集群** – 在 AWS 区域中运行 Kubernetes 控制面板，在您的 Outpost 上运行节点。
+  **本地集群** – 在您的 Outpost 上运行 Kubernetes 控制面板和节点。

对于这两个部署选项，Kubernetes 控制面板完全由 AWS 托管。您可以使用在云中使用的相同 Amazon EKS API、工具和控制台，在 Outpost 上创建和运行 Amazon EKS。

下图显示了这些部署选项。

![\[Outpost 部署选项\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/outposts-deployment-options.png)


## 何时使用每个部署选项
<a name="outposts-overview-when-deployment-options"></a>

本地和扩展集群都是通用部署选项，可以用于一系列应用程序。

本地集群使您能在 Outpost 上本地运行整个 Amazon EKS 集群。此选项可以降低因临时断开与云的网络连接而造成的应用程序停机风险。光纤中断或天气事件可能会导致网络断开连接。由于整个 Amazon EKS 集群在 Outpost 上本地运行，应用程序仍然可用。您可以在断开与云的网络连接期间执行集群操作。有关更多信息，请参阅 [在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网](eks-outposts-network-disconnects.md)。如果您担心从 Outpost 到父 AWS 区域的网络连接质量，并且需要在整个网络断开连接期间保持高可用性，请使用本地集群部署选项。

扩展集群让您能够节省 Outpost 上的容量，因为 Kubernetes 控制面板在父 AWS 区域中运行。如果您能投资建立从 Outpost 到 AWS 区域的可靠、冗余网络连接，则此选项很合适。网络连接的质量对于此选项至关重要。Kubernetes 处理 Kubernetes 控制面板和节点之间网络断开连接的方式可能会导致应用程序停机。有关 Kubernetes 的行为的更多信息，请参阅 Kubernetes 文档中的[调度、抢占和驱逐](https://kubernetes.io/docs/concepts/scheduling-eviction/)。

## 部署选项比较
<a name="outposts-overview-comparing-deployment-options"></a>

下表比较了两个选项之间的差异。


| 功能 | 扩展集群 | 本地集群 | 
| --- | --- | --- | 
|  Kubernetes 控制面板位置  |   AWS 区域  |  Outpost  | 
|  Kubernetes 控制面板账户  |   AWS 账户  |  您的账户  | 
|  区域可用性  |  请参阅 [Service endpoints](https://docs.aws.amazon.com/general/latest/gr/eks.html#eks_region)   |  美国东部（俄亥俄州）、美国东部（弗吉尼亚州北部）、美国西部（北加利福尼亚）、美国西部（俄勒冈州）、亚太地区（首尔）、亚太地区（新加坡）、亚太地区（悉尼）、亚太地区（东京）、加拿大（中部）、欧洲地区（法兰克福）、欧洲地区（爱尔兰）、欧洲地区（伦敦）、中东（巴林）和南美洲（圣保罗）。  | 
|  Kubernetes 次要版本  |  eks/latest/userguide/kubernetes-versions.html[Supported Amazon EKS versions,type="documentation"]。  |  eks/latest/userguide/kubernetes-versions.html[Supported Amazon EKS versions,type="documentation"]。  | 
|  平台版本  |  请参阅 [EKS platform-versions](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)   |  请参阅 [了解适用于 AWS Outposts 的 Kubernetes 和 Amazon EKS 平台版本](eks-outposts-platform-versions.md)   | 
|  Outpost 外形规格  |  Outpost 机架  |  Outpost 机架  | 
|  用户界面  |   AWS 管理控制台、AWS CLI、Amazon EKS API、`eksctl`、AWS CloudFormation 和 Terraform  |   AWS 管理控制台、AWS CLI、Amazon EKS API、`eksctl`、AWS CloudFormation 和 Terraform  | 
|  托管策略  |   [AmazonEKSClusterPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazoneksclusterpolicy) 和 [AWS托管策略：AmazonEKSServiceRolePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazoneksservicerolepolicy)   |   [AmazonEKSLocalOutpostClusterPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazonekslocaloutpostclusterpolicy) 和 [AWS 托管策略：AmazonEKSLocalOutpostServiceRolePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazonekslocaloutpostservicerolepolicy)   | 
|  集群 VPC 和子网  |  请参阅 [查看 Amazon EKS 对 VPC 和子网的联网要求](network-reqs.md)   |  请参阅 [为 AWS Outposts 上的 Amazon EKS 集群创建 VPC 和子网](eks-outposts-vpc-subnet-requirements.md)   | 
|  集群终端节点访问  |  公共或私有，或者两者兼而有之  |  仅限私有  | 
|  Kubernetes API 服务器身份验证  |   AWS Identity and Access Management（IAM）和 OIDC  |  IAM 和 `x.509` 证书  | 
|  节点类型  |  仅自行管理  |  仅自行管理  | 
|  节点计算类型  |  Amazon EC2 按需  |  Amazon EC2 按需  | 
|  节点存储类型  |  Amazon EBS `gp2` 和本地 NVMe SSD  |  Amazon EBS `gp2` 和本地 NVMe SSD  | 
|  Amazon EKS 优化版 AMI  |  Amazon Linux、Windows 和 Bottlerocket  |  仅限 Amazon Linux  | 
|  IP 版本  |   仅限 `IPv4`  |   仅限 `IPv4`  | 
|  附加组件  |  Amazon EKS 附加组件或自行管理的附加组件  |  自行管理的附加组件  | 
|  默认容器网络接口  |  适用于 Kubernetes 的 Amazon VPC CNI 插件  |  适用于 Kubernetes 的 Amazon VPC CNI 插件  | 
|  Kubernetes 控制面板日志  |  Amazon CloudWatch Logs  |  Amazon CloudWatch Logs  | 
|  负载均衡  |  使用 [AWS Load Balancer Controller](aws-load-balancer-controller.md) 仅预调配应用程序负载均衡器（无网络负载均衡器）  |  使用 [AWS Load Balancer Controller](aws-load-balancer-controller.md) 仅预调配应用程序负载均衡器（无网络负载均衡器）  | 
|  秘密信封加密  |  请参阅 [在现有集群上使用 KMS 加密 Kubernetes 密钥](enable-kms.md)   |  不支持  | 
|  服务账户的 IAM 角色  |  请参阅 [服务账户的 IAM 角色](iam-roles-for-service-accounts.md)   |  不支持  | 
|  故障排除  |  请参阅 [排查 Amazon EKS 集群和节点问题](troubleshooting.md)   |  请参阅 [排查 AWS Outposts 上的本地 Amazon EKS 集群问题](eks-outposts-troubleshooting.md)   | 

**Topics**

# 在 AWS Outposts 上创建本地 Amazon EKS 集群以实现高可用性
<a name="eks-outposts-local-cluster-overview"></a>

您可以使用本地集群在 AWS Outposts 上本地运行您的整个 Amazon EKS 集群。这有助于降低因临时断开与云的网络连接而造成的应用程序停机风险。光纤中断或天气事件可能会导致此类连接断开的情况。由于整个 Kubernetes 集群在 Outpost 上本地运行，应用程序仍然可用。您可以在断开与云的网络连接期间执行集群操作。有关更多信息，请参阅 [在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网](eks-outposts-network-disconnects.md)。下图显示了本地集群部署。

![\[Outpost 本地集群\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/outposts-local-cluster.png)


本地集群通常可用于与 Outpost 机架配合使用。

## 支持的 AWS 区域
<a name="outposts-control-plane-supported-regions"></a>

您可以在以下 AWS 区域创建本地集群：美国东部（俄亥俄州）、美国东部（弗吉尼亚州北部）、美国西部（北加利福尼亚）、美国西部（俄勒冈州）、亚太地区（首尔）、亚太地区（新加坡）、亚太地区（悉尼）、亚太地区（东京）、加拿大（中部）、欧洲地区（法兰克福）、欧洲地区（爱尔兰）、欧洲地区（伦敦）、中东（巴林）和南美洲（圣保罗）。有关受支持的功能的详细信息，请参阅 [部署选项比较](eks-outposts.md#outposts-overview-comparing-deployment-options)。

**Topics**

# 在 AWS Outposts 上部署 Amazon EKS 集群
<a name="eks-outposts-local-cluster-create"></a>

本主题概述了在 Outpost 上运行本地集群时需要考虑的事项。本主题还提供了有关如何在 Outpost 上部署本地集群的说明。

**重要**  
相关的 Amazon EKS 文档中没有重复这些注意事项。若其他 Amazon EKS 文档主题与本文的考虑事项冲突，则遵从本文的考虑事项。
这些注意事项可能会经常更改。因此，我们建议您定期查看本主题。
很多注意事项与在 AWS 云上创建集群的注意事项不同。
+ 本地集群仅支持 Outpost 机架。单个本地集群可跨构成单个逻辑 Outpost 的多个物理 Outpost 机架运行。单个本地集群不能跨多个逻辑 Outpost 运行。每个逻辑 Outpost 都有一个 Outpost ARN。
+ 本地集群运行和管理 Outpost 上您账户中的 Kubernetes 控制面板。您不能在 Kubernetes 控制面板实例上运行工作负载或对 Kubernetes 控制面板组件进行修改。这些节点由 Amazon EKS 服务管理。对 Kubernetes 控制面板的更改不会在自动 Amazon EKS 管理操作（如修补）期间一直持续存在。
+ 本地集群支持自行管理的附加组件和自行管理的 Amazon Linux 节点组。[适用于 Kubernetes 的 Amazon VPC CNI 插件](managing-vpc-cni.md)、[kube-proxy](managing-kube-proxy.md) 和 [CoreDNS](managing-coredns.md) 附加组件会自动安装在本地集群上。
+ 本地集群需要使用 Outpost 上的 Amazon EBS。您的 Outpost 必须拥有可用于 Kubernetes 控制面板存储的 Amazon EBS。Outpost 仅支持 Amazon EBS `gp2` 卷。
+ 使用 Amazon EBS CSI 驱动程序支持 Amazon EBS 支持的 Kubernetes `PersistentVolumes`。
+ 本地集群的控制面板实例在[堆叠式高可用性拓扑](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/)中设置。在三个控制面板实例中，必须有两个示例始终处于正常运行状态才能进行仲裁。如果失去了仲裁，请联系 AWS 支持人员，因为启用新托管实例需要进行部分服务端操作。

 **先决条件** 
+ 熟悉 [Outposts 部署选项](eks-outposts.md#outposts-overview-comparing-deployment-options)、[根据容量因素为 AWS Outposts 上的 Amazon EKS 集群选择实例类型和置放群组](eks-outposts-capacity-considerations.md)以及 [VPC 要求和注意事项](eks-outposts-vpc-subnet-requirements.md)。
+ 一个现有的 Outpost。有关更多信息，请参阅[什么是 AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html)。
+ 计算机或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 在您的设备或 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)。
+ 具有 `create` 和 `describe` Amazon EKS 集群权限的 IAM 主体（用户或角色）。有关更多信息，请参阅[在 Outpost 上创建本地 Kubernetes 集群](security-iam-id-based-policy-examples.md#policy-create-local-cluster)和[列出或描述所有集群](security-iam-id-based-policy-examples.md#policy-example2)。

创建本地 Amazon EKS 集群后，创建集群的 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)将永久添加。主体作为管理员专门添加到 Kubernetes RBAC 授权表。该实体具有 `system:masters` 权限。此实体的身份在您的集群配置中不可见。因此，重要的是要注意创建集群的实体并确保永远不会删除它。最初，仅创建服务器的主体可以使用 `kubectl` 调用 Kubernetes API 服务器。如果使用控制台创建集群，请确保在集群上运行 `kubectl` 命令时，相同的 IAM 凭证位于 AWS SDK 凭证链中。创建集群后，您可以向其他 IAM 主体授予对集群的访问权限。

## 创建 Amazon EKS 本地集群
<a name="_create_an_amazon_eks_local_cluster"></a>

您可以使用本页中描述的下列工具创建本地集群：
+  [`eksctl`](#eksctl_create_cluster_outpost) 
+  [AWS 管理控制台](#console_create_cluster_outpost) 

您也可以使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/eks/create-cluster.html)、[Amazon EKS API](https://docs.aws.amazon.com/eks/latest/APIReference/API_CreateCluster.html)、[AWS SDK](https://aws.amazon.com/developer/tools/)、[AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html) 或 [Terraform](https://registry.terraform.io/modules/terraform-aws-modules/eks/aws/latest) 在 Outposts 上创建集群。

### `eksctl`
<a name="eksctl_create_cluster_outpost"></a>

 **使用 `eksctl` 创建本地集群** 

1. 在您的设备或 AWS CloudShell 上安装 `0.215.0` 版或更高版本的 `eksctl` 命令行工具。要安装或更新 `eksctl`，请参阅 `eksctl` 文档中的 [Installation](https://eksctl.io/installation)。

1. 将后续内容复制到您的设备。替换以下值，然后运行修改后的命令以创建 `outpost-control-plane.yaml` 文件：
   + 将 *region-code* 替换为您要在其中创建集群的[受支持的 AWS 区域](eks-outposts-local-cluster-overview.md#outposts-control-plane-supported-regions)。
   + 将 *my-cluster* 替换为您的集群名称。名称只能包含字母数字字符（区分大小写）和连字符。该名称必须以字母数字字符开头，且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域和 AWS 账户，该名称必须在其内具有唯一性。对于您在其中创建集群的 AWS 区域和 AWS 账户，该名称必须在其内具有唯一性。
   + 将 *vpc-ExampleID1* 和 *subnet-ExampleID1* 替换为您的现有 VPC 和子网的 ID。VPC 和子网必须符合[在 AWS Outposts 上为上的 Amazon EKS 集群创建 VPC 和子网](eks-outposts-vpc-subnet-requirements.md)中的要求。
   + 将 *uniqueid* 替换为您的 Outpost 的 ID。
   + 将 *m5.large* 替换为您的 Outpost 上可用的实例类型。在选择实例类型之前，请参阅 [根据容量因素为 AWS Outposts 上的 Amazon EKS 集群选择实例类型和置放群组](eks-outposts-capacity-considerations.md)。将部署三个控制面板实例。您无法更改此数字。

     ```
     cat >outpost-control-plane.yaml <<EOF
     apiVersion: eksctl.io/v1alpha5
     kind: ClusterConfig
     
     metadata:
       name: my-cluster
       region: region-code
       version: "1.35"
     
     vpc:
       clusterEndpoints:
         privateAccess: true
       id: "vpc-vpc-ExampleID1"
       subnets:
         private:
           outpost-subnet-1:
             id: "subnet-subnet-ExampleID1"
     
     outpost:
       controlPlaneOutpostARN: arn:aws:outposts:region-code:111122223333:outpost/op-uniqueid
       controlPlaneInstanceType: m5.large
     EOF
     ```

     有关所有可用选项和默认设置的完整列表，请参阅 [AWS Outposts 支持](https://eksctl.io/usage/outposts/)和 `eksctl` 文档中的[配置文件架构](https://eksctl.io/usage/schema/)。

1. 使用您在上一步中创建的配置文件创建集群。`eksctl` 将在您的 Outpost 上创建一个 VPC 和一个子网，以在其中部署集群。

   ```
   eksctl create cluster -f outpost-control-plane.yaml
   ```

   集群预配置需要几分钟时间。在创建集群时，将显示几行输出。输出的最后一行类似于以下示例行。

   ```
   [✓]  EKS cluster "my-cluster" in "region-code" region is ready
   ```
**提示**  
要查看在使用 `eksctl` 创建集群时可指定的大多数选项，请使用 `eksctl create cluster --help` 命令。要查看所有可用的选项，请使用 `config` 文件。有关更多信息，请参阅 `eksctl` 文档中的[使用配置文件](https://eksctl.io/usage/creating-and-managing-clusters/#using-config-files)和[配置文件架构](https://eksctl.io/usage/schema/)。您可以在 GitHub 上查找[配置文件示例](https://github.com/weaveworks/eksctl/tree/master/examples)。

   `eksctl` 命令自动为创建集群的 IAM 主体（用户或角色）创建了[访问条目](access-entries.md)，并授予 IAM 主体对集群上 Kubernetes 对象的管理员权限。如果不希望集群创建者拥有集群上 Kubernetes 对象的管理员访问权限，请在之前的配置文件中添加以下文本：`bootstrapClusterCreatorAdminPermissions: false`（与 `metadata`、`vpc` 和 `outpost` 的级别相同）。如果添加了该选项，则在创建集群后，您需要为至少一个 IAM 主体创建访问条目，否则任何 IAM 主体都无法访问集群上的 Kubernetes 对象。

### AWS 管理控制台
<a name="console_create_cluster_outpost"></a>

 **使用 AWS 管理控制台创建集群** 

1. 您需要有满足 Amazon EKS 要求的现有 VPC 和子网。有关更多信息，请参阅 [为 AWS Outposts 上的 Amazon EKS 集群创建 VPC 和子网](eks-outposts-vpc-subnet-requirements.md)。

1. 如果您已经拥有本地集群 IAM 角色，或者您将使用 `eksctl` 创建集群，则可以跳过此步骤。默认情况下，`eksctl` 会为您创建角色。

   1. 运行以下命令以创建 IAM 信任策略 JSON 文件。

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

   1. 创建 Amazon EKS 集群 IAM 角色。要创建 IAM 角色，必须为正在创建角色的 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)分配 `iam:CreateRole` 操作（权限）。

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

   1. 将名为 [AmazonEKSLocalOutpostClusterPolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKSLocalOutpostClusterPolicy.html) 的 Amazon EKS 托管策略附加到该角色。要将 IAM 策略附加到某个 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)，必须为附加该策略的主体分配以下 IAM 操作（权限）之一：`iam:AttachUserPolicy` 或 `iam:AttachRolePolicy`。

      ```
      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSLocalOutpostClusterPolicy --role-name myAmazonEKSLocalClusterRole
      ```

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在控制台屏幕的顶部，确保您已选择[受支持的 AWS 区域](eks-outposts-local-cluster-overview.md#outposts-control-plane-supported-regions)。

1. 请选择 **Add cluster**（添加集群），然后选择 **Create**（创建）。

1. 在 **Configure cluster**（配置集群）页面上，为以下字段输入或选择值：
   +  **Kubernetes 控制面板位置** – 选择 AWS Outposts。
   +  **Outpost ID** - 选择您要在其上创建控制面板的 Outpost 的 ID。
   +  **Instance type**（实例类型）– 选择一个实例类型。仅显示您的 Outpost 中可用的实例类型。在下拉列表中，每种实例类型都将描述为实例类型推荐多少个节点。在选择实例类型之前，请参阅 [根据容量因素为 AWS Outposts 上的 Amazon EKS 集群选择实例类型和置放群组](eks-outposts-capacity-considerations.md)。所有副本都将使用相同实例类型进行部署。在创建您的集群后，您将无法更改实例类型。将部署三个控制面板实例。您无法更改此数字。
   +  **Name**（名称）– 集群的名称。它在您的 AWS 账户中必须是唯一的。名称只能包含字母数字字符（区分大小写）和连字符。该名称必须以字母数字字符开头，且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域和 AWS 账户，该名称必须在其内具有唯一性。对于您在其中创建集群的 AWS 区域和 AWS 账户，该名称必须在其内具有唯一性。
   +  **Kubernetes 版本** – 选择要用于集群的 Kubernetes 版本。建议选择最新版本，除非您需要使用早期版本。
   +  **集群服务角色** – 选择您在上一步创建的 Amazon EKS 集群 IAM 角色，允许 Kubernetes 控制面板管理 AWS 资源。
   +  **Kubernetes 集群管理员访问权限** – 如果您希望创建集群的 IAM 主体（角色或用户）拥有集群上 Kubernetes 对象的管理员访问权限，请接受默认设置（允许）。Amazon EKS 为 IAM 主体创建访问条目，并向集群管理员授予访问条目的权限。有关访问条目的更多信息，请参阅 [使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限](access-entries.md)。

     如果您希望与创建集群的主体不同的 IAM 主体拥有 Kubernetes 集群对象的管理员访问权限，请选择“不允许”选项。创建集群后，任何拥有创建访问条目的 IAM 权限的 IAM 主体都可以为需要访问 Kubernetes 集群对象的任何 IAM 主体添加访问条目。如需了解所需的 IAM 权限，请参阅《服务授权参考》中的 [Amazon Elastic Kubernetes Service 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)。如果您选择“不允许”选项并且不创建任何访问条目，则没有 IAM 主体有权访问集群上的 Kubernetes 对象。
   +  **Tags（标签）**– （可选）向集群添加任何标签。有关更多信息，请参阅 [使用标签整理 Amazon EKS 资源](eks-using-tags.md)。完成此页面后，请选择**下一步**。

1. 在 **Specify networking (指定联网)** 页面上，为以下字段选择值：
   +  **VPC** – 选择现有 VPC。VPC 必须有足够数量的 IP 地址来供集群、任何节点和您想要创建的其他 Kubernetes 资源使用。您的 VPC 必须符合 [VPC 要求和注意事项](eks-outposts-vpc-subnet-requirements.md#outposts-vpc-requirements)中的要求。
   +  **Subnets**（子网）– 预设情况下，已预先选中在之前字段中指定的 VPC 中的所有可用子网。您选择的子网必须符合[子网要求和注意事项](eks-outposts-vpc-subnet-requirements.md#outposts-subnet-requirements)中的要求。
   +  **Security groups**（安全组）–（可选）指定您希望 Amazon EKS 将之与其创建的网络接口关联的一个或多个安全组。Amazon EKS 会自动创建安全组，以实现集群与 VPC 之间的通信。Amazon EKS 将此安全组以及您选择的任何安全组与它创建的网络接口关联起来。有关 Amazon EKS 创建的集群安全组的更多信息，请参阅 [查看集群的 Amazon EKS 安全组要求](sec-group-reqs.md)。您可以修改 Amazon EKS 创建的集群安全组中的规则。如果您选择添加自己的安全组，则无法更改集群创建后选择的安全组。要使本地主机与集群端点进行通信，您必须允许来自集群安全组的入站流量。对于没有传入和传出互联网连接（也被称为私有集群）的集群，您必须执行以下操作之一：
     + 添加与所需 VPC 端点关联的安全组。有关所需端点的更多信息，请参阅[子网对 AWS 服务的访问权限](eks-outposts-vpc-subnet-requirements.md#subnet-access-to-services)中的[使用接口 VPC 端点](eks-outposts-vpc-subnet-requirements.md#vpc-subnet-requirements-vpc-endpoints)。
     + 修改 Amazon EKS 创建的安全组，以允许来自与 VPC 端点关联的安全组的流量。完成此页面后，请选择**下一步**。

1. 在**配置可观测性**页面上，您可以选择要开启的**指标**和**控制面板日志记录**选项。默认情况下，每种日志类型都处于关闭状态。
   + 有关 Prometheus 指标选项的更多信息，请参阅[第 1 步：开启 Prometheus 指标](prometheus.md#turn-on-prometheus-metrics)。
   + 有关**控制面板日志记录**选项的更多信息，请参阅 [将控制面板日志发送到 CloudWatch Logs](control-plane-logs.md)。完成此页面后，请选择**下一步**。

1. 在 **Review and create (审核和创建)** 页面上，审核您在之前页面输入或选择的信息。如果需要进行更改，请选择 **Edit**（编辑）。在您感到满意后，选择**创建**。**Status**（状态）字段在预置集群时显示 **CREATING**（正在创建）。

   集群预配置需要几分钟时间。

## 查看 Amazon EKS 本地集群
<a name="_view_your_amazon_eks_local_cluster"></a>

1. 在创建您的集群后，您可以查看已创建的 Amazon EC2 控制面板实例。

   ```
   aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Name:Tags[?Key==`Name`]|[0].Value}' | grep my-cluster-control-plane
   ```

   示例输出如下。

   ```
   "Name": "my-cluster-control-plane-id1"
   "Name": "my-cluster-control-plane-id2"
   "Name": "my-cluster-control-plane-id3"
   ```

   每个实例都将受到 `node-role.eks-local.amazonaws.com/control-plane` 的污染，这样就不会在控制面板实例上安排任何工作负载。有关污点的更多信息，请参阅 Kubernetes 文档中的[污点和容忍度](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)。Amazon EKS 将持续监控本地集群的状态。我们将执行自动管理操作，如安全补丁和修复运行状况不佳的实例。当本地集群与云断开连接时，我们会完成操作，以确保在重新连接后将集群修复到运行状况正常的状态。

1. 如果您使用 `eksctl` 创建集群，则可以跳过此步骤。`eksctl` 会为您完成此步骤。通过向 `kubectl` `config` 文件添加新上下文来启用 `kubectl` 与您的集群通信。有关如何创建或更新文件的说明，请参阅 [通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群](create-kubeconfig.md)。

   ```
   aws eks update-kubeconfig --region region-code --name my-cluster
   ```

   示例输出如下。

   ```
   Added new context arn:aws:eks:region-code:111122223333:cluster/my-cluster to /home/username/.kube/config
   ```

1. 要连接到本地集群的 Kubernetes API 服务器，您必须有权访问子网的本地网关，或从 VPC 内部进行连接。有关将 Outpost 机架连接到您的本地网络的更多信息，请参阅《AWS Outposts 用户指南》中的[机架的本地网关的工作原理](https://docs.aws.amazon.com/outposts/latest/userguide/how-racks-work.html)。如果使用直接 VPC 路由且 Outpost 子网具有通向本地网关的路由，则 Kubernetes 控制面板实例的私有 IP 地址将在您的本地网络内自动广播。本地集群的 Kubernetes API 服务器端点托管在 Amazon Route 53（Route 53）中。API 访问端点可由公有 DNS 服务器解析至 Kubernetes API 服务器的私有 IP 地址。

   本地集群的 Kubernetes 控制面板实例将配置具有固定私有 IP 地址的静态弹性网络接口，这些固定私有 IP 地址在整个集群生命周期中都不会更改。在网络连接断开期间，与 Kubernetes API 服务器互动的设备可能无法连接到 Route 53。如果是这种情况，我们建议使用静态私有 IP 地址配置 `/etc/hosts` 以实现持续运行。我们还建议设置本地 DNS 服务器，并将其连接到 Outpost。有关更多信息，请参阅 [AWS Outposts 文档](https://docs.aws.amazon.com/outposts/latest/userguide/how-outposts-works.html#dns)。运行以下命令以确认已建立与集群的通信。

   ```
   kubectl get svc
   ```

   示例输出如下。

   ```
   NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
   kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   28h
   ```

1. （可选）当本地集群与 AWS 云断开连接时，对其进行身份验证测试。有关说明，请参阅[在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网](eks-outposts-network-disconnects.md)。

### 内部资源
<a name="outposts-control-plan-internal-resources"></a>

Amazon EKS 将在您的集群上创建以下资源。这些资源将供 Amazon EKS 内部使用。为使您的集群正常运行，请不要编辑或修改这些资源。
+ 以下[镜像容器组（pod）](https://kubernetes.io/docs/reference/glossary/?all=true#term-mirror-pod)：
  +  `aws-iam-authenticator-node-hostname ` 
  +  `eks-certificates-controller-node-hostname ` 
  +  `etcd-node-hostname ` 
  +  `kube-apiserver-node-hostname ` 
  +  `kube-controller-manager-node-hostname ` 
  +  `kube-scheduler-node-hostname ` 
+ 以下自行管理的附加组件：
  +  `kube-system/coredns` 
  +  `kube-system/` `kube-proxy`（在您添加第一个节点之前不会创建）
  +  `kube-system/aws-node`（在您添加第一个节点之前不会创建）。本地集群将使用适用于 Kubernetes 的 Amazon VPC CNI 插件进行集群联网。不要更改控制面板实例（名为 `aws-node-controlplane-*` 的容器组 (pod)）的配置。您可以使用一些配置变量在插件创建新网络接口时更改默认值。有关更多信息，请参阅 GitHub 上的[文档](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/README.md)。
+ 以下服务：
  +  `default/kubernetes` 
  +  `kube-system/kube-dns` 
+ 名为 `eks.system` 的 `PodSecurityPolicy` 
+ 名为 `eks:system:podsecuritypolicy` 的 `ClusterRole` 
+ 名为 `eks:system` 的 `ClusterRoleBinding` 
+ 除[集群安全组](sec-group-reqs.md)以外，Amazon EKS 还会在您名为 `eks-local-internal-do-not-use-or-edit-cluster-name-uniqueid ` 的 AWS 账户中创建一个安全组。此安全组允许流量在控制面板实例上运行的 Kubernetes 组件之间自由流动。

向您建议的后续步骤：
+  [向创建集群的 IAM 主体授予所需的权限，以便在 AWS 管理控制台中查看 Kubernetes 资源](view-kubernetes-resources.md#view-kubernetes-resources-permissions) 
+  [授予 IAM 实体访问您的集群的权限](grant-k8s-access.md)。如果想让实体在 Amazon EKS 控制台中查看 Kubernetes 资源，请向实体授予[所需的权限](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。
+  [为集群配置日志记录](control-plane-logs.md) 
+ 熟悉[网络断开连接](eks-outposts-network-disconnects.md)期间发生的情况。
+  [将节点添加到集群](eks-outposts-self-managed-nodes.md) 
+ 考虑为您的 `etcd` 制定备份计划。Amazon EKS 不支持为本地集群自动备份和恢复 `etcd`。有关更多信息，请参阅 Kubernetes 文档中的[备份 etcd 集群](https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster)。两个主要选项使用 `etcdctl` 自动拍摄快照或使用 Amazon EBS 存储卷备份。

# 了解适用于 AWS Outposts 的 Kubernetes 和 Amazon EKS 平台版本
<a name="eks-outposts-platform-versions"></a>

本地集群平台版本表示 AWS Outposts 上的 Amazon EKS 集群的功能。这些版本包括在 Kubernetes 控制面板上运行的组件，启用了哪些 Kubernetes API 服务器标志，以及当前的 Kubernetes 补丁版本。每个 Kubernetes 次要版本都有一个或多个关联的 平台版本。不同 Kubernetes 次要版本对应的平台版本相互独立。本地集群和云中的 Amazon EKS 集群的平台版本是独立的。

当新的 Kubernetes 次要版本可用于本地集群（如 `1.31`）时，该 Kubernetes 次要版本的初始平台版本将从 `eks-local-outposts.1` 开始。不过，Amazon EKS 会定期发布新平台版本来支持新的 Kubernetes 控制层面设置并提供安全修复。

当新的本地集群平台版本可用于次要版本时：
+ 平台版本号将递增 (`eks-local-outposts.n+1`)。
+ Amazon EKS 会自动将所有现有本地集群更新到其对应的 Kubernetes 次要版本的最新平台版本。现有平台版本的自动更新将以增量方式推出。推出过程包括逐一替换在 Outpost 上运行的托管型 Kubernetes 控制面板实例，直到全部 3 个实例都被新实例取代。
+ 如果存在服务中断风险，Kubernetes 控制面板实例替换过程会停止进行。只有在 2 个 Kubernetes 控制面板实例运行状况良好且作为集群节点通过了所有就绪条件时，Amazon EKS 才会尝试替换另外一个实例。
+ 平台版本推出过程通常不到 30 分钟就可完成。如果集群在较长一段时间内保持 `UPDATING` 状态，请参阅[排查 AWS Outposts 上的本地 Amazon EKS 集群问题](eks-outposts-troubleshooting.md)，向 AWS Support 支持部门寻求帮助。若未得到 AWS Support 支持部门的指示，切勿手动终止 Kubernetes 控制面板实例。
+ Amazon EKS 可能会发布具有对应的修补程序版本的新工作线程 AMI。对于单个 Kubernetes 次要版本，在 Kubernetes 控制面板与节点 AMI 之间的所有补丁版本都兼容。

新平台版本不会引发破坏性的更改或导致服务中断。

本地集群始终使用指定 Kubernetes 版本的最新可用平台版本 (`eks-local-outposts.n`) 来创建。

下列各表列出了当前和最新的平台版本。

要接收此特定文档页面的所有源文件更改通知，您可以通过 RSS 阅读器订阅以下 URL：

```
https://github.com/awsdocs/amazon-eks-user-guide/commits/mainline/latest/ug/outposts/eks-outposts-platform-versions.adoc.atom
```

## Kubernetes 版本 `1.31`
<a name="outposts-platform-versions-1-31"></a>

所有 `1.31` 平台版本都启用了以下准入控制器：`CertificateApproval`、`CertificateSigning`、`CertificateSubjectRestriction`、`ClusterTrustBundleAttest`、`DefaultIngressClass`、`DefaultStorageClass`、`DefaultTolerationSeconds`、`ExtendedResourceToleration`、`LimitRanger`、`MutatingAdmissionWebhook`、`NamespaceLifecycle`、`NodeRestriction`、`PersistentVolumeClaimResize`、`PodSecurity`、`Priority`、`ResourceQuota`、`RuntimeClass`、`ServiceAccount`、`StorageObjectInUseProtection`、`TaintNodesByCondition`、`ValidatingAdmissionPolicy` 和 `ValidatingAdmissionWebhook`。


| Kubernetes 版本 | Amazon EKS 平台版本 | 发行说明 | 发行日期 | 
| --- | --- | --- | --- | 
|   `1.31.14`   |   `eks-local-outposts.8`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.31.14`。AWSIAM 身份验证器已更新为 `v0.7.8`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.4`。已将 Bottlerocket 版本更新为 `v1.52.0`。  |  2025 年 12 月 23 日  | 
|   `1.31.12`   |   `eks-local-outposts.5`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.31.10`。AWSIAM 身份验证器已更新为 `v0.7.4`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.2`。已将 Bottlerocket 版本更新为 `v1.47.0`。  |  2025 年 10 月 3 日  | 
|   `1.31.9`   |   `eks-local-outposts.4`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.31.9`。AWSIAM 身份验证器已更新为 `v0.7.2`。适用于 Kubernetes 的 Amazon VPC CNI 插件已更新到 `v1.20.0`；Bottlerocket 版本也已更新到 `v1.43.0`。  |  2025 年 8 月 9 日  | 
|   `1.31.7`   |   `eks-local-outposts.3`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.31.9`。AWSIAM 身份验证器已更新为 `v0.7.1`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.19.5`。已将 Bottlerocket 版本更新为 `v1.40.0`。  |  2025 年 6 月 19 日  | 
|   `1.31.6`   |   `eks-local-outposts.2`   |  新的平台版本（包括安全修复和增强功能）。已将 Bottlerocket 版本更新为 `v1.36.0`。  |  2025 年 4 月 24 日  | 
|   `1.31.6`   |   `eks-local-outposts.1`   |  Outpost 上适用于本地 Amazon EKS 集群的 Kubernetes 版本 `v1.31` 的初始版本。  |  2025 年 4 月 9 日  | 

## Kubernetes 版本 `1.30`
<a name="outposts-platform-versions-1-30"></a>

所有 `1.30` 平台版本都启用了以下准入控制器：`CertificateApproval`、`CertificateSigning`、`CertificateSubjectRestriction`、`ClusterTrustBundleAttest`、`DefaultIngressClass`、`DefaultStorageClass`、`DefaultTolerationSeconds`、`ExtendedResourceToleration`、`LimitRanger`、`MutatingAdmissionWebhook`、`NamespaceLifecycle`、`NodeRestriction`、`PersistentVolumeClaimResize`、`PodSecurity`、`Priority`、`ResourceQuota`、`RuntimeClass`、`ServiceAccount`、`StorageObjectInUseProtection`、`TaintNodesByCondition`、`ValidatingAdmissionPolicy` 和 `ValidatingAdmissionWebhook`。


| Kubernetes 版本 | Amazon EKS 平台版本 | 发行说明 | 发行日期 | 
| --- | --- | --- | --- | 
|   `1.30.14`   |   `eks-local-outposts.10`   |  搭载安全补丁与功能增强的全新平台版本。AWSIAM 身份验证器已更新为 `v0.7.8`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.4`。已将 Bottlerocket 版本更新为 `v1.52.0`。  |  2025 年 12 月 23 日  | 
|   `1.30.14`   |   `eks-local-outposts.7`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.30.14`。AWSIAM 身份验证器已更新为 `v0.7.4`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.2`。已将 Bottlerocket 版本更新为 `v1.47.0`。  |  2025 年 10 月 3 日  | 
|   `1.30.13`   |   `eks-local-outposts.6`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.30.13`。AWSIAM 身份验证器已更新为 `v0.7.2`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.0`。已将 Bottlerocket 版本更新为 `v1.43.0`。  |  2025 年 8 月 9 日  | 
|   `1.30.11`   |   `eks-local-outposts.5`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.30.11`。AWSIAM 身份验证器已更新为 `v0.7.1`。适用于 Kubernetes 的 Amazon VPC CNI 插件已更新到 `v1.19.5`；Bottlerocket 版本也已更新到 `v1.40.0`。  |  2025 年 6 月 19 日  | 
|   `1.30.10`   |   `eks-local-outposts.4`   |  新的平台版本（包括安全修复和增强功能）。已将 Bottlerocket 版本更新为 `v1.36.0`。  |  2025 年 4 月 24 日  | 
|   `1.30.10`   |   `eks-local-outposts.3`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.30.10`。AWSIAM 身份验证器已更新为 `v0.6.29`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.19.2`。CoreDNS 已更新至 `v1.11.4`。AWS云控制器管理器已更新至 `v1.30.8`。已将 Bottlerocket 版本更新为 `v1.34.0`。  |  2025 年 3 月 27 日  | 
|   `1.30.7`   |   `eks-local-outposts.2`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.30.7`。AWSIAM 身份验证器已更新为 `v0.6.28`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.19.0`。已将 Bottlerocket 版本更新为 `v1.29.0`。  |  2025 年 1 月 10 日  | 
|   `1.30.5`   |   `eks-local-outposts.1`   |  Outpost 上适用于本地 Amazon EKS 集群的 Kubernetes 版本 `v1.30` 的初始版本。  |  2024 年 11 月 13 日  | 

## Kubernetes 版本 `1.29`
<a name="outposts-platform-versions-1-29"></a>

所有 `1.29` 平台版本都启用了以下准入控制器：`CertificateApproval`、`CertificateSigning`、`CertificateSubjectRestriction`、`ClusterTrustBundleAttest`、`DefaultIngressClass`、`DefaultStorageClass`、`DefaultTolerationSeconds`、`ExtendedResourceToleration`、`LimitRanger`、`MutatingAdmissionWebhook`、`NamespaceLifecycle`、`NodeRestriction`、`PersistentVolumeClaimResize`、`PodSecurity`、`Priority`、`ResourceQuota`、`RuntimeClass`、`ServiceAccount`、`StorageObjectInUseProtection`、`TaintNodesByCondition`、`ValidatingAdmissionPolicy` 和 `ValidatingAdmissionWebhook`。


| Kubernetes 版本 | Amazon EKS 平台版本 | 发行说明 | 发行日期 | 
| --- | --- | --- | --- | 
|   `1.29.15`   |   `eks-local-outposts.13`   |  搭载安全补丁与功能增强的全新平台版本。AWSIAM 身份验证器已更新为 `v0.7.8`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.4`。已将 Bottlerocket 版本更新为 `v1.52.0`。  |  2025 年 12 月 23 日  | 
|   `v1.29.15`   |   `eks-local-outposts.10`   |  搭载安全补丁与功能增强的全新平台版本。AWSIAM 身份验证器已更新为 `v0.7.4`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.2`。已将 Bottlerocket 版本更新为 `v1.47.0`。  |  2025 年 10 月 3 日  | 
|   `v1.29.15`   |   `eks-local-outposts.9`   |  搭载安全补丁与功能增强的全新平台版本。AWSIAM 身份验证器已更新为 `v0.7.2`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.20.0`。已将 Bottlerocket 版本更新为 `v1.43.0`。  |  2025 年 8 月 9 日  | 
|   `v1.29.15`   |   `eks-local-outposts.8`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.29.15`。AWSIAM 身份验证器已更新为 `v0.7.1`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.19.5`。已将 Bottlerocket 版本更新为 `v1.40.0`。  |  2025 年 6 月 19 日  | 
|   `v1.29.14`   |   `eks-local-outposts.7`   |  新的平台版本（包括安全修复和增强功能）。已将 Bottlerocket 版本更新为 `v1.36.0`。  |  2025 年 3 月 24 日  | 
|   `v1.29.14`   |   `eks-local-outposts.6`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.29.14`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.19.2`。CoreDNS 已更新至 `v1.11.4`。AWS云控制器管理器已更新至 `v1.29.8`。已将 Bottlerocket 版本更新为 `v1.34.0`。  |  2025 年 3 月 27 日  | 
|   `v1.29.11`   |   `eks-local-outposts.5`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.29.11`。适用于 Kubernetes 的 Amazon VPC CNI 插件升级到 `v1.19.0`。已将 CoreDNS 映像更新为 `v1.11.3`。已将 Bottlerocket 版本更新为 `v1.29.0`。  |  2025 年 1 月 10 日  | 
|   `1.29.9`   |   `eks-local-outposts.4`   |  已将具有安全修复和增强功能 kube-proxy 的新平台版本更新为 `v1.29.9`。AWSIAM 身份验证器已更新为 `v0.6.26`。已将 Bottlerocket 版本更新为 `v1.26.0`。  |  2024 年 11 月 8 日  | 
|   `1.29.6`   |   `eks-local-outposts.3`   |  新的平台版本（包括安全修复和增强功能）。已将 Bottlerocket 版本更新为 `v1.22.0`。  |  2024 年 10 月 22 日  | 
|   `1.29.6`   |   `eks-local-outposts.2`   |  新的平台版本（包括安全修复和增强功能）。已将 Bottlerocket 版本更新为 `v1.21.0`。  |  2024 年 8 月 27 日  | 
|   `1.29.6`   |   `eks-local-outposts.1`   |  Outpost 上适用于本地 Amazon EKS 集群的 Kubernetes 版本 `v1.29` 的初始版本。  |  2024 年 8 月 20 日  | 

# 为 AWS Outposts 上的 Amazon EKS 集群创建 VPC 和子网
<a name="eks-outposts-vpc-subnet-requirements"></a>

在您创建本地集群时，您将指定 VPC 以及在 Outpost 上运行的至少一个私有子网。本主题概述适用于本地集群的 VPC 和子网的要求和注意事项。

## VPC 要求和注意事项
<a name="outposts-vpc-requirements"></a>

在您创建本地集群时，您指定的 VPC 必须满足以下要求和注意事项：
+ 请确保 VPC 具有足够的 IP 地址用于本地集群、任何节点以及您要创建的其他 Kubernetes 资源。如果要使用的 VPC 没有足够的 IP 地址，请增加可用的 IP 地址数量。您可以通过[关联其他无类别域间路由（CIDR）块](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#add-ipv4-cidr)与 VPC 来执行此操作。您可以在创建集群之前或之后将私有 (RFC 1918) 和公有（非 RFC 1918）CIDR 块关联到您的 VPC。集群最多可能需要 5 个小时的时间来识别与 VPC 关联的 CIDR 块。
+ VPC 无法分配 IP 前缀或 IPv6 CIDR 块。由于这些限制，[为带前缀的 Amazon EKS 节点分配更多 IP 地址](cni-increase-ip-addresses.md)和[了解如何将 IPv6 地址分配给集群、容器组（pod）和服务](cni-ipv6.md)中包含的信息不适用于您的 VPC。
+ VPC 已启用 DNS 主机名和 DNS 解析。如果没有这些功能，本地集群将无法创建，因此您需要启用这些功能，然后重新创建集群。有关更多信息，请参阅《Amazon VPC 用户指南》中的 [VPC 的 DNS 属性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。
+ 要通过本地网络访问本地集群，VPC 必须与 Outpost 的本地网关路由表关联。有关更多信息，请参阅《AWS Outposts 用户指南》中的 [VPC 关联](https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html#vpc-associations)。

## 子网要求和注意事项
<a name="outposts-subnet-requirements"></a>

创建集群时，请指定至少一个私有子网。如果您指定多个子网，Kubernetes 控制面板实例将均匀分布在这些子网中。如果指定多个子网，则这些子网必须存在于同一 Outpost 上。此外，子网还必须具有适当的路由和安全组权限，以便相互通信。创建本地集群时，您指定的子网必须满足以下要求：
+ 子网均位于同一逻辑 Outpost 上。
+ 这些子网总共具有至少三个可用 IP 地址用于 Kubernetes 控制面板实例。如果指定三个子网，则每个子网必须具有至少一个可用 IP 地址。如果指定两个子网，则每个子网必须具有至少两个可用 IP 地址。如果指定一个子网，则该子网必须具有至少三个可用 IP 地址。
+ 子网具有通向 Outpost 机架的[本地网关](https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html)的路由，用于通过您的本地网络访问 Kubernetes API 服务器。如果子网没有通向 Outpost 机架的本地网关的路由，则您必须从 VPC 中与 Kubernetes API 服务器通信。
+ 子网必须使用基于 IP 地址的命名。Amazon EKS 不支持 Amazon EC2 [基于资源的命名](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html#instance-naming-rbn)。

## 子网对 AWS 服务的访问权限
<a name="subnet-access-to-services"></a>

Outposts 上本地集群的私有子网必须能够与区域性 AWS 服务通信。您可以通过使用 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)进行出站互联网访问来实现此目的，或者，如果您想在 VPC 内保持所有流量的私密性，则使用[接口 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)。

### 使用 NAT 网关
<a name="subnet-access-nat-gateway"></a>

Outposts 上本地集群的私有子网必须具有关联的路由表，其中包含通向 NAT 网关（在 Outposts 的父可用区内的公有子网中）的路由。该公有子网必须具有一条通向[互联网网关](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)的路由。NAT 网关可以实现出站互联网访问，并防止从互联网到 Outpost 上实例进行未经请求的入站连接。

### 使用接口 VPC 端点
<a name="vpc-subnet-requirements-vpc-endpoints"></a>

如果 Outposts 上本地集群的私有子网没有出站互联网连接，或者如果您想在 VPC 内保持所有流量的私密性，则在创建集群之前，您必须在区域性子网中创建以下接口 VPC 端点和[网关端点](https://docs.aws.amazon.com/vpc/latest/privatelink/gateway-endpoints.html)。


| 终端节点 | 端点类型 | 
| --- | --- | 
|   `com.amazonaws.region-code.ssm`   |  接口  | 
|   `com.amazonaws.region-code.ssmmessages`   |  接口  | 
|   `com.amazonaws.region-code.ec2messages`   |  接口  | 
|   `com.amazonaws.region-code.ec2`   |  接口  | 
|   `com.amazonaws.region-code.secretsmanager`   |  接口  | 
|   `com.amazonaws.region-code.logs`   |  接口  | 
|   `com.amazonaws.region-code.sts`   |  接口  | 
|   `com.amazonaws.region-code.ecr.api`   |  接口  | 
|   `com.amazonaws.region-code.ecr.dkr`   |  接口  | 
|   `com.amazonaws.region-code.s3`   |  Gateway  | 

端点必须满足以下要求：
+ 在位于 Outposts 父可用区的私有子网中创建
+ 启用私有 DNS 名称
+ 具有附加的安全组，该组允许来自私有 outpost 子网的 CIDR 范围的入站 HTTPS 流量。

创建端点会产生费用。有关更多信息，请参阅 [AWS PrivateLink 定价](https://aws.amazon.com/privatelink/pricing/)。如果容器组（pod）需要访问其他 AWS 服务，您需要创建额外的端点。有关端点的完整列表，请参阅[与 AWS PrivateLink 集成的 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/aws-services-privatelink-support.html)。

## 创建 VPC
<a name="outposts-create-vpc"></a>

您可以使用以下 AWS CloudFormation 模板之一，创建满足上述要求的 VPC：
+  **[模板 1](https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-09-20/amazon-eks-local-outposts-vpc-subnet.yaml) ** – 此模板会创建一个 VPC，该 VPC 具有一个位于 Outpost 的私有子网，以及一个位于 AWS 区域的公有子网。该私有子网具有通过位于 AWS 区域中公有子网中的 NAT 网关通向互联网的路由。此模板可用于在具有传出互联网访问权限的子网中创建本地集群。
+  **[模板 2](https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2023-03-20/amazon-eks-local-outposts-fully-private-vpc-subnet.yaml) ** – 此模板会创建一个 VPC，该 VPC 具有一个位于 Outpost 的私有子网，以及在没有传入或传出互联网访问权限的子网（也称为私有子网）中创建本地集群所需的最小 VPC 端点集。

# 在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网
<a name="eks-outposts-network-disconnects"></a>

如果本地网络断开与 AWS 云的连接，您可以继续在 Outpost 上使用本地 Amazon EKS 集群。本主题介绍如何针对网络断开连接的情况准备本地集群以及相关注意事项。
+ 本地集群可在临时、计划外网络断开连接期间实现稳定性和持续操作。AWSOutposts 仍是一个完全连接的产品，充当您的数据中心内 AWS 云的扩展。当 Outpost 与 AWS 云之间的网络断开连接，我们建议您尝试恢复连接。如需查看相关说明，请参阅 *AWS Outposts 用户指南*中的 [AWS Outposts 机架网络故障排除核对清单](https://docs.aws.amazon.com/outposts/latest/userguide/network-troubleshoot.html)。有关如何对本地集群的问题进行故障排除的更多信息，请参阅 [排查 AWS Outposts 上的本地 Amazon EKS 集群问题](eks-outposts-troubleshooting.md)。
+ Outpost 将发出一个 `ConnectedStatus` 指标，您可用于监控 Outpost 的连接状态。有关更多信息，请参阅 *AWS Outposts 用户指南*中的 [Outposts 指标](https://docs.aws.amazon.com/outposts/latest/userguide/outposts-cloudwatch-metrics.html#outposts-metrics)。
+ 本地集群使用 IAM 作为默认身份验证机制，该身份验证机制[将 AWS Identity and Access Management 身份验证器用于 Kubernetes](https://github.com/kubernetes-sigs/aws-iam-authenticator)。IAM 在网络连接断开期间不可用。因此，本地集群支持使用 `x.509` 证书的替代身份验证机制，您可以使用该机制在网络连接断开期间连接到集群。有关如何获取 `x.509` 证书并将其用于您的集群的信息，请参阅 [在网络断开连接期间对您的本地集群进行身份验证](#outposts-network-disconnects-authentication)。
+ 如果您在网络连接断开期间无法访问 Route 53，请考虑在您的本地环境中使用本地 DNS 服务器。Kubernetes 控制面板实例使用静态 IP 地址。您可以使用端点主机名和 IP 地址配置用于连接到您的集群的主机，作为使用本地 DNS 服务器的替代方法。有关更多信息，请参阅 *AWS Outposts 用户指南*中的 [DNS](https://docs.aws.amazon.com/outposts/latest/userguide/how-outposts-works.html#dns)。
+ 如果您预计在网络连接断开期间应用程序流量会增加，则可以在连接到云时在您的集群中预调配备用计算容量。Amazon EC2 实例包含在 AWS Outposts 的价格中。因此，运行备用实例不会影响您的 AWS 用量成本。
+ 在网络连接断开期间，要启用工作负载的创建、更新和扩缩操作，必须可以通过本地网络访问您的应用程序的容器映像，并且您的集群必须具有足够的容量。本地集群不会为您托管容器注册表。如果容器组（pod）之前已在这些节点上运行过，则容器映像将缓存在这些节点上。如果您通常从云中的 Amazon ECR 拉取应用程序的容器映像，建议运行本地缓存或注册表。如果您需要在网络连接断开期间创建、更新和扩展工作负载资源的操作，那么本地缓存或注册表会很有帮助。
+ 本地集群使用 Amazon EBS 作为持久卷的默认存储类，并使用 Amazon EBS CSI 驱动程序来管理 Amazon EBS 持久卷的生命周期。网络连接断开期间，由 Amazon EBS 备份的容器组（pod）将无法创建、更新或扩展。这是因为这些操作需要调用云端的 Amazon EBS API。如果您在本地集群上部署有状态工作负载，并且需要在网络断开连接期间执行创建、更新或扩缩操作，请考虑使用替代存储机制。
+ 如果 AWS Outposts 无法访问相关 AWS 区域内 API（例如 Amazon EBS 或 Amazon S3 的 API），则无法创建或删除 Amazon EBS 快照。
+ 将 ALB（Ingress）与 AWS Certificate Manager（ACM）集成时，证书会被推送并存储在 AWS Outposts ALB 计算实例的内存中。如果与 AWS 区域断开连接，当前的 TLS 终止将继续运行。在这种情况下，更改操作将失败（例如新的传入定义、新的基于 ACM 的证书 API 操作、ALB 计算扩展或证书轮换）。有关更多信息，请参阅 *AWS Certificate Manager 用户指南*中的[排查托管证书续订的问题](https://docs.aws.amazon.com/acm/latest/userguide/troubleshooting-renewal.html)。
+ 在网络断开连接期间，Amazon EKS 控制面板日志将本地缓存在 Kubernetes 控制面板实例上。重新连接后，会将这些日志发送到父级 AWS 区域中的 CloudWatch 日志。您可以使用 [Prometheus](https://prometheus.io/)、[Grafana](https://grafana.com/) 或 Amazon EKS 合作伙伴解决方案，利用 Kubernetes API 服务器的指标端点或将 Kubernetes 用于日志，在本地监控集群。
+ 如果您将 Outpost 上的 AWS 负载均衡器控制器用于应用程序流量，则在网络连接断开期间，前面带有 AWS 负载均衡器控制器的现有容器组（pod）将继续接收流量。在网络断开连接期间创建的新容器组（pod）不会接收流量，直到 Outpost 重新连接到 AWS 云为止。考虑在连接到 AWS 云时为您的应用程序设置副本计数，以满足您在网络断开连接期间的扩缩需求。
+ 适用于 Kubernetes 的 Amazon VPC CNI 插件默认设置为[辅助 IP 模式](https://aws.github.io/aws-eks-best-practices/networking/vpc-cni/#overview)。它配置为 `WARM_ENI_TARGET`=`1`，这将允许插件保持可用 IP 地址的“完全弹性网络接口”。考虑在断开连接状态下根据您的扩缩需求更改 `WARM_ENI_TARGET`、`WARM_IP_TARGET` 和 `MINIMUM_IP_TARGET` 值。有关更多信息，请参阅 GitHub 上插件的[自述文件](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/README.md)。有关每种实例类型支持的容器组（pod）最大数量列表，请参阅 GitHub 上的 [eni-max-pods.txt](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/misc/eni-max-pods.txt) 文件。

## 在网络断开连接期间对您的本地集群进行身份验证
<a name="outposts-network-disconnects-authentication"></a>

 网络断开连接期间，AWS Identity and Access Management（IAM）不可用。在断开连接时，您将无法使用 IAM 凭证对您的本地集群进行身份验证。但是，在断开连接时，您可以使用 `x509` 证书通过本地网络连接到集群。您需要下载并存储客户端 `X509` 证书，以便在断开连接期间使用。在本主题中，您将学习在集群处于断开连接状态时，如何创建和使用证书对其进行身份验证。

1. 创建证书签名请求。

   1. 生成证书签名请求。

      ```
      openssl req -new -newkey rsa:4096 -nodes -days 365 \
          -keyout admin.key -out admin.csr -subj "/CN=admin"
      ```

   1. 在 Kubernetes 中创建证书签名请求。

      ```
      BASE64_CSR=$(cat admin.csr | base64 -w 0)
      cat << EOF > admin-csr.yaml
      apiVersion: certificates.k8s.io/v1
      kind: CertificateSigningRequest
      metadata:
        name: admin-csr
      spec:
        signerName: kubernetes.io/kube-apiserver-client
        request: ${BASE64_CSR}
        usages:
        - client auth
      EOF
      ```

1. 使用 `kubectl` 创建证书签名请求。

   ```
   kubectl create -f admin-csr.yaml
   ```

1. 检查证书签名请求的状态。

   ```
   kubectl get csr admin-csr
   ```

   示例输出如下。

   ```
   NAME       AGE   REQUESTOR                       CONDITION
   admin-csr  11m   kubernetes-admin                Pending
   ```

   Kubernetes 已创建证书签名请求。

1. 批准证书签名请求。

   ```
   kubectl certificate approve admin-csr
   ```

1. 重新检查证书签名请求状态是否为已批准。

   ```
   kubectl get csr admin-csr
   ```

   示例输出如下。

   ```
   NAME       AGE   REQUESTOR                     CONDITION
   admin-csr  11m   kubernetes-admin              Approved
   ```

1. 检索并验证证书。

   1. 检索证书。

      ```
      kubectl get csr admin-csr -o jsonpath='{.status.certificate}' | base64 --decode > admin.crt
      ```

   1. 验证证书。

      ```
      cat admin.crt
      ```

1. 为 `admin` 用户创建集群角色绑定。

   ```
   kubectl create clusterrolebinding admin --clusterrole=cluster-admin \
       --user=admin --group=system:masters
   ```

1. 为断开连接状态生成用户范围的 kubeconfig。

   您可以使用已下载的 `admin` 证书生成 `kubeconfig` 文件。替换以下命令中的 *my-cluster* 和 *apiserver-endpoint*。

   ```
   aws eks describe-cluster --name my-cluster \
       --query "cluster.certificateAuthority" \
       --output text | base64 --decode > ca.crt
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig set-cluster my-cluster \
       --certificate-authority=ca.crt --server apiserver-endpoint --embed-certs
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig set-credentials admin \
       --client-certificate=admin.crt --client-key=admin.key --embed-certs
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig set-context admin@my-cluster \
       --cluster my-cluster --user admin
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig use-context admin@my-cluster
   ```

1. 查看您的 `kubeconfig` 文件。

   ```
   kubectl get nodes --kubeconfig admin.kubeconfig
   ```

1. 如果您的 Outpost 上已有投入生产中的服务，请跳过此步骤。如果 Amazon EKS 是在您的 Outpost 上运行的唯一服务，并且 Outpost 当前未投入生产，则您可以模拟网络断开连接。在使用本地集群投入生产之前，请模拟断开连接，以确保在集群处于断开连接状态时可以访问该集群。

   1. 在将您的 Outpost 连接到 AWS 区域的联网设备上应用防火墙规则。这将断开 Outpost 的服务链接。您无法创建任何新实例。当前正在运行的实例将断开与 AWS 区域和互联网的连接。

   1. 您可以使用 `x509` 证书在断开连接时测试与您的本地集群的连接。确保将 `kubeconfig` 更改为您在上一步创建的 `admin.kubeconfig`。将 *my-cluster* 替换为您的本地集群的名称。

      ```
      kubectl config use-context admin@my-cluster --kubeconfig admin.kubeconfig
      ```

   如果您在本地集群处于断开连接状态时发现其存在任何问题，则我们建议开具支持票证。

# 根据容量因素为 AWS Outposts 上的 Amazon EKS 集群选择实例类型和置放群组
<a name="eks-outposts-capacity-considerations"></a>

本主题提供以下指南：为 Outpost 上的本地 Amazon EKS 集群选择 Kubernetes 控制面板实例类型以及（可选）使用置放群组满足高可用性要求。

在 Outpost 上选择要用于本地集群的 Kubernetes 控制面板的实例类型（如 `m5`、`c5` 或 `r5`）前，请确认可用于 Outpost 配置的实例类型。确定可用实例类型后，请根据您的工作负载所需的节点数量选择实例大小（如 `large`、`xlarge` 或 `2xlarge`）。下表提供了有关选择实例大小的建议。

**注意**  
必须在 Outpost 上插入实例大小。请确保本地集群生命周期内，有足够的容量可供该大小的三个实例在 Outpost 上运行。有关可用 Amazon EC2 实例类型的列表，请参阅 [AWS Outposts 机架功能](https://aws.amazon.com/outposts/rack/features/)中的“计算和存储”章节。


| 节点数量 | Kubernetes 控制面板实例实例大小 | 
| --- | --- | 
|  1–20  |   `large`   | 
|  21–100  |   `xlarge`   | 
|  101–250  |   `2xlarge`   | 
|  251–500  |   `4xlarge`   | 

Kubernetes 控制面板的存储需要每个本地集群拥有 246 GB 的 Amazon EBS 存储才能满足 `etcd` 所需的 IOPS。创建本地集群后，系统将为您自动预置 Amazon EBS 卷。

## 控制面板置放
<a name="outpost-capacity-considerations-control-plane-placement"></a>

如果不指定具有 `OutpostConfig.ControlPlanePlacement.GroupName` 属性的置放群组，则在您的 Outpost 上可用的基础容量下，为 Kubernetes 控制面板预置的 Amazon EC2 实例不会接受任何特定的硬件置放强制执行。

您可以使用置放群组满足 Outpost 上的本地 Amazon EKS 集群的高可用性要求。通过在集群创建期间指定置放群组，您可以影响 Kubernetes 控制面板实例的置放。这些实例分布在独立的基础硬件（机架或主机）上，从而最大限度地减少相关实例对硬件故障事件的影响。

您可以配置的分布类型取决于部署中的 Outpost 机架数量。
+  **在单个逻辑 Outpost 中使用一个或两个物理机架的部署**：您必须至少具有三台主机，这些主机通过为 Kubernetes 控制面板实例选择的实例类型进行配置。使用*主机级分布*的*分布*置放群组可确保所有 Kubernetes 控制面板实例在 Outpost 部署中可用的基础机架内的不同主机上运行。
+  **在单个逻辑 Outpost 中使用三个或更多物理机架的部署**：您必须至少具有三台主机，这些主机通过为 Kubernetes 控制面板实例选择的实例类型进行配置。使用*机架级分布*的*分布*置放群组可确保所有 Kubernetes 控制面板实例在 Outpost 部署中的不同机架上运行。或者，您可以使用上一个选项中描述的*主机级分布*置放群组。

您负责创建所需的置放群组。您在调用 `CreateCluster` API 时指定置放群组。有关置放群组及如何创建置放群组的更多信息，请参阅《Amazon EC2 用户指南》中的[置放群组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)。
+ 指定置放群组后，Outpost 上必须有可用的插槽容量才能成功创建本地 Amazon EKS 集群。容量因您使用的主机或机架分布类型而异。如果没有足够的容量，则集群仍然处于 `Creating` 状态。您可以检查 [DescribeCluster](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html) API 响应运行状况字段上的 `Insufficient Capacity Error`。您必须释放容量才能使创建过程继续进行。
+ 在 Amazon EKS 本地集群平台和版本更新期间，使用滚动更新策略将您集群中的 Kubernetes 控制面板实例替换为新实例。在此替换过程中，每个控制面板实例都将终止，从而释放其相应插槽。新的更新实例将预置到相应插槽位置。更新的实例可能会放置在已发布的插槽中。如果该插槽被另一个不相关的实例占用，并且没有符合所需分布拓扑要求的剩余容量，则集群将保持 `Updating` 状态。您可以查看 [DescribeCluster](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html) API 响应运行状况字段上的相应 `Insufficient Capacity Error`。您必须释放容量，以便更新过程继续进行并重新建立之前的高可用性级别。
+ 在每个 AWS 区域中，最多可以为每个账户创建 500 个置放群组。有关更多信息，请参阅《Amazon EC2 用户指南》中的[一般规则和限制](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html#placement-groups-limitations-general)。

# 排查 AWS Outposts 上的本地 Amazon EKS 集群问题
<a name="eks-outposts-troubleshooting"></a>

本主题将介绍您在使用本地集群时可能会看到的一些常见错误，以及如何排查这些错误。虽然本地集群与云端 Amazon EKS 集群相似，但在 Amazon EKS 的托管方式上存在一些差异。

**重要**  
若未得到 AWS Support 支持部门明确指示，切勿终止在 Outpost 上运行的任何托管 EKS 本地集群 `Kubernetes` 控制面板实例。终止这些实例会给本地集群服务可用性带来风险，包括：如果同时终止多个实例，会丢失本地集群。EKS 本地集群 `Kubernetes` 控制面板实例由 EC2 实例控制台上的 `eks-local:controlplane-name` 标签标识。

## API 行为
<a name="outposts-troubleshooting-api-behavior"></a>

本地集群是通过 Amazon EKS API 创建的，但以异步方式运行。这意味着对于本地集群，对 Amazon EKS API 的请求会立即返回。但是，这些请求可能会成功，也可能由于输入验证错误而快速失效，或者失败并出现描述性验证错误。此行为类似于 Kubernetes API。

本地集群不会过渡到 `FAILED` 状态。Amazon EKS 会尝试以连续方式协调集群状态与用户请求的所需状态。因此，本地集群可能会长时间保持在 `CREATING` 状态，直到根本问题得到解决。

## 描述集群运行状况字段
<a name="outposts-troubleshooting-describe-cluster-health-field"></a>

可以使用 [describe-cluster](https://docs.aws.amazon.com/cli/latest/reference/eks/describe-cluster.html) Amazon EKS AWS CLI 命令发现本地集群问题。本地集群问题将由 `describe-cluster` 命令响应的 `cluster.health` 字段显示。此字段中包含的消息包括错误代码、描述性消息和相关的资源 ID。此信息将仅通过 Amazon EKS API 和 AWS CLI 提供。在以下示例中，将 *my-cluster* 替换为您的本地集群的名称。

```
aws eks describe-cluster --name my-cluster --query 'cluster.health'
```

示例输出如下。

```
{
    "issues": [
        {
            "code": "ConfigurationConflict",
            "message": "The instance type 'm5.large' is not supported in Outpost 'my-outpost-arn'.",
            "resourceIds": [
                "my-cluster-arn"
            ]
        }
    ]
}
```

如果问题无法修复，您可能需要删除该本地集群，然后创建一个新的本地集群。例如，尝试使用 Outpost 上不可用的实例类型预调配集群。下表包括常见的运行状况相关错误。


| 错误情形 | 代码 | Message | ResourceIds | 
| --- | --- | --- | --- | 
|  无法找到提供的子网。  |   `ResourceNotFound`   |   `The subnet ID subnet-id does not exist`   |  所有提供的子网 ID  | 
|  提供的子网不属于同一 VPC。  |   `ConfigurationConflict`   |   `Subnets specified must belong to the same VPC`   |  所有提供的子网 ID  | 
|  提供的某些子网不属于指定的 Outpost。  |   `ConfigurationConflict`   |   `Subnet subnet-id expected to be in outpost-arn, but is in other-outpost-arn `   |  子网 ID 有问题  | 
|  提供的某些子网不属于任何 Outpost。  |   `ConfigurationConflict`   |   `Subnet subnet-id is not part of any Outpost`   |  子网 ID 有问题  | 
|  提供的某些子网没有足够的空闲地址来为控制面板实例创建弹性网络接口。  |   `ResourceLimitExceeded`   |   `The specified subnet does not have enough free addresses to satisfy the request.`   |  子网 ID 有问题  | 
|  Outpost 上不支持指定的控制面板实例类型。  |   `ConfigurationConflict`   |   `The instance type type is not supported in Outpost outpost-arn `   |  集群 ARN  | 
|  您已终止控制面板 Amazon EC2 实例，或 `run-instance` 已成功但观察到的状态更改为 `Terminated`。在您的 Outpost 重新连接并且 Amazon EBS 内部错误导致 Amazon EC2 内部工作流失败后，这种情况可能会发生一段时间。  |   `InternalFailure`   |   `EC2 instance state "Terminated" is unexpected`   |  集群 ARN  | 
|  Outpost 容量不足。在集群创建期间，如果 Outpost 与 AWS 区域断开连接，也会发生这种情况。  |   `ResourceLimitExceeded`   |   `There is not enough capacity on the Outpost to launch or start the instance.`   |  集群 ARN  | 
|  您的账户已超出安全组配额。  |   `ResourceLimitExceeded`   |  Amazon EC2 API 返回的错误消息  |  目标 VPC ID  | 
|  您的账户已超出弹性网络接口配额。  |   `ResourceLimitExceeded`   |  Amazon EC2 API 返回的错误消息  |  目标子网 ID  | 
|  无法通过 AWS Systems Manager 访问控制面板实例。有关分辨率的信息，请参阅 [无法通过 AWS Systems Manager 访问控制面板实例](#outposts-troubleshooting-control-plane-instances-ssm)。  |   `ClusterUnreachable`   |  无法通过 SSM 访问 Amazon EKS 控制面板实例。请验证您的 SSM 和网络配置，并参考 Outpost 上的 EKS 故障排除文档。  |  Amazon EC2 实例 ID  | 
|  获取托管安全组或弹性网络接口的详细信息时出错。  |  基于 Amazon EC2 客户端错误代码。  |  Amazon EC2 API 返回的错误消息  |  所有托管安全组 ID  | 
|  授权或撤销安全组传入规则时出错。这既适用于集群安全组，也适用于控制面板安全组。  |  基于 Amazon EC2 客户端错误代码。  |  Amazon EC2 API 返回的错误消息  |  安全组 ID 有问题  | 
|  删除控制面板实例的弹性网络接口时出错。  |  基于 Amazon EC2 客户端错误代码。  |  Amazon EC2 API 返回的错误消息  |  弹性网络接口 ID 有问题  | 

下表列出了来自 `describe-cluster` 响应的运行状况字段中呈现的其它 AWS 服务的错误。


| Amazon EC2 错误代码 | 集群运行状况问题代码 | 说明 | 
| --- | --- | --- | 
|   `AuthFailure`   |   `AccessDenied`   |  有多种原因可能导致此错误。最常见的原因是，您从控制面板中意外删除了服务用于缩小服务相关角色策略范围的标签。如果出现这种情况，Amazon EKS 将无法继续管理和监控这些 AWS 资源。  | 
|   `UnauthorizedOperation`   |   `AccessDenied`   |  有多种原因可能导致此错误。最常见的原因是，您从控制面板中意外删除了服务用于缩小服务相关角色策略范围的标签。如果出现这种情况，Amazon EKS 将无法继续管理和监控这些 AWS 资源。  | 
|   `InvalidSubnetID.NotFound`   |   `ResourceNotFound`   |  如果无法找到安全组传入规则的子网 ID，将发生此错误。  | 
|   `InvalidPermission.NotFound`   |   `ResourceNotFound`   |  如果安全组传入规则的权限不正确，将发生此错误。  | 
|   `InvalidGroup.NotFound`   |   `ResourceNotFound`   |  如果无法找到安全组的传入规则组，将发生此错误。  | 
|   `InvalidNetworkInterfaceID.NotFound`   |   `ResourceNotFound`   |  如果无法找到安全组传入规则的网络接口 ID，将发生此错误。  | 
|   `InsufficientFreeAddressesInSubnet`   |   `ResourceLimitExceeded`   |  如果超出子网资源配额，将发生此错误。  | 
|   `InsufficientCapacityOnOutpost`   |   `ResourceLimitExceeded`   |  如果超出 Outpost 容量配额，将发生此错误。  | 
|   `NetworkInterfaceLimitExceeded`   |   `ResourceLimitExceeded`   |  如果超出弹性网络接口配额，将发生此错误。  | 
|   `SecurityGroupLimitExceeded`   |   `ResourceLimitExceeded`   |  如果超出安全组配额，将发生此错误。  | 
|   `VcpuLimitExceeded`   |   `ResourceLimitExceeded`   |  在新账户中创建 Amazon EC2 实例时，将观察到此情况。错误可能类似于以下内容：“`You have requested more vCPU capacity than your current vCPU limit of 32 allows for the instance bucket that the specified instance type belongs to. Please visit http://aws.amazon.com/contact-us/ec2-request to request an adjustment to this limit."`   | 
|   `InvalidParameterValue`   |   `ConfigurationConflict`   |  如果 Outpost 上不支持指定的实例类型，Amazon EC2 将返回此错误代码。  | 
|  所有其他故障  |   `InternalFailure`   |  无  | 

## 无法创建或修改集群
<a name="outposts-troubleshooting-unable-to-create-or-modify-clusters"></a>

本地集群所需的权限和策略与云端托管的 Amazon EKS 集群需要的权限和策略不同。当集群创建失败并显示 `InvalidPermissions` 错误时，请仔细检查您使用的集群角色是否附加了 [AmazonEKSLocalOutpostClusterPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazonekslocaloutpostclusterpolicy) 托管策略。所有其他 API 调用都需要与云中的 Amazon EKS 集群相同的权限集。

## 集群卡在 `CREATING` 状态
<a name="outposts-troubleshooting-cluster-stuck-in-creating-state"></a>

创建本地集群所需的时间取决于多个因素。这些因素包括您的网络配置、Outpost 配置和集群配置。一般情况下，可在 15–20 分钟内创建本地集群并更改为 `ACTIVE` 状态。如果本地集群仍处于 `CREATING` 状态，您可以在 `cluster.health` 输出字段中调用 `describe-cluster` 以了解关于原因的信息。

最常见的问题如下：
+ 您的集群无法从 Systems Manager 所在的 AWS 区域连接到控制面板实例。您可以通过从区域内的堡垒主机调用 `aws ssm start-session --target instance-id ` 来对此进行验证。如果该命令不起作用，请检查 Systems Manager 是否在控制面板实例上运行。或者采用另一种解决方法，即删除集群，然后重新创建集群。
+ 由于 EBS 卷的 KMS 密钥权限问题，无法创建控制面板实例。若使用用户管理型 KMS 密钥加密了 EBS 卷，如果密钥不可访问，控制面板实例会终止。如果实例终止，要么切换到 AWS 托管式 KMS 密钥，要么确保用户管理型密钥策略会向集群角色授予必要权限。
+ Systems Manager 控制面板实例可能无法访问互联网。检查您在创建集群时提供的子网是否具有 NAT 网关和带有互联网网关的 VPC。使用 VPC Reachability Analyzer 验证控制面板实例是否可以访问互联网网关。有关更多信息，请参阅 [VPC Reachability Analyzer 入门](https://docs.aws.amazon.com/vpc/latest/reachability/getting-started.html)。
+ 您提供的角色 ARN 缺少策略。检查是否已从角色中移除了 [AWS 托管策略：AmazonEKSLocalOutpostClusterPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazonekslocaloutpostclusterpolicy)。如果 AWS CloudFormation 堆栈配置错误，也可能会出现这种情况。
+ 提供的所有子网都必须与同一 Outpost 关联，并且能够相互访问。如果在创建集群期间指定了多个子网，Amazon EKS 会尝试将控制面板实例分布到多个子网中。
+ 在弹性网络接口上应用 Amazon EKS 托管安全组。但是，NACL 防火墙规则等其他配置元素也可能会与弹性网络接口的规则冲突。

**VPC 和子网 DNS 配置配置错误或缺失**  
查阅[为 AWS Outposts 上的 Amazon EKS 集群创建 VPC 和子网](eks-outposts-vpc-subnet-requirements.md)

## 集群卡在 `UPDATING` 状态
<a name="outposts-troubleshooting-cluster-stuck-in-updating-state"></a>

Amazon EKS 会自动将所有现有本地集群更新到其对应的 Kubernetes 次要版本的最新平台版本。有关平台版本的更多信息，请参阅[了解适用于 AWS Outposts 的 Kubernetes 和 Amazon EKS 平台版本](eks-outposts-platform-versions.md)。

在平台版本自动推出期间，集群状态更改为 `UPDATING`。更新过程包括将所有 Kubernetes 控制面板实例，替换成包含为相应 Kubernetes 次要版本发布的最新安全补丁和错误修复的新实例。本地集群平台更新过程通常会在 30 分钟内完成，集群将变回 `ACTIVE` 状态。如果本地集群在较长时间内仍处于 `UPDATING` 状态，您可以调用 `describe-cluster`，在 `cluster.health` 输出字段中了解关于原因的信息。

为保持本地集群可用性和防止服务中断，Amazon EKS 确保至少三分之二的 Kubernetes 控制面板实例是能够正常运行的集群节点。如果本地集群停滞在 `UPDATING` 状态，通常是因为存在某些基础设施或配置问题，无法在过程继续进行时保证两个实例的最低可用性。因此，为了避免本地集群服务中断，更新过程会停止进行。

必须对卡在 `UPDATING` 状态的本地集群进行问题排查，从根本原因上解决问题，这样更新过程才能顺利完成，让本地集群恢复到 `ACTIVE` 状态，实现 3 个 Kubernetes 控制面板实例都可用的高可用性。

若未得到 AWS Support 支持部门明确指示，切勿终止在 Outpost 上的任何托管 EKS 本地集群 `Kubernetes` 实例。这对于卡在 `UPDATING` 状态的本地集群尤其重要，因为另一个控制面板节点很有可能无法完全正常运行，而终止错误的实例可能会导致服务中断，造成本地集群数据丢失的风险。

最常见的问题如下：
+ 自首次创建本地集群以来，由于网络配置发生了变化，一个或多个控制面板实例无法连接到 System Manager。您可以通过从区域内的堡垒主机调用 `aws ssm start-session --target instance-id ` 来对此进行验证。如果该命令不起作用，请检查 Systems Manager 是否在控制面板实例上运行。
+ 由于 EBS 卷的 KMS 密钥权限问题，无法创建新的控制面板实例。若使用用户管理型 KMS 密钥加密了 EBS 卷，如果密钥不可访问，控制面板实例会终止。如果实例终止，要么切换到 AWS 托管式 KMS 密钥，要么确保用户管理型密钥策略会向集群角色授予必要权限。
+ Systems Manager 控制面板实例可能已失去互联网访问权限。检查您在创建集群时提供的子网是否具有 NAT 网关和带有互联网网关的 VPC。使用 VPC Reachability Analyzer 验证控制面板实例是否可以访问互联网网关。有关更多信息，请参阅 [VPC Reachability Analyzer 入门](https://docs.aws.amazon.com/vpc/latest/reachability/getting-started.html)。如果私有网络没有出站互联网连接，则确保所有必要的 VPC 端点和网关端点仍存在于集群的区域子网中（请参阅[子网对 AWS 服务的访问权限](eks-outposts-vpc-subnet-requirements.md#subnet-access-to-services)）。
+ 您提供的角色 ARN 缺少策略。检查是否从角色中移除了 [AWS 托管式策略：AmazonEKSLocalOutpostClusterPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazonekslocaloutpostclusterpolicy)。
+ 其中一个新的 Kubernetes 控制面板实例可能遇到了意料之外的引导失败问题。如果遇到这种特殊情况，请向 [AWS Support Center](https://console.aws.amazon.com/support/home) 提交工单，获取有关问题排查和日志收集的进一步指导。

## 无法将节点加入集群
<a name="outposts-troubleshooting-unable-to-join-nodes-to-a-cluster"></a>
+ AMI 问题：
  + 当前使用的 AMI 不兼容。仅支持 Amazon EKS 优化版 Amazon Linux 2 AMI（`amazon-linux-2`、`amazon-linux-2-gpu`、`amazon-linux-2-arm64`）。若尝试将 AL2023 节点加入部署于 AWS Outposts 上的 EKS 本地集群，这些节点将无法成功加入集群。有关更多信息，请参阅[在 AWS Outposts 上创建 Amazon Linux 节点](eks-outposts-self-managed-nodes.md)。
  + 如果您使用 AWS CloudFormation 模板创建您的节点，请确保它没有使用不受支持的 AMI。
+ 缺失 AWS IAM 身份验证器 `ConfigMap` – 如果缺失，则必须进行创建。有关更多信息，请参阅 [将 `aws-auth` `ConfigMap` 应用到集群](auth-configmap.md#aws-auth-configmap)。
+ 使用了错误的安全组 – 请确保将 `eks-cluster-sg-cluster-name-uniqueid ` 用于 Worker 节点的安全组。将通过 AWS CloudFormation 更改所选的安全组，以便在每次使用堆栈时允许新的安全组。
+ 遵循意外的私有链接 VPC 步骤 - 传递错误的 CA 数据 (`--b64-cluster-ca`) 或 API 端点 (`--apiserver-endpoint`)。

## 收集日志
<a name="outposts-troubleshooting-collecting-logs"></a>

如果 Outpost 与其关联的 AWS 区域断开连接，Kubernetes 集群可能会继续正常运行。但是，如果集群无法正常运行，请执行[在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网](eks-outposts-network-disconnects.md)中的问题排查步骤。如果遇到任何问题，请与 AWS Support 联系。AWSSupport 会指导您如何下载和运行日志收集工具。这样一来，您就可以从 Kubernetes 集群控制面板实例中收集日志，并将其发送到 AWS Support 支持部门，以便进一步调查。

## 无法通过 AWS Systems Manager 访问控制面板实例
<a name="outposts-troubleshooting-control-plane-instances-ssm"></a>

当无法通过 AWS Systems Manager 访问 Amazon EKS 控制面板实例时，Amazon EKS 将为您的集群显示以下错误。

```
Amazon EKS control plane instances are not reachable through SSM. Please verify your SSM and network configuration, and reference the EKS on Outposts troubleshooting documentation.
```

要解决此问题，请确保您的 VPC 和子网满足[为 AWS Outposts 上的 Amazon EKS 集群创建 VPC 和子网](eks-outposts-vpc-subnet-requirements.md)中的要求，并且您已完成《AWS Systems Manager 用户指南》内[设置 Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html) 中的步骤。

# 在 AWS Outpost 上创建 Amazon Linux 节点
<a name="eks-outposts-self-managed-nodes"></a>

**重要**  
部署于 Outposts 上的 Amazon EKS 本地集群，仅支持通过以下 Amazon EKS 优化版 Amazon Linux 2023 AMI 创建的节点：  
标准 Amazon Linux 2023 (`amazon-linux-2023/x86_64/standard`)
加速型 Nvidia Amazon Linux 2023 (`amazon-linux-2023/x86_64/nvidia`)
加速型 Neuron Amazon Linux 2023 (`amazon-linux-2023/x86_64/neuron`)
 AWS 将于 2025 年 11 月 26 日终止对 EKS AL2 优化版和 AL2 加速型 AMI 的支持。尽管您可以在终止支持（EOS）日期（2025 年 11 月 26 日）之后继续使用 EKS AL2 AMI，但在该日期之后，EKS 将不再为 AL2 AMI 发布任何新的 Kubernetes 版本或更新，包括次要版本、补丁和错误修复。有关 AL2 弃用的更多信息，请参阅[此处](https://docs.aws.amazon.com/eks/latest/userguide/eks-ami-deprecation-faqs.html)。

本主题介绍如何在向您的 Amazon EKS 集群的 Outpost 上启动 Amazon Linux 节点的自动扩缩组。集群可以位于 AWS 云上，也可以位于 Outpost 上。
+ 一个现有的 Outpost。有关更多信息，请参阅[什么是 AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html)。
+ 现有 Amazon EKS 集群。要在 AWS 云上部署集群，请参阅[创建一个 Amazon EKS 集群。](create-cluster.md)。要在 Outpost 上部署集群，请参阅 [在 AWS Outposts 上创建本地 Amazon EKS 集群以实现高可用性](eks-outposts-local-cluster-overview.md)。
+ 假设您正在 AWS 云上的集群中创建节点，并在已启用 AWS Outposts、AWS Wavelength 或 AWS Local Zones 的 AWS 区域中拥有子网。接下来，当您创建集群时，不得传入这些子网。如果您要在 Outpost 上的集群中创建节点，则在创建集群时必须已传入 Outpost 子网。
+ （建议用于 AWS 云上的集群）适用于 Kubernetes 附加组件 的 Amazon VPC CNI 插件已配置了自己的 IAM 角色，并附加了必要的 IAM 策略。有关更多信息，请参阅 [配置 Amazon VPC CNI 插件以使用 IRSA](cni-iam-role.md)。本地集群不支持服务账户的 IAM 角色。

您可以使用 `eksctl` 或 AWS 管理控制台（带有 AWS CloudFormation 模板）创建自行管理的 Amazon Linux 节点组。您还可以使用 Terraform。

您可以使用本页中描述的下列工具为本地集群创建自主管理型节点组：
+  [`eksctl`](#eksctl_create_nodes_outpost) 
+  [AWS 管理控制台](#console_create_nodes_outpost) 

**重要**  
自主管理型节点组包括您的账户中的 Amazon EC2 实例。当您或 Amazon EKS 代表您更新控制面板版本时，这些实例不会自动升级。对于自行管理的节点组，控制台中没有任何其需要更新的标示。您可以在集群的 **Overview（概览）**选项卡上的 **Nodes（节点）**列表中选择节点查看其上安装的 `kubelet` 版本，确定哪些节点需要更新。您必须手动更新节点。有关更多信息，请参阅 [更新集群的自行管理型节点](update-workers.md)。
kubelet 在自主管理型节点上所用证书的有效期为一年。默认**不**启用证书轮换（请参阅：https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/\$1kubelet-config-k8s-io-v1beta1-KubeletConfiguration），这表示：如果自主管理的节点运行时间超过一年，则无法再向 Kubernetes API 进行身份验证。
建议客户最好定期更新自己的自主管理型节点组，以便接收来自最新 Amazon EKS 优化版 AMI 的 CVE 和安全补丁。更新自主管理型节点组中使用的 AMI 还会触发节点的重新创建，确保不会因为 kubelet 证书过期而出现问题。
您也可以在创建自主管理型节点组时启用客户端证书轮换（请参阅：https://kubernetes.io/docs/tasks/tls/certificate-rotation/），确保在当前证书即将到期时续签 kubelet 证书。

## `eksctl`
<a name="eksctl_create_nodes_outpost"></a>

 **使用 `eksctl` 启动自主管理型 Linux 节点** 

1. 在您的设备或 AWS CloudShell 上安装 `0.215.0` 版或更高版本的 `eksctl` 命令行工具。要安装或更新 `eksctl`，请参阅 `eksctl` 文档中的 [Installation](https://eksctl.io/installation)。

1. 如果您的集群位于 AWS 云上，并且 **AmazonEKS\$1CNI\$1Policy** 托管 IAM 策略附加到您的 [Amazon EKS 节点 IAM 角色](create-node-role.md)，我们建议将其分配给您与 Kubernetes `aws-node` 服务账户关联的 IAM 角色。有关更多信息，请参阅 [配置 Amazon VPC CNI 插件以使用 IRSA](cni-iam-role.md)。如果您的集群位于 Outpost 上，则必须将该策略附加到您的节点角色。

1. 以下命令在现有集群中创建节点组。必须已经使用 `eksctl` 创建了集群。将 *al-nodes* 替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头，但也可以包括其余字符的连字符和下划线。将 *my-cluster* 替换为您的集群的名称。名称只能包含字母数字字符（区分大小写）和连字符。该名称必须以字母数字字符开头，且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域和 AWS 账户，该名称必须在其内具有唯一性。如果您的集群存在于 Outpost 上，则将 *id* 替换为 Outpost 子网的 ID。如果您的集群存在于 AWS 云上，则将 *id* 替换为您在创建集群时未指定的子网的 ID。将其余的 example values 替换为您自己的值。预设情况下，将使用与控制层面相同的 Kubernetes 版本创建节点。

   将 *instance-type* 替换为您的 Outpost 上可用的实例类型。

   将 *my-key* 替换为您的 Amazon EC2 密钥对或公有密钥的名称。此密钥用于在节点启动后通过 SSH 进入节点。如果还没有 Amazon EC2 密钥对，可以在 AWS 管理控制台 中创建一个。有关更多信息，请参阅*《Amazon EC2 用户指南》*中的 [Amazon EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。

   使用以下命令创建您的节点组。

   ```
   eksctl create nodegroup --cluster my-cluster --name al-nodes --node-type instance-type \
       --nodes 3 --nodes-min 1 --nodes-max 4 --managed=false \
       --node-volume-type gp2 --subnet-ids subnet-id \
       --node-ami-family AmazonLinux2023
   ```

   如果您的集群部署在 AWS 云上：
   + 您部署的节点组可以将 `IPv4` 地址分配给来自不同 CIDR 块的容器组（pod），而非实例的容器组。有关更多信息，请参阅 [使用自定义网络在备用子网中部署容器组（pod）](cni-custom-network.md)。
   + 您部署的节点组不需要出站互联网访问权限。有关更多信息，请参阅 [部署具有有限互联网访问权限的私有集群](private-clusters.md)。

   有关所有可用选项和默认设置的完整列表，请参阅 `eksctl` 文档中的 [AWS Outposts 支持](https://eksctl.io/usage/outposts/)。
   + 如果节点无法加入集群，请参阅[排查 Amazon EKS 集群和节点问题](troubleshooting.md)中的[节点未能加入集群](troubleshooting.md#worker-node-fail)和[排查 AWS Outposts 上的本地 Amazon EKS 集群问题](eks-outposts-troubleshooting.md)中的[无法将节点加入集群](eks-outposts-troubleshooting.md#outposts-troubleshooting-unable-to-join-nodes-to-a-cluster)。
   + 示例输出如下。创建节点时会输出几行。输出的最后几行类似于以下示例行。

     ```
     [✔]  created 1 nodegroup(s) in cluster "my-cluster"
     ```

1. （可选）部署[示例应用程序](sample-deployment.md)以测试集群和 Linux 节点。

## AWS 管理控制台
<a name="console_create_nodes_outpost"></a>

 **第 1 步：使用 AWS 管理控制台 启动自主管理型 Linux 节点** 

1. 下载最新版本的 AWS CloudFormation 模板。

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2025-11-24/amazon-eks-outpost-nodegroup.yaml
   ```

1. 打开 [AWS CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)。

1. 选择 **Create stack（创建堆栈）**，然后选择 **With new resources (standard)（使用新资源（标准））**。

1. 对于 **Specify template（指定模板）**，选择 **Upload a template file（上传模板文件）**，然后选择**Choose file（选择文件） **。选择您在上一步中下载的 `amazon-eks-nodegroup.yaml` 文件，然后选择 **Next**（下一步）。

1. 在 **Specify stack details**（指定堆栈详细信息）页面上，相应填写以下参数，然后选择 **Next**（下一步）：
   +  **堆栈名称**：为 AWS CloudFormation 堆栈选择堆栈名称。例如，您可以将其命名为 *al-nodes*。名称只能包含字母数字字符（区分大小写）和连字符。该名称必须以字母数字字符开头，且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域和 AWS 账户，该名称必须在其内具有唯一性。
   +  **ApiServerEndpoint**：请输入 Kubernetes API Server 端点，该信息可在 EKS 控制台查看，也可通过 DescribeCluster API 获取。
   +  **ClusterName**：输入您的集群的名称。如果此名称与您的集群名称不匹配，则您的节点将无法加入该集群。
   +  **ClusterId**：请输入由 EKS 服务分配给集群的 ID。该信息可通过 DescribeCluster API 获取。若该 ID 与实际集群 ID 不匹配，节点将无法加入集群。
   +  **CertificateAuthority**：请输入 Kubernetes 证书颁发机构的 Base64 编码字符串。该信息可在 EKS 控制台查看，也可通过 DescribeCluster API 获取。
   +  **ServiceCidr**：请输入 Kubernetes 服务 CIDR。该信息可在 EKS 控制台查看，也可通过 DescribeCluster API 获取。
   +  **ClusterControlPlaneSecurityGroup**：从您在创建 [VPC](creating-a-vpc.md) 时生成的 AWS CloudFormation 输出中，选择 **SecurityGroups** 值。

     以下步骤显示了检索适用组的一种操作。

     1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

     1. 选择集群的名称。

     1. 选择 **Networking**（联网）选项卡。

     1. 从 **ClusterControlPlaneSecurityGroup** 下拉列表中选择时使用 **Additional security groups**（其他安全组）值作为参考。
   +  **NodeGroupName**：输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的自动扩缩节点组。
   +  **NodeAutoScalingGroupMinSize**：输入您的节点自动扩缩组可横向缩减到的最小节点数。
   +  **NodeAutoScalingGroupDesiredCapacity**：输入创建堆栈时要扩展到的所需节点数目。
   +  **NodeAutoScalingGroupMaxSize**：输入您的节点自动扩缩组可横向扩展到的最大节点数。
   +  **NodeInstanceType**：选择节点的实例类型。如果您的集群在 AWS 云上运行，则有关更多信息，请参阅[选择最优的 Amazon EC2 节点实例类型](choosing-instance-type.md)。如果您的集群在 Outpost 上运行，则您只能选择您的 Outpost 上可用的实例类型。
   +  **NodeImageIdSSMParam**：使用用于某个变量 Kubernetes 版本最近的 Amazon EKS 优化版 AMI 的 Amazon EC2 Systems Manager 参数进行预填充。要使用 Amazon EKS 支持的其他 Kubernetes 次要版本，可以将 *1.XX* 替换为不同的[支持版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。我们建议您指定与您的集群相同的 Kubernetes 版本。

     若要使用 Amazon EKS 优化版加速型 AMI，请将 *NodeImageIdSSMParam* 参数值更新为目标 SSM 参数。有关如何从 SSM 中获取 EKS AMI ID 的方法，请参阅[此处](https://docs.aws.amazon.com/eks/latest/userguide/retrieve-ami-id.html)。
**注意**  
Amazon EKS 节点 AMI 基于 Amazon Linux。您可以在 [Amazon Linux 安全中心](https://alas.aws.amazon.com/)通过选择所需版本的选项卡来跟踪 Amazon Linux 的安全和隐私事件。您也可以订阅相应的 RSS 源。安全和隐私事件包括问题的概述、受影响的程序包以及如何更新实例以解决问题。
   +  **NodeImageId**：（可选）如果使用自定义 AMI（而不是 Amazon EKS 优化型 AMI），则输入您 AWS 区域的节点 AMI ID。如果您在此处指定值，它会覆盖 **NodeImageIdSSMParam** 字段中的任意值。
   +  **NodeVolumeSize**：指定您的节点的根卷大小（以 GiB 为单位）。
   +  **NodeVolumeType**：指定您的节点的根卷类型。
   +  **KeyName**：输入 Amazon EC2 SSH 密钥对的名称，您可使用该密钥对来在节点启动后使用 SSH 连接到这些节点。如果还没有 Amazon EC2 密钥对，可以在 AWS 管理控制台 中创建一个。有关更多信息，请参阅*《Amazon EC2 用户指南》*中的 [Amazon EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。
**注意**  
如果此处不提供密钥对，AWS CloudFormation 堆栈创建将失败。
   +  **DisableIMDSv1**：预设情况下，每个节点支持实例元数据服务版本 1 (IMDSv1) 和 IMDSv2。您可以禁用 IMDSv1。要防止节点组中的未来节点和容器组（pod）使用 IMDSv1，请将 **DisableIMDSv1** 设置为 **true**。有关 IMDS 的更多信息，请参阅[配置实例元数据服务](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。有关限制在节点上访问的更多信息，请参阅[限制对分配给 Worker 节点的实例配置文件的访问](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。
   +  **VpcId**：输入您创建的 [VPC](creating-a-vpc.md) 的 ID。选择 VPC 之前，请查看 [VPC 要求和注意事项](eks-outposts-vpc-subnet-requirements.md#outposts-vpc-requirements)。
   +  **子网**：如果您的集群位于 Outpost 上，则请在您的 VPC 中选择至少一个私有子网。选择子网之前，请查看[子网要求和注意事项](eks-outposts-vpc-subnet-requirements.md#outposts-subnet-requirements)。您可以通过从集群的 **Networking**（联网）选项卡中打开每个子网链接来查看哪些子网是私有的。

1. 在 **Configure stack options**（配置堆栈选项）页面上选择所需选项，然后选择 **Next**（下一步）。

1. 选择**我了解 AWS CloudFormation 可能会创建 IAM 资源。**左侧的复选框，然后选择**创建堆栈**。

1. 完成创建堆栈后，在控制台中选中它，然后选择 **Outputs（输出）**。

1. 记录已创建的节点组的 **NodeInstanceRole**。您在配置 Amazon EKS 节点时需要此值。

 **步骤 2：使节点能够加入集群** 

1. 检查您是否已经应用拥有 `aws-auth` `ConfigMap`。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. 如果您看到的是 `aws-auth` `ConfigMap`，则请根据需要对其进行更新。

   1. 打开 `ConfigMap` 文件进行编辑。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 根据需要添加新的 `mapRoles` 条目。将 `rolearn` 值设置为您在上一个步骤中记录的 **NodeInstanceRole** 值。

      ```
      [...]
      data:
        mapRoles: |
          - rolearn: <ARN of instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
      [...]
      ```

   1. 保存文件并退出文本编辑器。

1. 如果您收到错误提示 "`Error from server (NotFound): configmaps "aws-auth" not found`，则请使用库存 `ConfigMap`。

   1. 下载配置映射。

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
      ```

   1. 在 `aws-auth-cm.yaml` 文件中，将 `rolearn` 设置为您在上一个步骤中记录的 **NodeInstanceRole** 值。您可以使用文本编辑器或者通过替换 *my-node-instance-role* 和运行以下命令来执行此操作：

      ```
      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
      ```

   1. 应用配置。此命令可能需要几分钟才能完成。

      ```
      kubectl apply -f aws-auth-cm.yaml
      ```

1. 查看节点的状态并等待它们达到 `Ready` 状态。

   ```
   kubectl get nodes --watch
   ```

   输入 `Ctrl`\$1`C` 以返回到 Shell 提示符。
**注意**  
如果您收到任何授权或资源类型错误，请参阅故障排除主题中的 [未经授权或访问被拒绝 (`kubectl`)](troubleshooting.md#unauthorized)。

   如果节点无法加入集群，请参阅[排查 Amazon EKS 集群和节点问题](troubleshooting.md)中的[节点未能加入集群](troubleshooting.md#worker-node-fail)和[排查 AWS Outposts 上的本地 Amazon EKS 集群问题](eks-outposts-troubleshooting.md)中的[无法将节点加入集群](eks-outposts-troubleshooting.md#outposts-troubleshooting-unable-to-join-nodes-to-a-cluster)。

1. 安装 Amazon EBS CSI 驱动程序。有关更多信息，请参阅 GitHub 上的[安装](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md)。在**设置驱动程序权限**部分中，确保按照 **Using IAM instance profile**（使用 IAM 实例配置文件）选项的说明进行操作。您必须使用 `gp2` 存储类。不支持 `gp3` 存储类。

   要在您的集群上创建 `gp2` 存储类，请完成以下步骤。

   1. 运行以下命令以创建 `gp2-storage-class.yaml` 文件。

      ```
      cat >gp2-storage-class.yaml <<EOF
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        annotations:
          storageclass.kubernetes.io/is-default-class: "true"
        name: ebs-sc
      provisioner: ebs.csi.aws.com
      volumeBindingMode: WaitForFirstConsumer
      parameters:
        type: gp2
        encrypted: "true"
      allowVolumeExpansion: true
      EOF
      ```

   1. 将清单应用于集群。

      ```
      kubectl apply -f gp2-storage-class.yaml
      ```

1. （仅限 GPU 节点）如果选择 GPU 实例类型和 Amazon EKS 优化版加速型 AMI，则必须在集群上将[适用于 Kubernetes 的 NVIDIA 设备插件](https://github.com/NVIDIA/k8s-device-plugin)应用为 DaemonSet。将 *vX.X.X* 替换为您需要的 [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) 版本，然后运行以下命令。

   ```
   kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml
   ```

 **第 3 步：其它操作** 

1. （可选）部署[示例应用程序](sample-deployment.md)以测试集群和 Linux 节点。

1. 如果您的集群部署在 Outpost 上，则请跳过此步骤。如果您的集群部署在 AWS 云上，以下信息是可选的。如果 **AmazonEKS\$1CNI\$1Policy** 托管 IAM 策略附加到您的 [Amazon EKS 节点 IAM 角色](create-node-role.md)，我们建议将其分配给您与 Kubernetes `aws-node` 服务账户关联的 IAM 角色。有关更多信息，请参阅 [配置 Amazon VPC CNI 插件以使用 IRSA](cni-iam-role.md)。