

 **帮助改进此页面** 

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

# 为 EKS 自动模式创建节点池
<a name="create-node-pool"></a>

借助 Amazon EKS 节点池可以灵活地管理 Kubernetes 集群中的计算资源。本主题演示如何使用 Karpenter 创建和配置节点池，Karpenter 是一种有助于优化集群扩展和资源利用率的节点预置工具。借助 Karpenter 的节点池资源，您可以定义计算资源的具体要求，包括实例类型、可用区、架构和容量类型。

您无法修改内置的 `system` 和 `general-purpose` 节点池，只能启用或禁用这些节点池。有关更多信息，请参阅 [启用或禁用内置节点池](set-builtin-node-pools.md)。

借助节点池规范，您可以通过各种受支持的标签和要求对 EKS 集群的计算资源进行精细控制。其中包括用于指定 EC2 实例类别、CPU 配置、可用区、架构（ARM64/AMD64）和容量类型（竞价型或按需型）的选项。您还可以设置有关 CPU 和内存使用量的资源限制，确保集群始终遵守所需的运行界限。

EKS 自动模式利用通用的 Kubernetes 标签，从而通过一致和标准化的方法来标识节点特征。这些标签（例如用于可用区的 `topology.kubernetes.io/zone` 标签和用于 CPU 架构的 `kubernetes.io/arch` 标签）都遵循约定的 Kubernetes 规范。此外，特定于 EKS 的标签（前缀为 `eks.amazonaws.com/`）通过实例类型、CPU 制造商、GPU 功能和联网规范等 AWS 特定属性进一步扩展了此功能。这种标准化的标记系统有利于与现有 Kubernetes 工具的无缝集成，同时实现深入的 AWS 基础设施集成。

## 创建节点池
<a name="_create_a_nodepool"></a>

按照以下步骤为 Amazon EKS 集群创建节点池：

1. 创建一个包含所需节点池配置的 YAML 文件并将其命名为 `nodepool.yaml`。您可以使用以下示例配置。

1. 将节点池应用到集群：

   ```
   kubectl apply -f nodepool.yaml
   ```

1. 验证节点池是否已成功创建：

   ```
   kubectl get nodepools
   ```

1. （可选）监控节点池状态：

   ```
   kubectl describe nodepool default
   ```

确认节点池引用了集群中存在的有效节点类。节点类定义了计算资源的 AWS 特定配置。有关更多信息，请参阅 [为 Amazon EKS 创建节点类](create-node-class.md)。

