创建自行管理的 Bottlerocket 节点 - Amazon EKS

创建自行管理的 Bottlerocket 节点

注意

托管节点组可能会为您的使用案例带来一些优势。有关更多信息,请参阅 使用托管式节点组简化节点生命周期

本主题介绍了如何启动向 Amazon EKS 集群注册的 Bottlerocket 节点的自动扩缩组。Bottlerocket 是 AWS 中的一个基于 Linux 的开源操作系统,用于在虚拟机或裸机主机上运行容器。在这些节点加入集群后,您可以向其部署 Kubernetes 应用程序。有关 Bottlerocket 的更多信息,请参阅 GitHub 上的将 Bottlerocket AMI 用于 Amazon EKSeksctl 文档中的自定义 AMI 支持

有关就地升级的信息,请参阅 GitHub 上的 Bottlerocket Update Operator

重要
  • Amazon EKS 节点是标准的 Amazon EC2 实例,您需要基于常规的 Amazon EC2 实例价格为其付费。有关更多信息,请参阅 Amazon EC2 定价

  • 您可以在 AWS Outpost 上的 Amazon EKS 扩展集群中启动 Bottlerocket 节点,但您无法在 AWS Outpost 上的本地集群中启动它们。有关更多信息,请参阅 使用 AWS Outposts 在本地部署 Amazon EKS

  • 您可以部署到采用 x86 或 Arm 处理器的 Amazon EC2 实例。但是,您无法部署到具有 Inferentia 芯片的实例。

  • Bottlerocket 与 AWS CloudFormation 兼容。但是,没有可以复制用于为 Amazon EKS 部署 Bottlerocket 节点的官方 CloudFormation 模板。

  • Bottlerocket 映像不附带 SSH 服务器或 shell。您可以使用带外访问方法来允许 SSH 启用管理员容器,并执行一些带有用户数据的引导配置步骤。有关更多信息,请参阅 GitHub 上的 bottlerocket README.md

此过程需要 eksctl 版本 0.194.0 或更高版本。可以使用以下命令来查看您的版本:

eksctl version

有关如何安装或升级 eksctl 的说明,请参阅 eksctl 文档中的安装。注意:此过程仅适用于使用 eksctl 创建的集群。

+ . 将以下内容复制到您的设备。将 my-cluster 替换为您的集群的名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域和 AWS 账户,该名称必须在其内具有唯一性。将 ng-bottlerocket 替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。要在 Arm 实例上部署,请将 m5.large 替换为 Arm 实例类型。将 my-ec2-keypair-name 替换为 Amazon EC2 SSH 密钥对的名称,您可使用该密钥对来在节点启动后使用 SSH 连接到这些节点。如果还没有 Amazon EC2 密钥对,可以在 AWS Management Console 中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对。将所有剩余 example values 替换为您自己的值。完成替换后,运行修改后的命令以创建 bottlerocket.yaml 文件。

+ 如果指定了 Arm Amazon EC2 实例类型,请在部署前查看 Amazon EKS 优化版 Arm Amazon Linux AMI 中的注意事项。有关如何使用自定义 AMI 进行部署的说明,请参阅 GitHub 上的构建 Bottlerocket 以及 eksctl 文档中的自定义 AMI 支持。要部署托管节点组,请使用启动模板部署自定义 AMI。有关更多信息,请参阅 使用启动模板自定义托管式节点

+ 重要提示:要将节点组部署到 AWS Outposts、AWS Wavelength 或 AWS 本地区域子网,在创建集群时不要传递 AWS Outposts、AWS Wavelength 或 AWS 本地区域子网。您必须在以下示例中指定子网。有关更多信息,请参阅 eksctl 文档中的从配置文件创建节点组Config 文件架构。将 region-code 替换为您的集群所在的 AWS 区域。

+

cat >bottlerocket.yaml <<EOF --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: '1.30' iam: withOIDC: true nodeGroups: - name: ng-bottlerocket instanceType: m5.large desiredCapacity: 3 amiFamily: Bottlerocket ami: auto-ssm iam: attachPolicyARNs: - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy ssh: allow: true publicKeyName: my-ec2-keypair-name EOF
  1. 使用以下命令部署您的节点。

    eksctl create nodegroup --config-file=bottlerocket.yaml

    示例输出如下。

    创建节点时会输出几行。输出的最后几行类似于以下示例行。

    [✔] created 1 nodegroup(s) in cluster "my-cluster"
  2. (可选)使用 Amazon EBS CSI 插件在 Bottlerocket 节点上创建 Kubernetes 持久卷。默认 Amazon EBS 驱动程序依赖于一些 Bottlerocket 中不包含的文件系统工具。有关使用驱动程序创建存储类的更多信息,请参阅 使用 Amazon EBS 存储 Kubernetes 卷

  3. (可选)kube-proxy 默认将 nf_conntrack_max 内核参数设置为默认值,该值可能与 Bottlerocket 最初在启动时设置的值不同。使用下面的命令保留 Bottlerocket’s default setting, edit the `kube-proxy 配置:

    kubectl edit -n kube-system daemonset kube-proxy

    --conntrack-max-per-core--conntrack-min 添加到以下示例中的 kube-proxy 参数。设置为 0 意味着没有变化。

    containers: - command: - kube-proxy - --v=2 - --config=/var/lib/kube-proxy-config/config - --conntrack-max-per-core=0 - --conntrack-min=0
  4. (可选)部署示例应用程序来测试您的 Bottlerocket 节点。

  5. 如果满足以下条件,我们建议阻止 Pod 访问 IMDS:

    • 您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。

    • 集群中没有任何 Pods 需要出于其它原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。

    有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问