

 **帮助改进此页面** 

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

# 创建自主管理型 Bottlerocket 节点
<a name="launch-node-bottlerocket"></a>

**注意**  
托管节点组可能会为您的使用案例带来一些优势。有关更多信息，请参阅 [使用托管式节点组简化节点生命周期](managed-node-groups.md)。

本主题介绍了如何启动向 Amazon EKS 集群注册的 [Bottlerocket](https://aws.amazon.com/bottlerocket/) 节点的自动扩缩组。Bottlerocket 是 AWS 的基于 Linux 的开源操作系统，用于在虚拟机或裸机主机上运行容器。在这些节点加入集群后，您可以向其部署 Kubernetes 应用程序。有关 Bottlerocket 的更多信息，请参阅 GitHub 上的[将 Bottlerocket AMI 与 Amazon EKS 一起使用](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-EKS.md)和 `eksctl` 文档中的[自定义 AMI 支持](https://eksctl.io/usage/custom-ami-support/)。

有关就地升级的信息，请参阅 GitHub 上的 [Bottlerocket Update Operator](https://github.com/bottlerocket-os/bottlerocket-update-operator)。

**重要**  
Amazon EKS 节点是标准的 Amazon EC2 实例，您需要基于常规的 Amazon EC2 实例价格为其付费。有关更多信息，请参阅 [Amazon EC2 定价](https://aws.amazon.com/ec2/pricing/)。
您可以在 AWS Outpost 上的 Amazon EKS 扩展集群中启动 Bottlerocket 节点，但您无法在 AWS Outpost 上的本地集群中启动它们。有关更多信息，请参阅 [使用 AWS Outposts 在本地部署 Amazon EKS](eks-outposts.md)。
您可以部署到采用 `x86` 或 Arm 处理器的 Amazon EC2 实例。但是，您无法部署到具有 Inferentia 芯片的实例。
Bottlerocket 与 AWS CloudFormation 兼容。但是，没有可以复制用于为 Amazon EKS 部署 Bottlerocket 节点的官方 CloudFormation 模板。
Bottlerocket 映像不附带 SSH 服务器或 Shell。您可以使用带外访问方法来允许 SSH 启用管理员容器，并执行一些带有用户数据的引导启动配置步骤。有关更多信息，请参阅 GitHub 上的 [bottlerocket README.md](https://github.com/bottlerocket-os/bottlerocket)：  
 [Exploration (探索)](https://github.com/bottlerocket-os/bottlerocket#exploration) 
 [管理员容器](https://github.com/bottlerocket-os/bottlerocket#admin-container) 
 [Kubernetes 设置](https://github.com/bottlerocket-os/bottlerocket#kubernetes-settings) 

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

```
eksctl version
```

有关如何安装或升级 `eksctl` 的说明，请参阅 `eksctl` 文档中的[安装](https://eksctl.io/installation)。注意：此过程仅适用于使用 `eksctl` 创建的集群。

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

   如果指定了 Arm Amazon EC2 实例类型，请在部署前查看 [Amazon EKS 优化版 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami) 中的注意事项。有关使用自定义 AMI 进行部署的说明，请参阅 GitHub 上的[构建 Bottlerocket](https://github.com/bottlerocket-os/bottlerocket/blob/develop/BUILDING.md) 以及 `eksctl` 文档中的[自定义 AMI 支持](https://eksctl.io/usage/custom-ami-support/)。要部署托管节点组，请使用启动模板部署自定义 AMI。有关更多信息，请参阅 [使用启动模板自定义托管式节点](launch-templates.md)。
**重要**  
要将节点组部署到 AWS Outposts、AWS Wavelength 或 AWS Local Zones 子网，就不要在创建集群时传递 AWS Outposts、AWS Wavelength 或 AWS Local Zones 子网。您必须在以下示例中指定子网。有关更多信息，请参阅 `eksctl` 文档中的[从配置文件创建节点组](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)和 [Config 文件架构](https://eksctl.io/usage/schema/)。将 *region-code* 替换为您的集群所在的 AWS 区域。

   ```
   cat >bottlerocket.yaml <<EOF
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: region-code
     version: '1.35'
   
   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"
   ```

1. （可选）使用 [Amazon EBS CSI 插件](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)在 Bottlerocket 节点上创建 Kubernetes [持久性卷](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)。默认 Amazon EBS 驱动程序依赖于一些 Bottlerocket 中不包含的文件系统工具。有关使用驱动程序创建存储类的更多信息，请参阅 [将 Kubernetes 卷存储与 Amazon EBS 结合使用](ebs-csi.md)。

1. （可选）`kube-proxy` 默认将 `nf_conntrack_max` 内核参数设置为默认值，该值可能与 Bottlerocket 最初在启动时设置的值不同。要保留 Bottlerocket 的[默认设置](https://github.com/bottlerocket-os/bottlerocket-core-kit/blob/develop/packages/release/release-sysctl.conf)，请使用以下命令编辑 `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
   ```

1. （可选）部署[示例应用程序](sample-deployment.md)来测试您的 Bottlerocket 节点。

1. 如果满足以下条件，我们建议阻止容器组（pod）访问 IMDS：
   + 您计划将 IAM 角色分配给所有 Kubernetes 服务账户，以便容器组（pod）仅具有其所需的最低权限。
   + 集群中没有任何容器组（pod）需要出于其他原因（例如检索当前 AWS 区域）访问 Amazon EC2 实例元数据服务（IMDS）。

   有关更多信息，请参阅[限制对分配给工作节点的实例配置文件的访问](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。