

 **協助改進此頁面** 

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

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

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

# 使用 Bottlerocket 連接混合節點
<a name="hybrid-nodes-bottlerocket"></a>

本主題會說明如何將執行 Bottlerocket 的混合節點連接至 Amazon EKS 叢集。[Bottlerocket](https://aws.amazon.com/bottlerocket/) 是由 贊助和支援的開放原始碼 Linux 發行版本 AWS。Bottlerocket 專為託管容器工作負載而打造。利用 Bottlerocket，您可以自動化容器基礎結構的更新，進而改善容器化部署的可用性並降低營運成本。Bottlerocket 僅包含執行容器的基本軟體，可改善資源用量、減少安全威脅，並降低管理開銷。

EKS 混合節點僅支援 Bottlerocket 版本 1.37.0 及更新版本的 VMware 變體。Bottlerocket 的 VMware 變體適用於 Kubernetes 版本 1.28 及更新版本。這些變體的作業系統映像包括 kubelet、containerd、aws-iam-authenticator 和 EKS 混合節點的其他軟體先決條件。您可以使用 Bottlerocket [設定](https://github.com/bottlerocket-os/bottlerocket#settings)檔案來設定這些元件，其中該檔案包含 Bottlerocket 引導和管理員容器的 base64 編碼使用者資料。設定這些設定可讓 Bottlerocket 使用您的混合節點憑證提供者，進而驗證叢集的混合節點。混合節點加入叢集後，其即會在 Amazon EKS 主控台和 Kubernetes 相容工具 (例如 `kubectl`) 中顯示為「`Not Ready`」狀態。完成此頁面上的步驟後，請繼續 [設定混合節點的 CNI](hybrid-nodes-cni.md)，以讓您的混合節點準備好執行應用程式。

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

將混合節點連接至 Amazon EKS 叢集之前，請確保您已完成先決條件步驟。
+ 您可以從內部部署環境連線至託管 Amazon EKS 叢集 AWS 的區域。如需詳細資訊，請參閱[準備混合節點的聯網](hybrid-nodes-networking.md)。
+ 您已建立混合節點 IAM 角色，並設定內部部署憑證提供者 (AWS Systems Manager 混合啟用或 AWS IAM Roles Anywhere)。如需詳細資訊，請參閱[準備混合節點的憑證](hybrid-nodes-creds.md)。
+ 您已建立了已啟用混合節點的 Amazon EKS 叢集。如需詳細資訊，請參閱[建立具有混合節點的 Amazon EKS 叢集](hybrid-nodes-cluster-create.md)。
+ 您已將混合節點 IAM 角色與 Kubernetes 角色型存取控制 (RBAC) 許可建立關聯。如需詳細資訊，請參閱[準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)。

## 步驟 1：建立 Bottlerocket 設定 TOML 檔案
<a name="_step_1_create_the_bottlerocket_settings_toml_file"></a>

若要為混合節點設定 Bottlerocket，您需要建立具有必要組態的 `settings.toml` 檔案。TOML 檔案的內容會根據您使用的憑證提供者 (SSM 或 IAM Roles Anywhere) 而有所不同。佈建 Bottlerocket 執行個體時，此檔案將會作為使用者資料傳遞。

**注意**  
以下提供的 TOML 檔案僅代表將 Bottlerocket VMWare 機器初始化為 EKS 叢集上的節點所需的最低設定。Bottlerocket 提供廣泛的設定，可處理多種不同的使用案例，因此對於混合節點初始化以外的其他組態選項，請參閱 [Bottlerocket 文件](https://bottlerocket.dev/en)，以取得您使用之 Bottlerocket 版本的所有文件化設定的完整清單 （例如，[以下](https://bottlerocket.dev/en/os/1.51.x/api/settings-index)是 Bottlerocket 1.51.x 可用的所有設定）。

### SSM
<a name="_ssm"></a>

如果您使用 AWS Systems Manager 做為登入資料提供者，請使用下列內容建立`settings.toml`檔案：

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.govskope.ca.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "ssm"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"

[settings.host-containers.control]
enabled = true
```

使用下列值取代預留位置：
+  `<cluster-name>`：Amazon EKS 叢集的名稱。
+  `<api-server-endpoint>`：叢集的 API 伺服器端點。
+  `<cluster-certificate-authority>`：叢集的 base64 編碼 CA 套件。
+  `<region>`：託管叢集 AWS 的區域，例如 "us-east-1"。
+  `<hostname>`：Bottlerocket 執行個體的主機名稱，其也會設定為節點名稱。這可以是您選擇的任何唯一值，不過必須遵循 [Kubernetes 物件命名慣例](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)。此外，您使用的主機名稱不可超過 64 個字元。注意：使用 SSM 提供商時，在向 SSM 註冊執行個體之後，此主機名稱和節點名稱將會取代為受管執行個體 ID (例如 `mi-*` ID)。
+  `<base64-encoded-admin-container-userdata>`：Bottlerocket 管理員容器組態的 base64 編碼內容。啟用管理員容器可讓您使用 SSH 連接至 Bottlerocket 執行個體，以進行系統勘探和偵錯。雖然這並非必要的設定，但我們建議您將其啟用，以便進行故障診斷。如需使用管理員容器進行身分驗證的詳細資訊，請參閱 [Bottlerocket 管理員容器文件](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)。管理員容器採用 JSON 格式的 SSH 使用者和金鑰輸入，例如：

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`：Bottlerocket 引導容器組態的 base64 編碼內容。如需其組態的詳細資訊，請參閱 [Bottlerocket 引導容器文件](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)。引導容器負責將執行個體註冊為 AWS SSM 受管執行個體，並將其聯結為 Amazon EKS 叢集上的 Kubernetes 節點。傳遞至引導容器的使用者資料採用命令調用的形式，而其接受您先前建立的 SSM 混合啟用代碼和 ID 作為輸入：

```
eks-hybrid-ssm-setup --activation-id=<activation-id> --activation-code=<activation-code> --region=<region>
```

### IAM Roles Anywhere
<a name="_iam_roles_anywhere"></a>

如果您使用 AWS IAM Roles Anywhere 做為登入資料提供者，請使用下列內容建立`settings.toml`檔案：

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"
config = "<base64-encoded-aws-config-file>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.govskope.ca.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "iam-ra"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"
```

使用下列值取代預留位置：
+  `<cluster-name>`：Amazon EKS 叢集的名稱。
+  `<api-server-endpoint>`：叢集的 API 伺服器端點。
+  `<cluster-certificate-authority>`：叢集的 base64 編碼 CA 套件。
+  `<region>`：託管叢集 AWS 的區域，例如 "us-east-1"
+  `<hostname>`：Bottlerocket 執行個體的主機名稱，其也會設定為節點名稱。這可以是您選擇的任何唯一值，不過必須遵循 [Kubernetes 物件命名慣例](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)。此外，您使用的主機名稱不可超過 64 個字元。注意：使用 IAM-RA 提供商時，如果您已使用 `"sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}"` 資源條件設定混合節點 IAM 角色的信任政策，則節點名稱必須與主機上的憑證的 CN 相符。
+  `<base64-encoded-aws-config-file>`：組態檔案的 base64 AWS 編碼內容。檔案的內容應如下所示：

```
[default]
credential_process = aws_signing_helper credential-process --certificate /root/.aws/node.crt --private-key /root/.aws/node.key --profile-arn <profile-arn> --role-arn <role-arn> --trust-anchor-arn <trust-anchor-arn> --role-session-name <role-session-name>
```
+  `<base64-encoded-admin-container-userdata>`：Bottlerocket 管理員容器組態的 base64 編碼內容。啟用管理員容器可讓您使用 SSH 連接至 Bottlerocket 執行個體，以進行系統勘探和偵錯。雖然這並非必要的設定，但我們建議您將其啟用，以便進行故障診斷。如需使用管理員容器進行身分驗證的詳細資訊，請參閱 [Bottlerocket 管理員容器文件](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)。管理員容器採用 JSON 格式的 SSH 使用者和金鑰輸入，例如：

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`：Bottlerocket 引導容器組態的 base64 編碼內容。如需其組態的詳細資訊，請參閱 [Bottlerocket 引導容器文件](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)。引導容器負責在執行個體上建立 IAM Roles Anywhere 主機憑證和憑證私有金鑰檔案。然後，`aws_signing_helper` 會使用這些憑證來取得臨時憑證，以便與您的 Amazon EKS 叢集進行身分驗證。傳遞至引導容器的使用者資料採用命令調用的形式，而其接受您先前建立的憑證和私有金鑰的內容作為輸入：

```
eks-hybrid-iam-ra-setup --certificate=<certificate> --key=<private-key>
```

## 步驟 2：使用使用者資料佈建 Bottlerocket vSphere VM
<a name="_step_2_provision_the_bottlerocket_vsphere_vm_with_user_data"></a>

建構 TOML 檔案後，請在 vSphere VM 建立期間將其作為使用者資料進行傳遞。請記住，必須在 VM 第一次開機之前設定使用者資料。因此，您需要在建立執行個體時提供它，或者如果您想要提前建立 VM，則 VM 必須處於關機狀態，直到您為其設定使用者資料為止。例如，如果使用 `govc` CLI：

### 第一次建立 VM
<a name="_creating_vm_for_the_first_time"></a>

```
govc vm.create \
  -on=true \
  -c=2 \
  -m=4096 \
  -net.adapter=<network-adapter> \
  -net=<network-name> \
  -e guestinfo.userdata.encoding="base64" \
  -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
  -template=<template-name> \
  <vm-name>
```

### 更新現有 VM 的使用者資料
<a name="_updating_user_data_for_an_existing_vm"></a>

```
govc vm.create \
    -on=false \
    -c=2 \
    -m=4096 \
    -net.adapter=<network-adapter> \
    -net=<network-name> \
    -template=<template-name> \
    <vm-name>

govc vm.change
    -vm <vm-name> \
    -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
    -e guestinfo.userdata.encoding="base64"

govc vm.power -on <vm-name>
```

在上述區段中，`-e guestinfo.userdata.encoding="base64"` 選項會指定使用者資料採用 base64 編碼。`-e guestinfo.userdata` 選項會將 `settings.toml` 檔案的 base64 編碼內容作為使用者資料傳遞至 Bottlerocket 執行個體。使用特定值取代預留位置，例如 Bottlerocket OVA 範本和聯網詳細資訊。

## 步驟 3：驗證混合節點連線
<a name="_step_3_verify_the_hybrid_node_connection"></a>

Bottlerocket 執行個體啟動後，其會嘗試加入您的 Amazon EKS 叢集。您可以導覽至叢集的「運算」索引標籤，或執行下列命令，以在 Amazon EKS 主控台中驗證連線：

```
kubectl get nodes
```

**重要**  
您的節點將處於 `Not Ready` 狀態，這在意料之中，因為您的混合節點上並未執行 CNI。如果您的節點未加入叢集，請參閱 [故障診斷混合節點](hybrid-nodes-troubleshooting.md)。

## 步驟 4：設定混合節點的 CNI
<a name="_step_4_configure_a_cni_for_hybrid_nodes"></a>

要讓您的混合節點準備好執行應用程式，請繼續執行 [設定混合節點的 CNI](hybrid-nodes-cni.md) 上的步驟。