# 节点池概述
#### 简介
为帮助您更好地管理Kubernetes集群内的节点，云容器引擎CCE引入节点池概念。节点池是集群中具有相同配置的一组节点，一个节点池包含一个节点或多个节点。
您可以在CCE控制台创建新的自定义节点池，借助节点池基本功能方便快捷地创建、管理和销毁节点，而不会影响整个集群。新节点池中所有节点的参数和类型都彼此相同，您无法在节点池中配置单个节点，任何配置更改都会影响节点池中的所有节点。
通过节点池功能您还可以实现节点的动态扩缩容（仅按需计费的节点池支持）：
- 当集群中出现因资源不足而无法调度的实例（Pod）时，自动触发扩容，为您减少人力成本。
- 当满足节点空闲等缩容条件时，自动触发缩容，为您节约资源成本。
本章节介绍节点池在云容器引擎（CCE）中的工作原理，以及如何创建和管理节点池。
#### 节点池架构
图1节点池整体架构图   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001941424529.png "点击放大")
通常情况下，节点池内的节点均具有如下相同属性：
- 节点操作系统。
- 节点登录方式。
- 节点容器运行时。
- 节点所属企业项目。
- 节点Kubernetes组件启动参数。
- 节点自定义启动脚本。
- 节点"K8s标签"及"污点"设置。
此外，CCE将同时围绕节点池扩展以下属性：
- 节点池级别操作系统。
- 节点池级别每节点的Pod数上限。
 
#### 节点池升级说明
对于v1.21.11-r0、v1.23.9-r0、v1.25.4-r0及以上版本的集群，新建的节点池不再区分计费模式，默认支持创建按需和包周期的节点，为您提供更优秀的资源管理体验。
新节点池的优势如下：
- 同一个节点池中支持创建按需节点和包周期节点，并且支持选择不同的包年包月周期。
- 支持纳管按需/包周期节点。
- 支持开启弹性伸缩，配置丰富的伸缩策略，为资源管理带来更高效、更灵活的体验。
对于已存在的节点池，升级为新节点池后将存在以下行为变更：
| 原节点池类型 | 新节点池变化                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|
| 按需节点池   | 新节点池将自动继承按需节点池的全量能力。 此外，新节点池中创建的包周期节点不支持手动缩容，仅支持退订和移除。                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| 包周期节点池   | 您可以将原有的包周期节点池无损切换到新节点池，并且不会对节点池下已有的节点产生任何影响。 此外，包周期节点池切换到新节点池后，行为变化如下： - 默认创建的节点不再是包周期节点，而是按需节点。  - 节点池中的包周期节点不再支持手动缩容，仅支持退订和移除。  - 将支持开启弹性伸缩功能，且弹性伸缩默认扩缩容的节点为按需节点，不会扩缩容包周期节点。  - 不再支持使用更新节点池接口创建包周期节点，如果您需要新建包周期节点，请使用扩缩容节点池接口。   |
   
 #### 默认节点池DefaultPool说明
DefaultPool并非一个真正的节点池，只是将非自定义节点池中的节点做一个**归类**，所有非自定义节点池中创建的节点（直接在控制台创建的节点或调用API创建的节点）都会归类在DefaultPool中。DefaultPool不具备任何自定义节点池的功能，包括弹性伸缩、各项参数设置等，且不可编辑、删除或迁移，也不支持扩容、弹性伸缩。
#### 应用场景
当业务需要使用大规模集群时，推荐您使用节点池进行节点管理，以提高大规模集群易用性。
下表介绍了多种大规模集群管理场景，并分别展示节点池在每种场景下发挥的作用：
表1节点池场景及作用 
| 场景                 | 作用               |
|:---|:---|
| 集群存在较多异构节点（机型配置不同） | 通过节点池可规范节点分组管理。    |
| 集群需要频繁扩缩容节点        | 通过节点池可降低操作成本。     |
| 集群内应用程序调度规则复杂      | 通过节点池标签可快速指定业务调度规则。 |
   
