

 **帮助改进此页面** 

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

# 在 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)。