使用 Bottlerocket 連接混合節點 - Amazon EKS

協助改進此頁面

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

使用 Bottlerocket 連接混合節點

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

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

先決條件

將混合節點連接至 Amazon EKS 叢集之前,請確保您已完成先決條件步驟。

  • 您的內部部署環境與託管您的 Amazon EKS 叢集的 AWS 區域之間已建立網路連線。如需詳細資訊,請參閱「準備混合節點的聯網」。

  • 您已建立混合節點 IAM 角色,並設定內部部署憑證提供者 (AWS Systems Manager 混合啟用或 AWS IAM Roles Anywhere)。如需詳細資訊,請參閱「準備混合節點的憑證」。

  • 您已建立了已啟用混合節點的 Amazon EKS 叢集。如需詳細資訊,請參閱「建立具有混合節點的 Amazon EKS 叢集」。

  • 您已將混合節點 IAM 角色與 Kubernetes 角色型存取控制 (RBAC) 許可建立關聯。如需詳細資訊,請參閱「準備混合節點的叢集存取」。

步驟 1:建立 Bottlerocket 設定 TOML 檔案

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

SSM

如果您使用 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" [settings.network] hostname = "<hostname>" [settings.aws] region = "<region>" [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 物件命名慣例。此外,您使用的主機名稱不可超過 64 個字元。注意:使用 SSM 提供商時,在向 SSM 註冊執行個體之後,此主機名稱和節點名稱將會取代為受管執行個體 ID (例如 mi-* ID)。

  • <base64-encoded-admin-container-userdata>:Bottlerocket 管理員容器組態的 base64 編碼內容。啟用管理員容器可讓您使用 SSH 連接至 Bottlerocket 執行個體,以進行系統勘探和偵錯。雖然這並非必要的設定,但我們建議您將其啟用,以便進行故障診斷。如需使用管理員容器進行身分驗證的詳細資訊,請參閱 Bottlerocket 管理員容器文件。管理員容器採用 JSON 格式的 SSH 使用者和金鑰輸入,例如:

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

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

IAM Roles Anywhere

如果您使用 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" [settings.network] hostname = "<hostname>" [settings.aws] region = "<region>" config = "<base64-encoded-aws-config-file>" [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 物件命名慣例。此外,您使用的主機名稱不可超過 64 個字元。注意:使用 IAM-RA 提供商時,如果您已使用 "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}" 資源條件設定混合節點 IAM 角色的信任政策,則節點名稱必須與主機上的憑證的 CN 相符。

  • <base64-encoded-aws-config-file>:AWS 組態檔案的 base64 編碼內容。檔案的內容應如下所示:

[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 管理員容器文件。管理員容器採用 JSON 格式的 SSH 使用者和金鑰輸入,例如:

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

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

步驟 2:使用使用者資料佈建 Bottlerocket vSphere VM

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

第一次建立 VM

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 的使用者資料

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:驗證混合節點連線

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

kubectl get nodes
重要

您的節點將處於 Not Ready 狀態,這在意料之中,因為您的混合節點上並未執行 CNI。如果您的節點未加入叢集,請參閱 故障診斷混合節點

步驟 4:設定混合節點的 CNI

要讓您的混合節點準備好執行應用程式,請繼續執行 設定混合節點的 CNI 上的步驟。