

 **帮助改进此页面** 

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

# 使用优化型 Amazon Linux AMI 创建节点
<a name="eks-optimized-ami"></a>

Amazon Elastic Kubernetes Service（Amazon EKS）提供了专用的亚马逊机器映像（AMI），这类映像针对 Kubernetes Worker 节点的运行需求做了优化处理。这些 EKS 优化版 Amazon Linux（AL）AMI，已预配置各类核心组件，例如 `kubelet`、AWS IAM 身份验证器及 `containerd`，以此保障与集群的无缝集成，同时提升集群的安全性。本指南详细列出了当前可用的 AMI 版本，并概述了针对加速计算架构及基于 Arm 架构的专属配置方案。

## 注意事项
<a name="ami-considerations"></a>
+ 您可以在 [Amazon Linux 安全中心](https://alas.aws.amazon.com/)通过选择所需版本的选项卡来跟踪 Amazon Linux 的安全和隐私事件。您也可以订阅相应的 RSS 源。安全和隐私事件包括问题的概述、受影响的程序包以及如何更新实例以解决问题。
+ 在部署加速型 AMI 或 Arm AMI 之前，请先查看 [Amazon EKS 优化版加速型 Amazon Linux AMI](#gpu-ami) 和 [Amazon EKS 优化版 Arm Amazon Linux AMI](#arm-ami) 中的相关信息。
+ Amazon EKS 不支持 Amazon EC2 `P2` 实例，因为它们需要 `NVIDIA` 驱动程序版本 470 或更早版本。
+ 在版本 `1.30` 或更高版本中新创建的任何托管节点组都将自动默认使用 AL2023 作为节点操作系统。

## Amazon EKS 优化版加速型 Amazon Linux AMI
<a name="gpu-ami"></a>

Amazon EKS 优化版加速型 Amazon Linux（AL）AMI 基于标准的 Amazon EKS 优化版 Amazon Linux AMI 构建。并配置作为 Amazon EKS 节点的可选映像，用来支持基于 GPU、[Inferentia](https://aws.amazon.com/machine-learning/inferentia/) 和 [Trainium](https://aws.amazon.com/machine-learning/trainium/) 的工作负载。

有关更多信息，请参阅 [为 GPU 实例使用 EKS 优化版加速 AMI](ml-eks-optimized-ami.md)。

## Amazon EKS 优化版 Arm Amazon Linux AMI
<a name="arm-ami"></a>

Arm 实例可以为横向扩展和基于 Arm 的应用程序（例如 Web 服务器、容器化微服务、缓存队列以及分布式数据存储）节省大量成本。当将 Arm 节点添加到集群时，请查看以下注意事项。
+ 如果您的集群是在 2020 年 8 月 17 日之前部署的，则必须对关键集群附加组件清单进行一次性升级。这样，Kubernetes 可以为集群中使用的每个硬件架构提取正确映像。有关更新集群附加组件的更多信息，请参阅 [第 1 步：准备升级](update-cluster.md#update-existing-cluster)。如果您在 2020 年 8 月 17 日当天或之后部署了集群，则 CoreDNS、`kube-proxy` 以及适用于 Kubernetes 附加组件的 Amazon VPC CNI 插件已经具备多架构功能。
+ 部署到 Arm 节点的应用程序必须针对 Arm 进行编译。
+ 如果您在现有集群中部署了 DaemonSet，或者希望将之部署到同时要在其中部署 Arm 节点的新集群中，请验证 DaemonSet 是否可以在集群中的所有硬件架构上运行。
+ 您可以在同一集群中运行 Arm 节点组和 x86 节点组。如果要这样做，请考虑将多架构容器映像部署到容器存储库（如 Amazon Elastic Container Registry），然后将节点选择器添加到清单中，以便 Kubernetes 知道要将容器组（pod）部署到哪个硬件架构。有关更多信息，请参阅 *Amazon ECR 用户指南*中的[推送多架构映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-multi-architecture-image.html)和 [Amazon ECR 的多架构容器映像简介](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr)博客文章。

## 更多信息
<a name="linux-more-information"></a>

有关使用 Amazon EKS 优化版 Amazon Linux AMI 的更多信息，请参阅以下部分：
+ 要将 Amazon Linux 与托管节点组一起使用，请参阅 [使用托管式节点组简化节点生命周期](managed-node-groups.md)。
+ 要启动自行管理的 Amazon Linux 节点，请参阅 [检索建议的 Amazon Linux AMI ID](retrieve-ami-id.md)。
+ 有关版本信息，请参阅 [检索 Amazon Linux AMI 版本信息](eks-linux-ami-versions.md)。
+ 要获取 Amazon EKS 优化版 Amazon Linux AMI 的最新 ID，请参阅[检索建议的 Amazon Linux AMI ID](retrieve-ami-id.md)。
+ 要获取用于构建 Amazon EKS 优化版 AMI 的开源脚本，请参阅[构建自定义 EKS 优化版 Linux AMI](eks-ami-build-scripts.md)。

# 从 Amazon Linux 2 升级到 Amazon Linux 2023
<a name="al2023"></a>

**警告**  
Amazon EKS 已于 2025 年 11 月 26 日停止发布 EKS 优化型 Amazon Linux 2（AL2）AMI。基于 AL2023 和 Bottlerocket 的 Amazon EKS AMI 适用于所有支持的 Kubernetes 版本（包括 1.33 和更高版本）。

AL2023 是一款基于 Linux 的操作系统，旨在为云应用程序提供安全、稳定和高性能的环境。它是 Amazon Web Services 推出的下一代 Amazon Linux，适用于所有支持的 Amazon EKS 版本。

AL2023 比 AL2 提供了多项改进。有关完整比较，请参阅《Amazon Linux 2023 用户指南》**中的[比较 AL2 和 Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)。已在 AL2 中添加、升级和移除了多个程序包。强烈建议在升级之前使用 AL2023 测试您的应用程序。有关 AL2023 中所有程序包更改的列表，请参阅《Amazon Linux 2023 发行说明》**中的 [Amazon Linux 2023 的程序包更改](https://docs.aws.amazon.com/linux/al2023/release-notes/compare-packages.html)。

除了这些更改之外，您还应了解以下事项：
+ AL2023 引入了使用 YAML 配置架构的新节点初始化流程 `nodeadm`。如果您使用的是自行管理的节点组或带有启动模板的 AMI，则在创建新节点组时，现在需要明确提供其它集群元数据。以下是最低必需参数的[示例](https://awslabs.github.io/amazon-eks-ami/nodeadm/)，其中 `apiServerEndpoint`、`certificateAuthority` 和服务 `cidr` 是必需的：

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: my-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
  ```

  在 AL2 中，来自这些参数的元数据是从 Amazon EKS `DescribeCluster` API 调用中发现的。使用 AL2023，这种行为发生了变化，因为在大型节点纵向扩展期间，额外的 API 调用有节流风险。如果您使用的是没有启动模板的托管节点组或者 Karpenter，则此更改不会对您产生影响。有关 `certificateAuthority` 和服务 `cidr` 的更多信息，请参阅《Amazon EKS API 参考》**中的 [https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)。
+ 对于 AL2023，`nodeadm` 也可以使用 [https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec) 来更改格式，将参数应用于每个节点的 `kubelet`。而在 AL2 中，这通过 `--kubelet-extra-args` 参数完成。这通常用于向节点添加标签和污点。以下示例显示了如何将 `maxPods` 和 `--node-labels` 应用于节点。

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: test-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
    kubelet:
      config:
        maxPods: 110
      flags:
        - --node-labels=karpenter.sh/capacity-type=on-demand,karpenter.sh/nodepool=test
  ```
+ AL2023 需要 Amazon VPC CNI 版本 `1.16.2` 或更高版本。
+ 默认情况下，AL2023 需要 `IMDSv2`。`IMDSv2` 有多项益处，可助于改善安全状况。它使用面向会话的身份验证方法，需要在简单的 HTTP PUT 请求中创建密钥令牌才能启动会话。会话令牌的有效时间可以介于 1 秒到 6 小时之间。有关如何从 `IMDSv1` 转换到 `IMDSv2` 的更多信息，请参阅[转换到使用实例元数据服务版本 2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html) 和[获取 IMDSv2 的全部优势并在 AWS 基础设施中禁用 IMDSv1](https://aws.amazon.com/blogs/security/get-the-full-benefits-of-imdsv2-and-disable-imdsv1-across-your-aws-infrastructure)。如果您想使用 `IMDSv1`，则您仍然可以通过使用实例元数据选项启动属性手动覆盖设置来做到这一点。
**注意**  
对于使用 AL2023 的 `IMDSv2`，托管节点组的默认跳数可能会有所不同：  
不使用启动模板时，默认值设置为 `1`。这意味着，容器无法使用 IMDS 访问节点的凭证。如果您需要容器访问节点的凭证，仍然可以通过使用[自定义 Amazon EC2 启动模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html)来实现。
在启动模板中使用自定义 AMI 时，默认 `HttpPutResponseHopLimit` 设置为 `2`。您可以手动覆盖启动模板中的 `HttpPutResponseHopLimit`。
或者，您可以使用 [Amazon EKS 容器组身份](pod-identities.md)来提供凭证，而不是 `IMDSv2`。
+ AL2023 采用下一代统一控制组层次结构 (`cgroupv2`)。`cgroupv2` 用于实施容器运行时，并由 `systemd` 实施。虽然 AL2023 仍然包含可以使用 `cgroupv1` 使系统运行的代码，但这不是建议或支持的配置。此配置将在未来的 Amazon Linux 主要版本中完全移除。
+  `eksctl` 需要 `eksctl` 版本 `0.176.0` 或更高版本才能支持 AL2023。

对于以前存在的托管节点组，您可以执行就地升级或蓝/绿升级，具体取决于您所使用的启动模板的方式：
+ 如果您在托管节点组中使用自定义 AMI，则可以通过交换启动模板中的 AMI ID 来执行就地升级。在执行此升级策略之前，您应确保您的应用程序和所有用户数据首先传输到 AL2023。
+ 如果您将托管节点组与标准启动模板或未指定 AMI ID 的自定义启动模板结合使用，则需要使用蓝/绿策略升级。蓝/绿升级通常更复杂，需要创建一个全新的节点组，在其中指定 AL2023 作为 AMI 类型。然后，需要小心配置新的节点组，以确保来自 AL2 节点组的所有自定义数据都与新操作系统兼容。在应用程序中对新节点组进行测试和验证后，容器组（pod）可以从旧节点组迁移到新的节点组。迁移完成之后，您就可以删除旧节点组。

如果您使用的是 Karpenter 且希望使用 AL2023，则需使用 AL2023 修改 `EC2NodeClass` `amiFamily` 字段。默认情况下，偏差在 Karpenter 中启用。这意味着，`amiFamily` 字段更改后，Karpenter 会自动将 Worker 节点更新为最新的 AMI（如果有）。

## 有关 nodeadm 的其他信息
<a name="_additional_information_about_nodeadm"></a>

在使用 EKS 优化的 Amazon Linux 2023 AMI 或通过 amazon-eks-ami GitHub 官方存储库中提供的 Packer 脚本构建自定义 EKS Amazon Linux 2023 AMI 时，应避免在 EC2 用户数据中或作为自定义 AMI 的一部分明确运行 nodeadm init。

如果您想在用户数据中生成动态 NodeConfig，可以将该配置写入到 `/etc/eks/nodeadm.d` 中的嵌入式 yaml 或 json 文件中。这些配置文件在启动过程后期 nodeadm init 自动启动时被合并并应用于您的节点。例如：

```
cat > /etc/eks/nodeadm.d/additional-node-labels.yaml << EOF
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  kubelet:
    flags:
      - --node-labels=foo=bar
EOF
```

经 EKS 优化的 Amazon Linux 2023 AMI 会通过两个独立的 systemd 服务分两个阶段自动执行 nodeadm init 操作：nodeadm-config 在用户数据执行之前运行，而 nodeadm-run 则在之后运行。nodeadm-config 服务在用户数据运行之前为 containerd 和 kubelet 建立基准配置。nodeadm-run 服务运行选定的系统进程守护程序，并在用户数据执行后完成所有最终配置。如果通过用户数据或自定义 AMI 再次运行 nodeadm init 命令，可能会破坏关于执行顺序的假设，从而导致意想不到的结果，包括配置错误的 ENI。

# 检索 Amazon Linux AMI 版本信息
<a name="eks-linux-ami-versions"></a>

Amazon EKS 优化版 Amazon Linux AMI 按 Kubernetes 版本和 AMI 的发布日期进行版本控制，格式如下：

```
k8s_major_version.k8s_minor_version.k8s_patch_version-release_date
```

每个 AMI 发行版都包含若干 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)、Linux 内核及 [containerd](https://containerd.io/) 版本。加速型 AMI 还包括 NVIDIA 驱动程序的各种版本。您可以在 GitHub 上的 [Changelog](https://github.com/awslabs/amazon-eks-ami/blob/main/CHANGELOG.md) 中找到该版本信息。

# 检索建议的 Amazon Linux AMI ID
<a name="retrieve-ami-id"></a>

部署节点时，您可以为预先构建的 Amazon EKS 优化版亚马逊机器映像（AMI）指定 ID。要检索符合所需配置的 AMI ID，请查询 AWS Systems Manager Parameter Store API。使用此 API，您无需手动查找 Amazon EKS 优化版 AMI ID。有关更多信息，请参阅 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)。您使用的 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必须具有 `ssm:GetParameter` IAM 权限才能检索 Amazon EKS 优化版 AMI 元数据。

您可以使用以下命令检索最新推荐 Amazon EKS 优化版 AMI 的映像 ID，该命令使用子参数 `image_id`。根据需要对该命令进行以下修改，然后运行修改后的命令：
+ 将 `<kubernetes-version>` 替换为 [Amazon EKS 支持的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。
+ 将 *ami-type* 替换为以下选项之一。有关 Amazon EC2 实例类型的信息，请参阅 [Amazon EC2 实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。
  + 将 *amazon-linux-2023/x86\$164/standard* 用于基于 Amazon Linux 2023（AL2023）`x86` 的实例。
  + 将 *amazon-linux-2023/arm64/standard* 用于 AL2023 ARM 实例，例如基于 [AWS Graviton](https://aws.amazon.com/ec2/graviton/) 的实例。
  + 将 *amazon-linux-2023/x86\$164/nvidia* 用于最新批准的基于 AL2023 NVIDIA `x86` 的实例。
  + 将 *amazon-linux-2023/arm64/nvidia* 用于最新批准的基于 AL2023 NVIDIA `arm64` 的实例。
  + 将 *amazon-linux-2023/x86\$164/neuron* 用于最新的 AL2023 [AWS Neuron](https://aws.amazon.com/machine-learning/neuron/) 实例。
+ 请将 `<region-code>` 替换为您需要 AMI ID 的 [Amazon EKS 支持的 AWS 区域](https://docs.aws.amazon.com/general/latest/gr/eks.html)。

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/<kubernetes-version>/<ami-type>/recommended/image_id \
    --region <region-code> --query "Parameter.Value" --output text
```

以下是替换占位符后的命令示例。

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.31/amazon-linux-2023/x86_64/standard/recommended/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

示例输出如下。

```
ami-1234567890abcdef0
```

# 构建自定义 EKS 优化版 Linux AMI
<a name="eks-ami-build-scripts"></a>

**警告**  
Amazon EKS 已于 2025 年 11 月 26 日停止发布 EKS 优化型 Amazon Linux 2（AL2）AMI。基于 AL2023 和 Bottlerocket 的 Amazon EKS AMI 适用于所有支持的 Kubernetes 版本（包括 1.33 和更高版本）。

Amazon EKS 在 [Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami) 存储库中提供开源构建脚本，您可通过这些脚本查看 `kubelet`、运行时环境及适用于 Kubernetes 的 AWS IAM 身份验证器的相关配置，同时也能从头构建基于 AL 的自有 AMI。

此存储库包含[适用于 AL2 的专用引导脚本](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)，以及在开机阶段运行的[适用于 AL2023 的 nodeadm 工具](https://awslabs.github.io/amazon-eks-ami/nodeadm/)。这些脚本可配置实例的证书数据、控制面板端点、集群名称等内容。这些脚本是 Amazon EKS 优化版 AMI 生成的可信来源，因此您可关注 GitHub 存储库以监控对 AMI 所做的更改。

以 EKS 优化版 AMI 为基础构建自定义 AMI 时，不建议且不提供技术支持运行操作系统升级（即 `dnf upgrade`），亦不建议升级 EKS 优化版 AMI 中预装的任何 Kubernetes 或 GPU 相关软件包，因为此类操作可能破坏组件间的兼容性。若仍选择对 EKS 优化版 AMI 中的操作系统或软件包执行升级操作，建议先在开发或预发布环境中开展全面测试，再部署至生产环境。

针对 GPU 实例构建自定义 AMI 时，建议为计划运行的各代实例类型及实例系列分别构建独立的自定义 AMI。EKS 优化版加速型 AMI 会在运行时阶段，根据底层实例的代次与系列选择性安装驱动程序及软件包。有关[安装](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/provisioners/install-nvidia-driver.sh)及[运行时](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/runtime/gpu/nvidia-kmod-load.sh)的详细信息，请参阅 EKS AMI 脚本。

## 先决条件
<a name="_prerequisites"></a>
+  [安装 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。
+  [安装 HashiCorp Packer v1.9.4\$1](https://developer.hashicorp.com/packer/downloads) 
+  [安装 GNU Make](https://www.gnu.org/software/make/) 

## 快速入门
<a name="_quickstart"></a>

本快速入门指南将演示在 AWS 账户中创建自定义 AMI 所需执行的命令。要了解有关可用于自定义 AMI 的配置的更多信息，请参阅 [Amazon Linux 2023](https://awslabs.github.io/amazon-eks-ami/usage/al2023/) 页面上的模板变量。

### 先决条件
<a name="_prerequisites_2"></a>

安装所需的 [Amazon Q 插件](https://developer.hashicorp.com/packer/integrations/hashicorp/amazon)。例如：

```
packer plugins install github.com/hashicorp/amazon
```

### 步骤 1：设置您的环境
<a name="_step_1_setup_your_environment"></a>

克隆或复刻 Amazon EKS AMI 官方存储库。例如：

```
git clone https://github.com/awslabs/amazon-eks-ami.git
cd amazon-eks-ami
```

确认已安装 Packer：

```
packer --version
```

### 步骤 2：创建自定义 AMI
<a name="_step_2_create_a_custom_ami"></a>

以下是用于各种自定义 AMI 的示例命令。

 **基本 NVIDIA AL2 AMI：**

```
make k8s=1.31 os_distro=al2 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **基本 NVIDIA AL2023 AMI：**

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **符合 STIG 标准的 Neuron AL2023 AMI：**

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=neuron \
  enable_fips=true \
  source_ami_id=ami-0abcd1234efgh5678 \
  kms_key_id=alias/aws-stig
```

运行这些命令后，Packer 将执行以下操作：\$1 启动临时 Amazon EC2 实例。\$1 安装 Kubernetes 组件、驱动程序和配置。在 AWS 账户中创建 AMI。

预期输出应如下所示：

```
==> Wait completed after 8 minutes 42 seconds

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9
```

### 步骤 3：查看默认值
<a name="_step_3_view_default_values"></a>

要查看默认值和其他选项，请运行以下命令：

```
make help
```