连接使用 Bottlerocket 的混合节点 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

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

连接使用 Bottlerocket 的混合节点

本主题介绍如何将运行 Bottlerocket 的混合节点连接到 Amazon EKS 集群。Bottlerocket 是由 Amazon 赞助并提供支持的开源 Linux 发行版。Bottlerocket 专为托管容器工作负载而构建。您可以借助 Bottlerocket 实现容器基础设施自动更新,由此提高容器化部署的可用性,降低运营成本。Bottlerocket 仅包含运行容器所需的必备软件,可提高资源利用率、减少安全威胁并降低管理开销。

仅支持将 Bottlerocket 版本 v1.37.0 及更高版本的 VMware 变体与 EKS 混合节点结合使用。Bottlerocket 的 VMware 变体支持 Kubernetes 版本 1.28 及更高版本。这些变体的操作系统映像包括 kubelet、containerd、aws-iam-authenticator 以及适用于 EKS 混合节点功能的其他软件先决条件。您可以使用 Bottlerocket 设置文件来配置这些组件,该文件包含用于 Bottlerocket 引导容器和管理容器的 base64 编码用户数据。通过配置这些设置,可让 Bottlerocket 使用您的混合节点凭证提供程序来完成集群对混合节点的身份验证。混合节点加入集群后,将在 Amazon EKS 控制台以及 kubectl 等兼容 Kubernetes 的工具中显示并且状态为 Not Ready。完成本页介绍的步骤后,为混合节点配置 CNI 以确保混合节点可以随时用于运行应用程序。

先决条件

在将混合节点连接到 Amazon EKS 集群之前,请确保您已完成先决步骤。

第 1 步:创建 Bottlerocket 设置 TOML 文件

要为混合节点配置 Bottlerocket,您需要创建一个包含必要配置的 settings.toml 文件。TOML 文件的内容因您使用的凭证提供程序(SSM 或 IAM Roles Anywhere)而异。在预置 Bottlerocket 实例时,此文件将作为用户数据传递。

SSM

如果将 Amazon 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>:托管集群的 Amazon 区域,例如“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 引导容器文档。引导容器负责将实例注册为 Amazon SSM 托管式实例,并将其作为 Kubernetes 节点加入 Amazon EKS 集群。传递到引导容器的用户数据采用命令调用的形式,这会将您之前创建的 SSM 混合激活码和 ID 作为输入接受:

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

IAM Roles Anywhere

如果将 Amazon 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>:托管集群的 Amazon 区域,例如“us-east-1”

  • <hostname>:Bottlerocket 实例的主机名,这也将被配置为节点名称。这可以是您选择的任何唯一值,但必须符合 Kubernetes 对象命名惯例。此外,使用的主机名称长度不能超过 64 个字符。注意:使用 IAM-RA 提供程序时,如果您为混合节点 IAM 角色配置的信任策略使用 "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}" 资源条件,则节点名称必须与主机上证书的 CN 一致。

  • <base64-encoded-aws-config-file>:Amazon 配置文件的 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 虚拟机及用户数据

构造 TOML 文件后,在创建 vSphere 虚拟机期间将其传递为用户数据。请注意,在虚拟机首次开机之前,必须配置用户数据。因此,您需要在创建实例时提供用户数据;如果您希望先行创建虚拟机,则在您为其配置用户数据前,虚拟机必须处于关机状态。例如,假设使用 govc CLI:

首次创建虚拟机

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>

更新现有虚拟机的用户数据

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中的步骤。