Amazon EKS 优化版 Amazon Linux AMI - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon EKS 优化版 Amazon Linux AMI

Amazon EKS 优化的 Amazon Linux AMI 基于 Amazon Linux 2(AL2)和 Amazon Linux 2023(AL2023)构建。配置作为 Amazon EKS 节点的基本映像。AMI 配置为与 Amazon EKS 搭配使用,它包含以下组件:

  • kubelet

  • Amazon IAM 身份验证器

  • Docker(Amazon EKS 版本 1.23 及更早版本)

  • containerd

注意
  • 您可以在 Amazon Linux 安全中心跟踪 AL2 的安全和隐私事件,或订阅关联的 RSS 源。安全和隐私事件包括问题的概述、受影响的程序包以及如何更新实例以解决问题。

  • 在部署加速版或 Arm AMI 之前,请先查看 Amazon EKS 优化版加速型 Amazon Linux AMIAmazon EKS 优化版 Arm Amazon Linux AMI 中的信息。

  • 对于 Kubernetes 版本 1.23,您可以使用可选引导标记测试从 Docker 迁移到 containerd。有关更多信息,请参阅 测试从 Docker 到 containerd 的迁移

  • 从 Kubernetes 版本 1.25 开始,您将无法再将 Amazon EC2 P2 实例与现成的 Amazon EKS 优化加速 Amazon Linux AMI 结合使用。对于 Kubernetes 版本 1.25 或更高版本,这些 AMI 将支持 NVIDIA 525 系列或更高版本的驱动程序,这些驱动程序与 P2 实例不兼容。但 NVIDIA 525 系列或更高版本的驱动程序与 P3P4P5 实例兼容,因此您可以通过 Kubernetes 版本 1.25 或更高版本的 AMI 使用这些实例。请首先将所有 P2 实例迁移到 P3P4P5 实例,然后再将您的 Amazon EKS 集群升级到版本 1.25。您还应主动升级您的应用程序以支持 NVIDIA 525 系列或更高版本。我们计划在 2024 年 1 月晚些时候将更新的 NVIDIA 525 系列或更新驱动程度反向移植到 Kubernetes 版本 1.231.24

  • 从 Amazon EKS 版本 1.30 或更高版本开始,任何新创建的托管节点组都将自动默认使用 AL2023 作为节点操作系统。以前,新节点组将默认为 AL2。在创建新节点组时,您可以通过选择 AL2 作为 AMI 类型来继续使用 AL2。

  • 对 AL2 的支持将于 2025 年 6 月 30 日结束。更多有关信息,请参阅 Amazon Linux 2 FAQs

从 AL2 升级到 AL2023

Amazon EKS 优化的 AMI 有两个基于 AL2 和 AL2023 的系列可供选择。AL2023 是一款新的基于 Linux 的操作系统,旨在为您的云应用程序提供安全、稳定和高性能的环境。它是 Amazon Web Services 推出的下一代 Amazon Linux,适用于所有支持的 Amazon EKS 版本,包括扩展支持中的版本 1.231.24。基于 AL2023 的 Amazon EKS 加速 AMI 将在以后的某个日期推出。如果您有加速工作负载,则应继续使用 AL2 加速的 AMI 或 Bottlerocket。

AL2023 比 AL2 提供了多项改进。有关完整比较,请参阅《Amazon Linux 2023 用户指南》中的比较 AL2 和 Amazon Linux 2023。已在 AL2 中添加、升级和移除了多个程序包。强烈建议在升级之前使用 AL2023 测试您的应用程序。有关 AL2023 中所有程序包更改的列表,请参阅《Amazon Linux 2023 发行说明》中的 Amazon Linux 2023 的程序包更改

除了这些更改之外,您还应了解以下事项:

  • AL2023 引入了使用 YAML 配置架构的新节点初始化流程 nodeadm。如果您使用的是自行管理的节点组或带有启动模板的 AMI,则在创建新节点组时,现在需要明确提供其他集群元数据。以下是最低必需参数的示例,其中 apiServerEndpointcertificateAuthority 和服务 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 参考》中的 DescribeCluster

  • 在 AL2023 中不支持所有受支持的 Amazon EKS 版本的 Docker。在 AL2 中,对 Docker 的支持已结束,已在 Amazon EKS 版本 1.24 或更高版本中移除。有关弃用的更多信息,请参阅 Amazon EKS 已结束对 Dockershim 的支持

  • AL2023 需要 Amazon VPC CNI 版本 1.16.2 或更高版本。

  • 默认情况下,AL2023 需要 IMDSv2IMDSv2 有多项益处,可助于改善安全状况。它使用面向会话的身份验证方法,需要在简单的 HTTP PUT 请求中创建密钥令牌才能启动会话。会话令牌的有效时间可以介于 1 秒到 6 小时之间。有关如何从 IMDSv1 转换到 IMDSv2 的更多信息,请参阅转换到使用实例元数据服务版本 2获取 IMDSv2 的全部优势并在 Amazon 基础设施中禁用 IMDSv1。如果您想使用 IMDSv1,则您仍然可以通过使用实例元数据选项启动属性手动覆盖设置来做到这一点。

    注意

    对于 IMDSv2,托管节点组的默认跳数设置为 1。这意味着,容器无法使用 IMDS 访问节点的凭证。如果您需要容器访问节点的凭证,则您仍然可以通过手动覆盖自定义 Amazon EC2 启动模板中的 HttpPutResponseHopLimit,将其增加到 2 来做到这一点。

  • AL2023 采用下一代统一控制组层次结构(cgroupv2)。cgroupv2 用于实施容器运行时,并由 systemd 实施。虽然 AL2023 仍然包含可以使用 cgroupv1 使系统运行的代码,但这不是建议或支持的配置。此配置将在未来的 Amazon Linux 主要版本中完全移除。