## 示例节点池
<a name="_sample_nodepool"></a>

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: my-node-pool
spec:
  template:
    metadata:
      labels:
        billing-team: my-team
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["c", "m", "r"]
        - key: "eks.amazonaws.com/instance-cpu"
          operator: In
          values: ["4", "8", "16", "32"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a", "us-west-2b"]
        - key: "kubernetes.io/arch"
          operator: In
          values: ["arm64", "amd64"]

  limits:
    cpu: "1000"
    memory: 1000Gi
```

## 受 EKS 自动模式支持的标签
<a name="auto-supported-labels"></a>

EKS 自动模式支持以下通用标签。

**注意**  
EKS 自动模式使用的标签与 Karpenter 不同。与 EC2 托管式实例相关的标签以 `eks.amazonaws.com` 开头。


| 标签 | 示例 | 描述 | 
| --- | --- | --- | 
|  topology.kubernetes.io/zone  |  us-east-2a  |   AWS 区域  | 
|  node.kubernetes.io/instance-type  |  g4dn.8xlarge  |   AWS 实例类型  | 
|  kubernetes.io/arch  |  amd64  |  架构是由实例上的 [GOARCH 值](https://github.com/golang/go/blob/master/src/internal/syslist/syslist.go#L58)来定义  | 
|  karpenter.sh/capacity-type  |  spot  |  容量类型包括 `spot`、`on-demand`  | 
|  eks.amazonaws.com/instance-hypervisor  |  nitro  |  使用特定虚拟机监控程序的实例类型  | 
|  eks.amazonaws.com/compute-type  |  自动  |  标识 EKS 自动模式托管式节点  | 
|  eks.amazonaws.com/instance-encryption-in-transit-supported  |  true  |  支持（或不支持）传输中加密的实例类型  | 
|  eks.amazonaws.com/instance-category  |  g  |  相同类别的实例类型，通常是代次编号之前的字符串  | 
|  eks.amazonaws.com/instance-generation  |  4  |  实例类别中的实例类型代次编号  | 
|  eks.amazonaws.com/instance-family  |  g4dn  |  属性相似但资源数量不同的实例类型  | 
|  eks.amazonaws.com/instance-size  |  8xlarge  |  资源数量相似但属性不同的实例类型  | 
|  eks.amazonaws.com/instance-cpu  |  32  |  实例上的 CPU 数量  | 
|  eks.amazonaws.com/instance-cpu-manufacturer  |   `aws`   |  CPU 制造商的名称  | 
|  eks.amazonaws.com/instance-memory  |  131072  |  实例内存兆比字节数  | 
|  eks.amazonaws.com/instance-ebs-bandwidth  |  9500  |  实例可用 EBS 最大[兆比特](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html#ebs-optimization-performance)数  | 
|  eks.amazonaws.com/instance-network-bandwidth  |  131072  |  实例可用[基线兆比特](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html)数  | 
|  eks.amazonaws.com/instance-gpu-name  |  t4  |  实例上 GPU 的名称（如有）  | 
|  eks.amazonaws.com/instance-gpu-manufacturer  |  nvidia  |  CPU 制造商的名称  | 
|  eks.amazonaws.com/instance-gpu-count  |  1  |  实例 GPU 数量  | 
|  eks.amazonaws.com/instance-gpu-memory  |  16384  |  GPU 内存兆比字节数  | 
|  eks.amazonaws.com/instance-local-nvme  |  900  |  实例本地 nvme 存储空间千兆比字节数  | 

**注意**  
EKS 自动模式仅支持某些实例，并对最小大小有要求。有关更多信息，请参阅 [EKS 自动模式支持的实例参考](automode-learn-instances.md#auto-supported-instances)。

## 不受 EKS 自动模式支持的标签
<a name="_eks_auto_mode_not_supported_labels"></a>

EKS 自动模式不支持以下标签。
+ EKS 自动模式仅支持 Linux
  +  `node.kubernetes.io/windows-build` 
  +  `kubernetes.io/os` 

## 禁用内置节点池
<a name="_disable_built_in_node_pools"></a>

如果创建自定义节点池，则可以禁用内置节点池。有关更多信息，请参阅 [启用或禁用内置节点池](set-builtin-node-pools.md)。

## 不含内置节点池的集群
<a name="_cluster_without_built_in_node_pools"></a>

您可以创建不含内置节点池的集群。如果组织创建了自定义节点池，此功能就大有用处。

**注意**  
当您创建不含内置节点池的集群时，不会自动预置 `default` NodeClass。您需要创建一个自定义 NodeClass。有关更多信息，请参阅 [为 Amazon EKS 创建节点类](create-node-class.md)。

 **概述：**

1. 创建一个 EKS 集群，`nodePools` 值和 `nodeRoleArn` 值皆为空。
   + 示例 eksctl `autoModeConfig`：

     ```
     autoModeConfig:
       enabled: true
       nodePools: []
       # Do not set a nodeRoleARN
     ```

     有关更多信息，请参阅 [使用 eksctl CLI 创建 EKS 自动模式集群](automode-get-started-eksctl.md)。

1. 创建具有节点角色 ARN 的自定义节点类
   + 有关更多信息，请参阅 [为 Amazon EKS 创建节点类](create-node-class.md)。

1. 为自定义节点类创建访问条目
   + 有关更多信息，请参阅 [创建节点类访问条目](create-node-class.md#auto-node-access-entry)。

1. 如上所述，创建自定义节点池。

## 中断
<a name="_disruption"></a>

您可以配置 EKS 自动模式，以多种方式通过 NodePool 中断节点。您可以使用 `spec.disruption.consolidationPolicy`、`spec.disruption.consolidateAfter` 或 `spec.template.spec.expireAfter`。您也可以通过 NodePool 的 `spec.disruption.budgets` 对 EKS 自动模式的中断进行速率限制。您还可以控制时间范围和同时中断的节点数量。有关配置此行为的说明，请参阅 Karpenter 文档中的 [Disruption](https://karpenter.sh/docs/concepts/disruption/)。

您可就以下目的配置节点池中断功能：
+ 发现实例未得到充分利用的情况，据此整合工作负载。
+ 创建节点池中断预算，对偏移、空置和整合导致的节点终止进行速率限制。

EKS 自动模式默认会：
+ 整合未得到充分利用的实例。
+ 在 336 小时后终止实例。
+ 将单个中断预算设置为 10% 的节点。
+ 允许在发布新的自动模式 AMI（约每周一次）时由于漂移而更换节点。

## 终止宽限期
<a name="_termination_grace_period"></a>

如果未在 EKS Auto NodePool 上明确定义 `terminationGracePeriod`，系统会自动对关联的 NodeClaim 应用默认的 24 小时终止宽限期。虽然 EKS Auto 客户不会在其自定义 NodePool 配置中看到默认的 `terminationGracePeriod`，但他们会在 NodeClaim 上看到这个默认值。无论是在 NodePool 上明确设置了宽限期还是在 NodeClaim 上设置了默认宽限期，该功能都保持一致，从而确保整个集群中的节点终止行为可预测。