帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 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 安装。有效选项为none
、distro
、和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 使用 |
ISO_URL |
字符串 |
要使用的 ISO URL。这可以是从服务器下载的 Web 链接,也可以是本地文件的绝对路径 |
ISO_CHECKSUM |
字符串 |
所提供 ISO 的相关校验和。 |
CREDENTIAL_PROVIDER |
字符串 |
混合节点的凭证提供者。SSM 混合激活的有效值为 |
K8S_VERSION |
字符串 |
适用于混合节点的 Kubernetes 版本(例如 |
NODEADM_ARCH |
字符串 |
适用于 |
RHEL
如果使用 RHEL,则必须设置以下环境变量。
环境变量 | 类型 | 描述 |
---|---|---|
RH_USERNAME |
字符串 |
RHEL 订阅管理员用户名 |
RH_PASSWORD |
字符串 |
RHEL 订阅管理器密码 |
RHEL_VERSION |
字符串 |
使用的 Rhel iso 版本。有效值为 |
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 生成器的输出格式。有效值为 |
验证模版
在运行生成的版本之前,请在设置环境变量后使用以下命令验证模板。如果您的模板使用其他名称,请相应替换 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 的名称结合使用。
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 作为混合节点的基础设施时实现这一点。
-
按照 GitHub 上 govc readme
中的说明安装 govc
CLI。 -
运行上一节中的 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"
-
在为每个新 VM 克隆该模板后,为您的 VM 创建一个
userdata.yaml
和metadata.yaml
。VM 可以共享同一userdata.yaml
和metadata.yaml
,并且您将在以下步骤中为每个 VM 填充这些参数。nodeadm
配置是在userdata.yaml
的write_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
-
使用以下命令将
userdata.yaml
和metadata.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
-
将新 VM 开机,这时应会自动连接到您配置的 EKS 集群。
govc vm.power -on "${NODE_NAME}"