对于以前存在的托管节点组,您可以执行就地升级或蓝/绿升级,具体取决于您所使用的启动模板的方式:

  • 如果您在托管节点组中使用自定义 AMI,则可以通过交换启动模板中的 AMI ID 来执行就地升级。在执行此升级策略之前,您应确保您的应用程序和所有用户数据首先传输到 AL2023。

  • 如果您将托管节点组与标准启动模板或未指定 AMI ID 的自定义启动模板一起使用,则需要使用蓝/绿策略升级。蓝/绿升级通常更复杂,需要创建一个全新的节点组,在其中指定 AL2023 作为 AMI 类型。然后,需要小心配置新的节点组,以确保来自 AL2 节点组的所有自定义数据都与新操作系统兼容。在您的应用程序中对新节点组进行测试和验证后,Pods 可以从旧节点组迁移到新的节点组。迁移完成之后,您就可以删除旧节点组。

如果您正在使用 Karpenter 并想使用 AL2023,则需要使用 AL2023 修改该 EC2NodeClass amiFamily 字段。默认情况下,偏差在 Karpenter 中启用。这意味着,amiFamily 字段更改后,Karpenter 将自动将您的 Worker 节点更新为最新的 AMI(如果有)。

Amazon EKS 优化版加速型 Amazon Linux AMI

注意

基于 AL2023 的 Amazon EKS 加速 AMI 将在以后的某个日期推出。如果您有加速工作负载,则应继续使用 AL2 加速的 AMI 或 Bottlerocket。

Amazon EKS 优化加速的 Amazon Linux AMI 建立在标准的 Amazon EKS 优化的 Amazon Linux AMI 之上。配置作为 Amazon EKS 节点的可选映像,以支持基于 GPU、InferentiaTrainium 的工作负载。

除标准 Amazon EKS 优化版 AMI 配置外,加速 AMI 还包含:

  • NVIDIA 驱动程序

  • nvidia-container-runtime(作为默认运行时)

  • Amazon Neuron 容器运行时

有关加速的 AMI 中包含的最新组件的列表,请参阅 GitHub 上的 amazon-eks-ami 版本

注意
  • Amazon EKS 优化版加速型 AMI 仅支持基于 GPU 和 Inferentia 的实例类型。务必在节点 Amazon CloudFormation 模板中指定这些实例类型。使用 Amazon EKS 优化版加速型 AMI,即表明您同意 NVIDIA 的最终用户许可协议 (EULA)

  • Amazon EKS 优化版加速型 AMI 以前称为带 GPU 支持的 Amazon EKS 优化版 AMI

  • 以前版本的 Amazon EKS 优化加速 AMI 安装 nvidia-docker 存储库。Amazon EKS AMI 版本 v20200529 及更高版本中不再包含此存储库。

启用基于 GPU 的工作负载的步骤

以下步骤介绍如何使用 Amazon EKS 优化版加速型 AMI 在基于 GPU 的实例上运行工作负载。有关其他选项,请参阅以下参考资料:

  1. 当 GPU 节点加入集群后,您必须在您的集群上应用 适用于 Kubernetes 的 NVIDIA 设备插件,以作为 DaemonSet 使用。将 vX.X.X 替换为您需要的 NVIDIA/k8s-device-plugin 版本,然后运行以下命令。

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/nvidia-device-plugin.yml
  2. 您可以使用以下命令验证节点是否具有可分配 GPU。

    kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
