

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 準備混合節點的作業系統
<a name="hybrid-nodes-os"></a>

Bottlerocket、Amazon Linux 2023 (AL2023)、Ubuntu 和 RHEL 經過持續驗證，可用作混合節點的節點作業系統。Bottlerocket 僅支援 VMware vSphere 環境中 AWS的 。在 Amazon EC2 外部執行時， AWS 支援計劃不涵蓋 AL2023。 Amazon EC2 AL2023 只能在內部部署虛擬化環境中使用，如需詳細資訊，請參閱 [Amazon Linux 2023 使用者指南](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 已包含混合節點所需的相依性，並且會在主機啟動時自動連接至您設定的叢集。

## 版本相容性
<a name="_version_compatibility"></a>

下表所列的作業系統版本代表相容且經過驗證可用作混合節點的節點作業系統。如果您使用的是不包含在此資料表中的其他作業系統變體或版本，則 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 | 

## 作業系統考量事項
<a name="_operating_system_considerations"></a>

### 一般
<a name="_general"></a>
+ Amazon EKS 混合節點 CLI (`nodeadm`) 可用於簡化混合節點元件和相依性的安裝和組態。在作業系統映像建置管道期間或每個內部部署主機的執行時期，您可以執行 `nodeadm install` 程序。如需有關 `nodeadm` 安裝的元件的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。
+ 如果您在內部部署環境中使用代理連線至網際網路，安裝和升級程序需要額外的作業系統組態，才能將套件管理工具設定為使用代理。如需說明，請參閱 [設定混合節點的代理](hybrid-nodes-proxy.md)。

### Bottlerocket
<a name="_bottlerocket"></a>
+ 連接 Bottlerocket 節點的步驟和工具與其他作業系統的步驟不同，並會在 [使用 Bottlerocket 連接混合節點](hybrid-nodes-bottlerocket.md) 中單獨介紹，而不會涵蓋在 [連接混合節點](hybrid-nodes-join.md) 的步驟中。
+ Bottlerocket 的步驟不會使用混合節點 CLI 工具 `nodeadm`。
+ EKS 混合節點僅支援 Bottlerocket 版本 1.37.0 及更新版本的 VMware 變體。Bottlerocket 的 VMware 變體適用於 Kubernetes 版本 1.28 及更新版本。不支援[其他 Bottlerocket 變體](https://bottlerocket.dev/en/os/1.36.x/concepts/variants)作為混合節點作業系統。注意： Bottlerocket 的 VMware 變體僅適用於 x86\_64 架構。

### Containerd
<a name="_containerd"></a>
+ 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
<a name="_ubuntu"></a>
+ 如果您使用的是 Ubuntu 24.04，您可能需要更新您的 containerd 版本，或變更 AppArmor 組態以採用允許 Pod 正確終止的修正，請參閱 [Ubuntu \#2065423](https://bugs.launchpad.net/ubuntu/+source/containerd-app/\+bug/2065423)。需要重新啟動才能將變更套用至 AppArmor 設定檔。Ubuntu 24.04 的最新版本在其套件管理工具中具有更新的 containerd 版本，且帶有修正 (containerd 版本 1.7.19\+)。

### ARM
<a name="_arm"></a>
+ 如果您使用的是 ARM 硬體，則需要具有密碼編譯延伸功能的 ARMv8.2 相容處理器 (ARMv8.2\+crypto)，才能執行 EKS kube-proxy 附加元件的版本 1.31 及更新版本。Raspberry Pi 5 之前的所有 Raspberry Pi 系統，以及 Cortex-A72 型處理器皆不符合此要求。解決方法是：您可以繼續使用 EKS kube-proxy 附加元件的版本 1.30，直到 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.
```

## 建置作業系統映像
<a name="_building_operating_system_images"></a>

Amazon EKS 提供[範例 Packer 範本](https://github.com/aws/eks-hybrid/tree/main/example/packer)，您可使用這些範本來建立包含 `nodeadm` 的作業系統映像，並將其設定為在主機啟動時執行。建議執行此程序，以避免在每個主機上個別提取混合節點相依性，並自動化混合節點引導程序。您可以搭配 Ubuntu 22.04、Ubuntu 24.04、RHEL 8 或 RHEL 9 ISO 映像使用範例 Packer 範本，並且可以使用這些格式輸出映像：OVA、Qcow2 或 raw。

### 先決條件
<a name="_prerequisites"></a>

使用範例 Packer 範本之前，您必須在執行 Packer 的機器上安裝下列內容。
+ Packer 版本 1.11.0 或更新版本。如需有關安裝 Packer 的指示，請參閱 Packer 文件中的[安裝 Packer](https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli)。
+ 如果建置 OVA，則為 VMware vSphere 外掛程式 1.4.0 或更新版本
+ 如果是建置 `Qcow2` 或原始映像，則為 QEMU 外掛程式版本 1.x

### 設定環境變數
<a name="_set_environment_variables"></a>

在執行 Packer 建置之前，請在執行 Packer 的機器上設定下列環境變數。

 **一般** 

必須設定下列環境變數，才能運用所有作業系統和輸出格式建置映像。


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
| PKR\_SSH\_PASSWORD | String | Packer 會在佈建時使用 `ssh_username` 和 `ssh_password` 變數，將 SSH 傳送至建立的機器。這需要與在個別作業系統的啟動或使用者資料檔案中建立初始使用者的密碼相符。預設值設定為 "builder" 或 "ubuntu"，視作業系統而定。設定密碼時，請務必在對應的 `ks.cfg` 或 `user-data` 檔案中對其進行變更，以保持相符。 | 
| ISO\_URL | String | 要使用的 ISO 的 URL。可以是從伺服器下載的 Web 連結，也可以是本機檔案的絕對路徑 | 
| ISO\_CHECKSUM | String | 所提供 ISO 的關聯檢查總和。 | 
| CREDENTIAL\_PROVIDER | String | 混合節點的憑證提供者。對於 SSM 混合啟用，有效值為 `ssm` (預設)，而對於 IAM Roles Anywhere，有效值為 `iam` | 
| K8S\_VERSION | String | 混合節點的 Kubernetes 版本 (例如 `1.31`)。如需支援的 Kubernetes 版本，請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。 | 
| NODEADM\_ARCH | String | `nodeadm install` 的架構。選取 `amd` 或 `arm`。 | 

 **RHEL** 

如果您使用的是 RHEL，則必須設定下列環境變數。


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
| RH\_USERNAME | String | RHEL 訂閱管理員使用者名稱 | 
| RH\_PASSWORD | String | RHEL 訂閱管理員密碼 | 
| RHEL\_VERSION | String | 要使用的 Rhel iso 版本。有效值為 `8` 或 `9`。 | 

 **Ubuntu** 

不需要 Ubuntu 專屬環境變數。

 **vSphere** 

如果您要建置 VMware vSphere OVA，則必須設定下列環境變數。


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
| VSPHERE\_SERVER | String | vSphere 伺服器地址 | 
| VSPHERE\_USER | String | vSphere 使用者名稱 | 
| VSPHERE\_PASSWORD | String | vSphere 密碼 | 
| VSPHERE\_DATACENTER | String | vSphere 資料中心名稱 | 
| VSPHERE\_CLUSTER | String | vSphere 叢集名稱 | 
| VSPHERE\_DATASTORE | String | vSphere 資料儲存名稱 | 
| VSPHERE\_NETWORK | String | vSphere 網路名稱 | 
| VSPHERE\_OUTPUT\_FOLDER | String | 範本的 vSphere 輸出資料夾 | 

 **QEMU** 


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
| PACKER\_OUTPUT\_FORMAT | String | QEMU 建置器的輸出格式。有效值為 `qcow2` 和 `raw`。 | 

 **驗證範本** 

執行建置之前，請設定環境變數，然後使用下列命令驗證範本。如果您對範本使用不同的名稱，請取代 `template.pkr.hcl`。

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

### 建置映像
<a name="_build_images"></a>

使用下列命令建置映像，並使用 `-only` 旗標來指定映像的目標和作業系統。如果您對範本使用不同的名稱，請取代 `template.pkr.hcl`。

 **vSphere OVA** 

**注意**  
如果您搭配 vSphere 使用 RHEL，您需要將啟動檔案轉換為 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
```

### 透過使用者資料傳遞 nodeadm 組態
<a name="_pass_nodeadm_configuration_through_user_data"></a>

您可以透過 cloud-init 傳遞使用者資料中 `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 的名稱取代 `VM_NAME`。

   ```
   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}"
   ```