为混合节点准备操作系统 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

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

为混合节点准备操作系统

Bottlerocket、Amazon Linux 2023(AL2023)、Ubuntu 和 RHEL 均已经过持续验证,可用作混合节点的节点操作系统。Amazon 仅在 VMware vSphere 环境中支持 Bottlerocket。在 Amazon EC2 之外运行时,AL2023 不属于 Amazon Support 计划的范围。AL2023 只能在本地虚拟化环境中使用;有关更多信息,请参阅《Amazon Linux 2023 User Guide》https://docs.amazonaws.cn/linux/al2023/ug/outside-ec2.html。Amazon 支持混合节点与 Ubuntu 和 RHEL 操作系统的集成,但不提供对操作系统本身的支持。

操作系统的预置和管理由您负责。首次测试混合节点时,最简单的方法是在一台已预置好的主机上运行 Amazon EKS 混合节点功能 CLI (nodeadm)。对于生产部署,建议在操作系统映像中包含 nodeadm 并将其配置为作为 systemd 服务运行,从而在主机启动时自动将主机加入 Amazon EKS 集群。如果在 vSphere 上将 Bottlerocket 作为节点操作系统使用,则无需使用 nodeadm,因为 Bottlerocket 已经包含混合节点功能所需的依赖项,并且会在主机启动时自动连接到您配置的集群。

版本兼容性

下表列举了经过验证可用作混合节点节点操作系统的兼容操作系统版本。如果使用此表中未包含的其他操作系统变体或版本,则混合节点与相关操作系统变体或版本的兼容性不属于 Amazon Support 的范围。混合节点与底层基础设施无关,x86 和 ARM 架构均受支持。

操作系统 版本

Amazon Linux

Amazon Linux 2023(AL2023)

Bottlerocket

运行 Kubernetes v1.28 及更高版本的 v1.37.0 及以上版本的 VMware 变体

Ubuntu

Ubuntu 20.04、Ubuntu 22.04、Ubuntu 24.04

Red Hat Enterprise Linux

RHEL 8、RHEL 9

操作系统注意事项

常规

  • Amazon EKS 混合节点功能 CLI (nodeadm) 可用于简化混合节点组件和依赖项的安装和配置。您可以在操作系统映像生成管道期间运行 nodeadm install 进程,也可以在每台本地主机的运行时中运行该进程。有关 nodeadm 将安装的组件的更多信息,请参阅混合节点 nodeadm 参考

  • 如果您使用本地环境的代理来访问互联网,则安装和升级过程需要完成额外的操作系统配置,才能将软件包管理器配置为使用该代理。有关说明,请参阅为混合节点功能配置代理

Bottlerocket

  • 连接 Bottlerocket 节点的步骤和工具与连接其他操作系统节点的步骤不同,将在连接使用 Bottlerocket 的混合节点中单独介绍,而不是使用连接混合节点中的步骤。

  • 适用于 Bottlerocket 的步骤不使用混合节点 CLI 工具 nodeadm

  • 仅支持将 Bottlerocket 版本 v1.37.0 及更高版本的 VMware 变体与 EKS 混合节点结合使用。Bottlerocket 的 VMware 变体支持 Kubernetes 版本 1.28 及更高版本。不支持将其他 Bottlerocket 变体用作混合节点操作系统。注意:Bottlerocket 的 VMware 变体仅支持 x86_64 架构。

Containerd

  • Containerd 是标准的 Kubernetes 容器运行时,也是混合节点以及所有 Amazon EKS 节点计算类型的一个依赖项。Amazon EKS 混合节点功能 CLI (nodeadm) 会尝试在 nodeadm install 进程中安装 containerd。您可以使用 --containerd-source 命令行选项在 nodeadm install 运行时中配置 containerd 安装。有效选项为 nonedistro、和 docker。如果使用 RHEL,则 distro 不是有效选项,并且您可以将 nodeadm 配置为按照 Docker 存储库中的 containerd 版本,也可以手动安装 containerd。使用 AL2023 或 Ubuntu 时,nodeadm 默认为安装操作系统发行版中的 containerd。如果不希望 nodeadm 安装 containerd,请使用 --containerd-source none 选项。

Ubuntu

  • 如果使用 Ubuntu 20.04,则凭证提供者必须为 Amazon Systems Manager 混合激活。AmazonUbuntu 20.04 不支持 IAM Roles Anywhere。

  • 如果您使用的是 Ubuntu 24.04,则可能需要更新 containerd 版本或更改 AppArmor 配置,以采用一个可让容器组(pod)正确终止的修复程序,请参阅 Ubuntu #2065423。需要重启后才能将更改应用于 AppArmor 配置文件。最新版本 Ubuntu 24.04 的包管理器中包含更新的 containerd 版本,其中具有该修复程序(containerd 版本 1.7.19+)。

RHEL

  • 如果使用 RHEL 8,则凭证提供者必须为 Amazon Systems Manager 混合激活。AmazonRHEL 8 不支持 IAM Roles Anywhere。