部署 Pod 以测试是否已正确配置 GPU 节点的步骤
  1. 使用以下内容创建名为 nvidia-smi.yaml 的文件。将 tag 替换为您需要的 nvidia/cuda 标签。此清单会启动一个 NVIDIA CUDA 容器,该容器将在一个节点上运行 nvidia-smi

    apiVersion: v1 kind: Pod metadata: name: nvidia-smi spec: restartPolicy: OnFailure containers: - name: nvidia-smi image: nvidia/cuda:tag args: - "nvidia-smi" resources: limits: nvidia.com/gpu: 1
  2. 使用下面的命令应用清单。

    kubectl apply -f nvidia-smi.yaml
  3. Pod 运行完成后,使用下面的命令查看其日志。

    kubectl logs nvidia-smi

    示例输出如下。

    Mon Aug  6 20:23:31 20XX
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI XXX.XX                 Driver Version: XXX.XX                    |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla V100-SXM2...  On   | 00000000:00:1C.0 Off |                    0 |
    | N/A   46C    P0    47W / 300W |      0MiB / 16160MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+

Amazon EKS 优化版 Arm Amazon Linux AMI

Arm 实例可以为横向扩展和基于 Arm 的应用程序(例如 Web 服务器、容器化微服务、缓存队列以及分布式数据存储)节省大量成本。当将 Arm 节点添加到集群时,请查看以下注意事项。

注意事项
  • 如果您的集群是在 2020 年 8 月 17 日之前部署的,则必须对关键集群附加组件清单进行一次性升级。这样,Kubernetes 可以为集群中使用的每个硬件架构提取正确映像。有关更新集群附加组件的更多信息,请参阅 更新 Amazon EKS 集群的 Kubernetes 版本。如果您在 2020 年 8 月 17 日或之后部署了集群,则您的 CoreDNS、kube-proxy 和 Amazon VPC CNI plugin for Kubernetes 附加组件已经具备多架构功能。

  • 部署到 Arm 节点的应用程序必须针对 Arm 进行编译。

  • 如果您在现有集群中部署了 DaemonSets,或者希望将它们部署到同时要在其中部署 Arm 节点的新集群中,请验证您的 DaemonSet 是否可以在集群中的所有硬件架构上运行。

  • 您可以在同一集群中运行 Arm 节点组和 x86 节点组。如果您这样操作,请考虑将多架构容器镜像部署到容器存储库(如 Amazon Elastic Container Registry),然后将节点选择器添加到清单中,以便 Kubernetes 知道可将 Pod 部署到哪个硬件架构上。有关更多信息,请参阅 Amazon ECR 用户指南中的推送多架构映像Amazon ECR 的多架构容器映像简介博客文章。

测试从 Docker 到 containerd 的迁移

Amazon EKS 将从 Kubernetes 版本 1.24 发布起,结束对 Docker 的支持。有关更多信息,请参阅 Amazon EKS 结束了对 Dockershim 的支持

对于 Kubernetes 版本 1.23,您可以使用可选的引导标志,为 Amazon EKS 优化版 AL2 AMI 启用 containerd 运行时系统。在更新到版本 1.24 或更高版本时,该功能提供迁移到 containerd 的清晰路径。Amazon EKS 将从 Kubernetes 版本 1.24 发布起,结束对 Docker 的支持。已在 Kubernetes 社群中广泛采用 containerd 运行时,是 CNCF 的一个分级项目。您可以通过将节点组添加到新集群或现有集群来对其进行测试。

您可以通过创建以下类型的节点组之一来启用引导标记。

自行管理

按照 启动自行管理的 Amazon Linux 节点 中的说明创建节点组。为 BootstrapArguments 参数指定 Amazon EKS 优化版 AMI 和以下文本。

--container-runtime containerd
托管式

如果使用 eksctl,请创建一个名为 my-nodegroup.yaml 的文件,其中包含以下内容。请将每个 example value 替换为您自己的值。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。要检索 ami-1234567890abcdef0 的优化版 AMI ID,请参阅 检索 Amazon EKS 优化版 Amazon Linux AMI ID

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: 1.23 managedNodeGroups: - name: my-nodegroup ami: ami-1234567890abcdef0 overrideBootstrapCommand: | #!/bin/bash /etc/eks/bootstrap.sh my-cluster --container-runtime containerd
注意

如果同时启动多个节点,您还可以为 --apiserver-endpoint--b64-cluster-ca--dns-cluster-ip 引导参数指定值以避免错误。有关更多信息,请参阅 指定 AMI

运行以下命令以创建节点组。

eksctl create nodegroup -f my-nodegroup.yaml

如果您希望使用其他工具来创建托管节点组,则必须使用启动模板部署节点组。在启动模板中,指定 Amazon EKS 优化版 AMI ID,然后使用启动模板部署节点组,并提供以下用户数据。此用户数据会将实际参数传递到 bootstrap.sh 文件中。有关引导文件的更多信息,请参阅 GitHub 上的 bootstrap.sh

/etc/eks/bootstrap.sh my-cluster --container-runtime containerd

更多信息

有关使用 Amazon EKS 优化版 Amazon Linux AMI 的更多信息,请参阅以下部分: