

 **帮助改进此页面** 

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

# 为混合节点准备操作系统
准备操作系统

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

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

## 版本兼容性


下表列举了经过验证可用作混合节点节点操作系统的兼容操作系统版本。如果使用此表中未包含的其他操作系统变体或版本，则混合节点与相关操作系统变体或版本的兼容性不属于 AWS 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  | 

## 操作系统注意事项


### General

+ Amazon EKS 混合节点功能 CLI (`nodeadm`) 可用于简化混合节点组件和依赖项的安装和配置。您可以在操作系统映像生成管道期间运行 `nodeadm install` 进程，也可以在每台本地主机的运行时中运行该进程。有关 `nodeadm` 将安装的组件的更多信息，请参阅[混合节点 `nodeadm` 参考](hybrid-nodes-nodeadm.md)。
+ 如果您使用本地环境的代理来访问互联网，则安装和升级过程需要完成额外的操作系统配置，才能将软件包管理器配置为使用该代理。有关说明，请参阅[为混合节点功能配置代理](hybrid-nodes-proxy.md)：

### Bottlerocket

+ 连接 Bottlerocket 节点的步骤和工具与连接其他操作系统节点的步骤不同，将在[连接使用 Bottlerocket 的混合节点](hybrid-nodes-bottlerocket.md)中单独介绍，而不是使用[连接混合节点](hybrid-nodes-join.md)中的步骤。
+ 适用于 Bottlerocket 的步骤不使用混合节点 CLI 工具 `nodeadm`。
+ 仅支持将 Bottlerocket 版本 v1.37.0 及更高版本的 VMware 变体与 EKS 混合节点结合使用。Bottlerocket 的 VMware 变体支持 Kubernetes 版本 1.28 及更高版本。不支持将[其他 Bottlerocket 变体](https://bottlerocket.dev/en/os/1.36.x/concepts/variants)用作混合节点操作系统。注意：Bottlerocket 的 VMware 变体仅支持 x86\$164 架构。

### 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 24.04，则可能需要更新 containerd 版本或更改 AppArmor 配置，以采用一个可让容器组（pod）正确终止的修复程序，请参阅 [Ubuntu \$12065423](https://bugs.launchpad.net/ubuntu/+source/containerd-app/\+bug/2065423)。需要重启后才能将更改应用于 AppArmor 配置文件。最新版本 Ubuntu 24.04 的包管理器中包含更新的 containerd 版本，其中具有该修复程序（containerd 版本 1.7.19\$1）。

### ARM

+ 如果使用的是 ARM 硬件，则需要带有加密扩展（ARMv8.2\$1crypto）的 ARMv8.2 兼容处理器，才能运行 1.31 版本及更高版本的 EKS kube-proxy 附加组件。Raspberry Pi 5 之前的所有 Raspberry Pi 系统以及基于 Cortex-A72 的处理器都不符合此要求。要解决此问题，可以继续使用 1.30 版本的 EKS kube-proxy 附加组件，直到其延期支持在 2026 年 7 月终止（请参阅 [Kubernetes 发布日历](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)）；也可以使用来自上游的自定义 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 模板](https://github.com/aws/eks-hybrid/tree/main/example/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](https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli)。
+ 如果生成 OVA，则必须已安装 VMware vSphere 插件 1.4.0 或更高版本
+ 如果生成 `Qcow2` 或原始映像，则必须已安装 QEMU 插件版本 1.x

### 设置环境变量


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

 **General** 

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


| 环境变量 | 类型 | 说明 | 
| --- | --- | --- | 
|  PKR\$1SSH\$1PASSWORD  |  字符串  |  Packer 使用 `ssh_username` 和 `ssh_password` 变量以在预置时通过 SSH 连接到创建的计算机。这需要与在相应操作系统的 kickstart 文件或 user-data 文件中创建初始用户时使用的密码一致。默认设置为“builder器”或“ubuntu”，具体因操作系统而异。设置密码时，请务必在相应的 `ks.cfg` 或 `user-data` 文件中进行更改以确保一致。  | 
|  ISO\$1URL  |  字符串  |  要使用的 ISO URL。这可以是从服务器下载的 Web 链接，也可以是本地文件的绝对路径  | 
|  ISO\$1CHECKSUM  |  字符串  |  所提供 ISO 的相关校验和。  | 
|  CREDENTIAL\$1PROVIDER  |  字符串  |  混合节点的凭证提供者。SSM 混合激活的有效值为 `ssm`（默认），IAM Roles Anywhere 的有效值为 `iam`  | 
|  K8S\$1VERSION  |  字符串  |  适用于混合节点的 Kubernetes 版本（例如 `1.31`）。有关支持的 Kubernetes 版本，请参阅 [Amazon EKS 支持的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。  | 
|  NODEADM\$1ARCH  |  字符串  |  适用于 `nodeadm install` 的架构。选择 `amd` 或 `arm`。  | 

 **RHEL** 

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


| 环境变量 | 类型 | 说明 | 
| --- | --- | --- | 
|  RH\$1USERNAME  |  字符串  |  RHEL 订阅管理员用户名  | 
|  RH\$1PASSWORD  |  字符串  |  RHEL 订阅管理器密码  | 
|  RHEL\$1VERSION  |  字符串  |  使用的 Rhel iso 版本。有效值为 `8` 或 `9`。  | 

 **Ubuntu** - 

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

 **vSphere** 

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


| 环境变量 | 类型 | 说明 | 
| --- | --- | --- | 
|  VSPHERE\$1SERVER  |  字符串  |  vSphere 服务器地址  | 
|  VSPHERE\$1USER  |  字符串  |  vSphere 用户名  | 
|  VSPHERE\$1PASSWORD  |  字符串  |  vSphere 密码  | 
|  VSPHERE\$1DATACENTER  |  字符串  |  vSphere 数据中心名称  | 
|  VSPHERE\$1CLUSTER  |  字符串  |  vSphere 集群名称  | 
|  VSPHERE\$1DATASTORE  |  字符串  |  vSphere 数据存储名称  | 
|  VSPHERE\$1NETWORK  |  字符串  |  vSphere 网络名称  | 
|  VSPHERE\$1OUTPUT\$1FOLDER  |  字符串  |  模板的 vSphere 输出文件夹  | 

 **QEMU** 


| 环境变量 | 类型 | 说明 | 
| --- | --- | --- | 
|  PACKER\$1OUTPUT\$1FORMAT  |  字符串  |  QEMU 生成器的输出格式。有效值为 `qcow2` 和 `raw`。  | 

 **验证模版** 

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

```
packer validate template.pkr.hcl
```

### 生成映像


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

 **vSphere OVA** 

**注意**  
如果将 RHEL 与 vSphere 结合使用，则需要将 kickstart 文件转换为 OEMDRV 映像，然后将其传递为要用于启动的 ISO。有关更多信息，请参阅 EKS 混合节点 GitHub 存储库中的 [Packer Readme](https://github.com/aws/eks-hybrid/tree/main/example/packer#utilizing-rhel-with-vsphere)。

 **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](https://www.qemu.org/docs/master/system/qemu-cpu-models.html) 文档以获取与主机 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](https://github.com/vmware/govmomi/blob/main/govc/README.md) 中的说明安装 `govc` CLI。

1. 运行上一节中的 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"
   ```

1. 在为每个新 VM 克隆该模板后，为您的 VM 创建一个 `userdata.yaml` 和 `metadata.yaml`。VM 可以共享同一 `userdata.yaml` 和 `metadata.yaml`，并且您将在以下步骤中为每个 VM 填充这些参数。`nodeadm` 配置是在 `userdata.yaml` 的 `write_files` 部分中创建和定义的。以下示例将 AWS SSM 混合激活作为混合节点的本地凭证提供者。有关 `nodeadm` 配置的更多信息，请参阅[混合节点 `nodeadm` 参考](hybrid-nodes-nodeadm.md)。

    **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: # AWS 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
   ```

1. 使用以下命令将 `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
   ```

1. 将新 VM 开机，这时应会自动连接到您配置的 EKS 集群。

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