ARM

  • 如果使用的是 ARM 硬件,则需要带有加密扩展(ARMv8.2+crypto)的 ARMv8.2 兼容处理器,才能运行 1.31 版本及更高版本的 EKS kube-proxy 附加组件。Raspberry Pi 5 之前的所有 Raspberry Pi 系统以及基于 Cortex-A72 的处理器都不符合此要求。要解决此问题,可以继续使用 1.30 版本的 EKS kube-proxy 附加组件,直到其延期支持在 2026 年 7 月终止(请参阅 Amazon EKS Kubernetes 发布日历);也可以使用来自上游的自定义 kube-proxy 映像。

  • Kube-proxy 日志中的以下错误消息表明存在这样的不兼容性问题:

Fatal glibc error: This version of Amazon Linux requires a newer ARM64 processor compliant with at least ARM architecture 8.2-a with Cryptographic extensions. On EC2 this is Graviton 2 or later.

生成操作系统映像

Amazon EKS 提供了示例 Packer 模板,您可以使用这些模板来创建包含 nodeadm 的操作系统映像,并将其配置为在主机启动时运行。建议使用此过程以避免在每台主机上分别拉取混合节点的依赖项,并自动完成混合节点的引导过程。您可以将示例 Packer 模板与 Ubuntu 22.04、Ubuntu 24.04、RHEL 8 或 RHEL 9 ISO 映像一起使用,并且可以输出以下格式的映像:OVA、Qcow2 或 Raw。

先决条件

在使用示例 Packer 模板之前,必须在运行 Packer 的计算机上安装以下项目。

  • Packer 版本 1.11.0 或更高版本。有关安装 Packer 的说明,请参阅 Packer 文档中的 Install Packer

  • 如果生成 OVA,则必须已安装 VMware vSphere 插件 1.4.0 或更高版本

  • 如果生成 Qcow2 或原始映像,则必须已安装 QEMU 插件版本 1.x

设置环境变量

在运行此 Packer 生成版本之前,请在运行 Packer 的计算机上设置以下环境变量。

一般性问题

要生成各种操作系统和输出格式的映像,必须设置以下环境变量。

环境变量 类型 描述

PKR_SSH_PASSWORD

字符串

Packer 使用 ssh_usernamessh_password 变量以在预置时通过 SSH 连接到创建的计算机。这需要与在相应操作系统的 kickstart 文件或 user-data 文件中创建初始用户时使用的密码一致。默认设置为“builder器”或“ubuntu”,具体因操作系统而异。设置密码时,请务必在相应的 ks.cfguser-data 文件中进行更改以确保一致。

ISO_URL

字符串

要使用的 ISO URL。这可以是从服务器下载的 Web 链接,也可以是本地文件的绝对路径

ISO_CHECKSUM

字符串

所提供 ISO 的相关校验和。

CREDENTIAL_PROVIDER

字符串

混合节点的凭证提供者。SSM 混合激活的有效值为 ssm(默认),IAM Roles Anywhere 的有效值为 iam

K8S_VERSION

字符串

适用于混合节点的 Kubernetes 版本(例如 1.31)。有关受支持的 Kubernetes 版本,请参阅了解 EKS 上的 Kubernetes 版本生命周期

NODEADM_ARCH

字符串

适用于 nodeadm install 的架构。选择 amdarm

RHEL

如果使用 RHEL,则必须设置以下环境变量。

环境变量 类型 描述

RH_USERNAME

字符串

RHEL 订阅管理员用户名

RH_PASSWORD

字符串

RHEL 订阅管理器密码

RHEL_VERSION

字符串

使用的 Rhel iso 版本。有效值为 89

Ubuntu

没有特定于 Ubuntu 的环境变量。

vSphere

如果构建 VMware vSphere OVA,则必须设置以下环境变量。

环境变量 类型 描述

VSPHERE_SERVER

字符串

vSphere 服务器地址

VSPHERE_USER

字符串

vSphere 用户名

VSPHERE_PASSWORD

字符串

vSphere 密码

VSPHERE_DATACENTER

字符串

vSphere 数据中心名称

VSPHERE_CLUSTER

字符串

vSphere 集群名称

VSPHERE_DATASTORE

字符串

vSphere 数据存储名称

VSPHERE_NETWORK

字符串

vSphere 网络名称

VSPHERE_OUTPUT_FOLDER

字符串

模板的 vSphere 输出文件夹

QEMU

环境变量 类型 描述

PACKER_OUTPUT_FORMAT

字符串

QEMU 生成器的输出格式。有效值为 qcow2raw

验证模版

在运行生成的版本之前,请在设置环境变量后使用以下命令验证模板。如果您的模板使用其他名称,请相应替换 template.pkr.hcl

packer validate template.pkr.hcl

生成映像

使用以下命令生成映像,并使用 -only 标志来指定映像的目标和操作系统。如果您的模板使用其他名称,请相应替换 template.pkr.hcl