#### 功能点及注意事项
| 功能点               | 功能说明                                                     | 注意事项                                                                                                                                                                                                           |
|:---|:---|:---|
| 创建节点池           | 新增节点池。                                                      | 单个集群不建议超过100个节点池。                                                                                                                                                                                          |
| 删除节点池            | 删除节点池时会先删除节点池中的节点，原有节点上的工作负载实例会自动迁移至其他节点池的可用节点。           | 如果工作负载实例具有特定的节点选择器，且如果集群中的其他节点均不符合标准，则工作负载实例可能仍处于无法安排的状态。                                                                                                                                                   |
| 节点池开启弹性伸缩         | 开启弹性伸缩后，节点池将根据集群负载情况自动创建或删除节点池内的节点。                      | 节点池中的节点建议不要放置重要数据，以防止节点被弹性缩容，数据无法恢复。                                                                                                                                                                          |
| 节点池关闭弹性伸缩      | 关闭弹性伸缩后，节点池内节点数量不随集群负载情况自动调整。                            | /                                                                                                                                                                                                           |
| 调整节点池大小        | 支持直接调整节点池内节点个数。若减少节点数量，将从现有节点池内随机缩容节点。                     | 开启弹性伸缩后，不建议手动调整节点池大小。                                                                                                                                                                                          |
| 调整节点池配置         | 可修改节点池名称、节点个数，删除或新增K8s标签、污点及资源标签，调整节点池磁盘配置、操作系统、容器运行时等配置。 | 删除或新增K8s标签和污点会对节点池内节点全部生效，可能会引起Pod重新调度，请谨慎变更。                                                                                                                                                                 |
| 移出节点池内节点        | 可以将同一个集群下某个节点池中的节点迁移到默认节点池（DefaultPool）中                  | 暂不支持将自定义节点池中的节点直接迁移到其他自定义节点池。                                                                                                                                                                                |
| 复制节点池           | 可以方便地复制现有节点池的配置，从而创建新的节点池。                                | /                                                                                                                                                                                                            |
| 配置Kubernetes参数 | 通过该功能您可以对核心组件进行深度配置。                                      | - 本功能仅支持在v1.15及以上版本的集群中对节点池进行配置，v1.15以下版本不显示该功能。  - 默认节点池DefaultPool不支持修改该类配置。   |
   
#### 将工作负载部署到特定节点池
节点池中的节点均带有"cce.cloud.com/cce-nodepool"标签，在配置工作负载时，您可以通过配置工作负载nodeSelector来根据此标签设置工作负载与节点的亲和性，确保将该工作负载被部署到特定节点池中。示例如下：
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector: 
        cce.cloud.com/cce-nodepool: "nodepool_name" # 标签值为节点池名称
      containers:
      - image: nginx:latest
        imagePullPolicy: IfNotPresent
        name: nginx
      imagePullSecrets:
      - name: default-secret
```
如果您需要更多自定义的亲和性规则以满足更复杂的调度情况，例如必须满足条件才能调度的"硬约束"、尽量满足条件但即使不满足所有条件也仍会被调度的"软约束"，您可以参考[设置节点亲和调度（nodeAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0892.html)。
您也可以为容器指定资源请求，工作负载将仅在满足资源请求的节点上运行，详情请参见[为Pod和容器管理资源](https://kubernetes.io/zh-cn/docs/concepts/configuration/manage-resources-containers/)。例如，如果工作负载定义了需要包含四个CPU的容器，则工作负载将不会选择在具有两个CPU的节点上运行。
#### 节点池生命周期
CCE集群节点池的生命周期涉及多个阶段和状态。
表2节点池生命周期状态说明 
| 状态 | 说明                                 |
|:---|:---|
| 正常 | 节点池正常运行状态，可以正常扩缩容。                    |
| 伸缩中  | 节点池正在扩缩容节点（节点的删除、迁入、纳管、移除等操作均会出现该状态）。 |
| 删除中 | 节点池正在删除。                           |
| 错误 | 节点池异常状态。                            |
   
#### 相关文档
您可以登录CCE控制台并参考以下文档， 进行节点池对应的操作：
- [创建节点池](https://support.huaweicloud.com/usermanual-cce/cce_10_0012.html)
- [管理节点池](https://support.huaweicloud.com/usermanual-cce/cce_10_0222.html)
- [创建无状态负载（Deployment）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)
- [设置节点亲和调度（nodeAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0892.html)
 