vSphere OVA

注意

如果将 RHEL 与 vSphere 结合使用,则需要将 kickstart 文件转换为 OEMDRV 映像,然后将其传递为要用于启动的 ISO。有关更多信息,请参阅 EKS 混合节点 GitHub 存储库中的 Packer Readme

Ubuntu 22.04 OVA

packer build -only=general-build.vsphere-iso.ubuntu22 template.pkr.hcl

Ubuntu 24.04 OVA

packer build -only=general-build.vsphere-iso.ubuntu24 template.pkr.hcl

RHEL 8 OVA

packer build -only=general-build.vsphere-iso.rhel8 template.pkr.hcl

RHEL 9 OVA

packer build -only=general-build.vsphere-iso.rhel9 template.pkr.hcl

QEMU

注意

如果要为其生成映像的特定主机 CPU 生成与生成器主机不匹配,请参阅 QEMU 文档以获取与主机 CPU 匹配的名称,并在运行以下命令时将 -cpu 标志与该主机 CPU 的名称结合使用。

Ubuntu 22.04 Qcow2 / Raw

packer build -only=general-build.qemu.ubuntu22 template.pkr.hcl

Ubuntu 24.04 Qcow2 / Raw

packer build -only=general-build.qemu.ubuntu24 template.pkr.hcl

RHEL 8 Qcow2 / Raw

packer build -only=general-build.qemu.rhel8 template.pkr.hcl

RHEL 9 Qcow2 / Raw

packer build -only=general-build.qemu.rhel9 template.pkr.hcl

通过 user-data 传递 nodeadm 配置

您可以通过 cloud-init 在 user-data 中传递 nodeadm 的配置,从而配置混合节点并在主机启动时自动将其连接到 EKS 集群。以下示例演示了如何在将 VMware vSphere 作为混合节点的基础设施时实现这一点。

  1. 按照 GitHub 上 govc readme 中的说明安装 govc CLI。

  2. 运行上一节中的 Packer 版本并预置模板后,您可以通过使用以下方法克隆模板来创建多个不同的节点。您必须为要创建的用于混合节点的每个新 VM 克隆该模板。请将以下命令中的变量替换为您的环境的相应值。当您通过 metadata.yaml 文件注入 VM 的名称时,以下命令中的 VM_NAME 将用作 NODE_NAME

    govc vm.clone -vm "/PATH/TO/TEMPLATE" -ds="YOUR_DATASTORE" \ -on=false -template=false -folder=/FOLDER/TO/SAVE/VM "VM_NAME"
  3. 在为每个新 VM 克隆该模板后,为您的 VM 创建一个 userdata.yamlmetadata.yaml。VM 可以共享同一 userdata.yamlmetadata.yaml,并且您将在以下步骤中为每个 VM 填充这些参数。nodeadm 配置是在 userdata.yamlwrite_files 部分中创建和定义的。以下示例将 Amazon SSM 混合激活作为混合节点的本地凭证提供者。有关 nodeadm 配置的更多信息,请参阅混合节点 nodeadm 参考

    userdata.yaml:

    #cloud-config users: - name: # username for login. Use 'builder' for RHEL or 'ubuntu' for Ubuntu. passwd: # password to login. Default is 'builder' for RHEL. groups: [adm, cdrom, dip, plugdev, lxd, sudo] lock-passwd: false sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash write_files: - path: /usr/local/bin/nodeConfig.yaml permissions: '0644' content: | apiVersion: node.eks.aws/v1alpha1 kind: NodeConfig spec: cluster: name: # Cluster Name region: # Amazon region hybrid: ssm: activationCode: # Your ssm activation code activationId: # Your ssm activation id runcmd: - /usr/local/bin/nodeadm init -c file:///usr/local/bin/nodeConfig.yaml >> /var/log/nodeadm-init.log 2>&1

    metadata.yaml:

    为您的环境创建一个 metadata.yaml。保留文件中的 "$NODE_NAME" 变量格式,因为这将使用后续步骤中的值填充。

    instance-id: "$NODE_NAME" local-hostname: "$NODE_NAME" network: version: 2 ethernets: nics: match: name: ens* dhcp4: yes
  4. 使用以下命令将 userdata.yamlmetadata.yaml 文件添加为 gzip+base64 字符串。应为要创建的每个 VM 运行以下命令。请将 VM_NAME 替换为要更新的 VM 的名称。

    export NODE_NAME="VM_NAME" export USER_DATA=$(gzip -c9 <userdata.yaml | base64) govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata="${USER_DATA}" govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata.encoding=gzip+base64 envsubst '$NODE_NAME' < metadata.yaml > metadata.yaml.tmp export METADATA=$(gzip -c9 <metadata.yaml.tmp | base64) govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata="${METADATA}" govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata.encoding=gzip+base64
  5. 将新 VM 开机,这时应会自动连接到您配置的 EKS 集群。

    govc vm.power -on "${NODE_NAME}"