更新时间:2026-11-10 GMT+08:00
分享

Karpenter插件

插件简介

Karpenter是一个开源的集群节点自动扩缩容项目,旨在处理集群中Pending的Pods,对其申请的资源进行聚合,并做出最优的节点弹性决策,在最大限度地减少调度延迟的同时,提供一个最合适的计算资源来满足Pods调度需求。同时在集群节点资源利用率较低时,整合节点资源,通过缩容合适的节点来减少集群的资源浪费。

Karpenter可分成节点扩容与缩容两个方面:

  • 自动扩容:集群中存在由于节点资源不足而无法调度的Pending Pods时,会触发节点扩容。
  • 自动缩容:Karpenter的缩容场景主要有节点资源利用率低、节点池存量节点与节点池实际配置不一致、节点超期。

原理说明

Karpenter通过监听Kubernetes集群中的Pod调度状态和节点资源使用情况,自动进行节点的扩缩容决策。其工作原理如下:

  • 扩容流程:当集群中出现因资源不足而无法调度的Pending Pod时,Karpenter会聚合这些Pod的资源申请量,结合NodePool中定义的机型约束(requirements字段)和CCENodeClass中定义的节点模板配置(OS、磁盘、网络等),选择最合适的ECS规格创建节点,并将Pending Pod调度到新节点上。
  • 缩容流程:Karpenter持续监控集群中节点的资源利用率。当节点持续处于低利用率状态时,Karpenter会评估“删除代价”(由节点上的Pod数目、Pod优先级、节点超期时间等因素综合评估),对删除代价较低的节点优先缩容,将其上的Pod迁移到其他节点后删除该节点。

约束与限制

  • Karpenter弹性节点仅支持默认节点池。
  • 不支持与CCE集群弹性引擎插件同时使用。
  • 不支持GPU、NPU资源不足场景下的节点弹性,若集群中运行GPU或者NPU资源时,可能会出现不可预期的结果。
  • 如果在Karpenter扩容过程中,用户通过CCE界面或者API创建节点资源,由于Karpenter暂时无法及时感知创建中的CCE节点,可能会导致弹性节点资源过剩。
  • 不支持物理机节点与裸金属服务器。
  • 扩容时,由于OS占用的固定Memory,因此弹性扩容出来的机器实际可分配内存与Pending Pod资源申请量可能会存在偏差。
  • 删除NodePool资源后,该NodePool资源扩容的所有节点将会被删除。

安装插件

Karpenter插件需要在CCE控制台的插件中心进行安装,安装后插件将自动监听集群中的Pending Pod和节点资源状态。

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“插件中心”,在右侧找到Karpenter插件,单击“安装”。
  3. 在安装插件页面,根据需求选择“规格配置”。CCE根据集群规模提供三种“系统预置规格”,您可根据自身需求进行选择,系统会根据不同的预置规格配置插件的实例数及资源配额,具体配置值请以控制台显示为准。
  4. 设置“委托配置”。

    插件在运行时需要访问其他云服务资源,需要您通过委托配置授权插件对各类云服务资源进行操作。详情请参见插件自定义委托说明。
    • 使用系统推荐委托:自动创建该插件的默认委托并使用,默认委托如果已存在则不会重复创建。
    • 使用已有委托:在选择委托的下拉列表中选择创建的委托。请确保已对创建的自定义委托授予了必需的权限,否则插件功能可能无法正常使用。

  5. 设置“CBC终端节点配置”,使用Karpenter插件时需要通过CBC终端节点对接费用中心。如果未配置CBC终端节点,请先创建后再刷新查看终端节点最新状态。
  6. 设置插件实例的部署策略。

    • 调度策略对于DaemonSet类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表1 插件调度配置

    参数

    参数说明

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区下的不同节点。
    • 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,每个可用区下最多运行一个实例。如集群下节点不满足多可用区,插件实例将无法全部运行。节点故障后,插件实例存在无法迁移风险。

    节点亲和

    • 不配置:插件实例不指定节点亲和调度。
    • 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。
    • 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。

      同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)插件的Deployment实例调度到带有与之匹配的污点的节点上,也可用于控制插件的Deployment实例所在的节点被标记污点后插件的Deployment实例的驱逐策略。

    插件会对实例添加针对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。

    详情请参见设置容忍策略。

  7. 单击“安装”。

组件说明

表2 Karpenter组件

容器组件

说明

资源类型

karpenter-provider-cce

负责监听集群中Pending Pod的状态,聚合其资源申请量,并根据NodePool和CCENodeClass的配置做出弹性节点决策,创建或删除节点。

Deployment

使用Karpenter实现节点弹性伸缩

使用Karpenter实现节点弹性伸缩需要完成以下3个步骤:

  1. 创建CCENodeClass资源对象:定义弹性节点的模板,包括OS镜像、登录方式、磁盘配置、网络配置等。
  2. 创建NodePool资源对象:定义节点池的约束和策略,包括机型约束、缩容策略、过期时间等,并引用上一步创建的CCENodeClass。
  3. 创建业务工作负载:创建Pending Pod以触发Karpenter扩容,并验证节点是否成功创建。

以下内容将分别介绍具体操作流程。

步骤一:创建CCENodeClass资源对象

CCENodeClass用于定义Karpenter弹性节点的模板配置,包括OS镜像、登录方式、磁盘、网络、运行时等。Karpenter在扩容时会根据该模板创建ECS节点。

  1. 执行以下命令,创建CCENodeClass对象的YAML文件。

    vim ccenodeclass.yaml

    文件内容如下:

    apiVersion: karpenter.k8s.cce/v1
    kind: CCENodeClass
    metadata:
      name: cce-nodeclass-1
    spec:
      imsSelector:
        imsName: Huawei Cloud EulerOS 2.0
      login:
        userPassword:
          password: 'xxx'
          username: root
      rootVolume:
        hw:passthrough: true
        size: 50
        volumetype: SAS
      dataVolumes:
        - hw:passthrough: true
          size: 100
          volumetype: SAS
      storage:
        storageGroups:
          - cceManaged: true
            name: vgpaas
            selectorNames:
              - cceUse
            virtualSpaces:
              - lvmConfig:
                  lvType: linear
                name: share
                size: 100%
        storageSelectors:
          - matchLabels:
              count: "1"
              size: "100"
              volumeType: SAS
            name: cceUse
            storageType: evs
      nodeNicSpec:
        primaryNic:
          subnetId: xxxx
      hostnameConfig:
        type: privateIp
      kubelet:
        dockerBaseSize: 10
        maxPods: 20
      runtime:
        name: containerd
        runtimeClass: runc
      serverEnterpriseProjectID: "0"

  2. 执行以下命令,创建CCENodeClass对象。

    kubectl create -f ccenodeclass.yaml 

    回显结果如下:

    ccenodeclass.karpenter.k8s.cce/cce-nodeclass-1 created

  3. 执行以下命令,查看CCENodeClass对象是否已经正常创建。

    kubectl get ccenodeclass 

    回显结果如下,则说明名为“cce-nodeclass-1”的CCENodeClass对象已正常创建。

    NAME              AGE
    cce-nodeclass-1   20s

步骤二:创建NodePool资源对象

NodePool用于定义Karpenter节点池的约束和策略,包括机型约束、缩容策略、过期时间等,并引用上一步创建的CCENodeClass作为节点模板。Karpenter在扩容时会根据NodePool中的requirements字段选择符合条件的ECS规格创建节点。

  1. 执行以下命令,创建NodePool对象的YAML文件。

    vim nodepool.yaml 

    文件内容如下:

    apiVersion: karpenter.sh/v1
    kind: NodePool
    metadata:
      name: karpenter-nodepool-1
      annotations:
        karpenter.k8s.cce/on-demand-allocation-strategy: prioritized  # 按需策略
        karpenter.k8s.cce/spot-allocation-strategy: capacity-optimized  # 竞价策略
    spec:
      disruption:
        budgets:
          - nodes: 10%
        consolidateAfter: 30s
        consolidationPolicy: WhenEmptyOrUnderutilized
      template:
        metadata:
          labels:
            key: values
        spec:
          taints:
            - key: xxx
              value: xxx
              effect: NoSchedule
          startupTaints:
            - key: xxx
              value: xxx
              effect: NoSchedule
          expireAfter: 720h
          nodeClassRef:
            group: karpenter.k8s.cce
            kind: CCENodeClass
            name: cce-nodeclass-1
          requirements:
            - key: kubernetes.io/os
              operator: In
              values:
                - linux
            - key: kubernetes.io/arch
              operator: In
              values:
                - amd64
            - key: karpenter.sh/capacity-type
              operator: In
              values:
                - spot
            - key: karpenter.k8s.cce/instance-category
              operator: In
              values:
                - s
                - c
            - key: karpenter.k8s.cce/instance-generation
              operator: In
              values:
                - "3"
                - "7"
                - "6"
            - key: karpenter.k8s.cce/instance-family
              operator: In
              values:
                - s7
                - s6
                - c3
            - key: karpenter.k8s.cce/instance-type
              operator: In
              values:
                - c3.large.2
                - c3.xlarge.2
          terminationGracePeriod: 30s

  2. 执行以下命令,创建NodePool对象。

    kubectl create -f nodepool.yaml 

    回显结果如下:

    nodepool.karpenter.sh/karpenter-nodepool-1 created 

  3. 执行以下命令,查看NodePool对象是否已经正常创建。

    kubectl get nodepool 

    回显结果如下,则说明名为“karpenter-nodepool-1”的NodePool对象已正常创建。

    NAME                    AGE
    karpenter-nodepool-1    20s

步骤三:创建业务工作负载并验证扩容

创建一个Pending Pod以触发Karpenter扩容。这里以创建一个nginx应用为例,该应用申请一定量的CPU和内存资源,集群中现有节点资源不足以调度该Pod,从而触发Karpenter自动扩容。

  1. 执行以下命令,创建业务工作负载的YAML文件。

    vim deployment.yaml

    文件内容如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:alpine
              resources:
                requests:
                  cpu: 1
                  memory: 1Gi
          imagePullSecrets:
            - name: default-secret

  2. 执行以下命令,创建业务工作负载。

    kubectl create -f deployment.yaml 

    回显结果如下:

    deployment.apps/nginx-deployment created

  3. 验证扩容结果。

    创建工作负载后,由于集群中现有节点资源不足以调度该Pod,Pod将处于Pending状态,Karpenter会自动触发扩容创建新节点。本步骤用于检查Karpenter是否成功扩容节点并完成Pod调度。

    1. 执行以下命令,查看Pod状态。
      kubectl get pod 

      回显结果如下,Pod的“STATUS”从“Pending”变为“Running”,则说明Karpenter已成功扩容节点并将Pod调度到新节点上。

      NAME                                READY   STATUS    RESTARTS   AGE 
      nginx-deployment-5c689b8d6f-abc12   1/1     Running   0          2m 
    2. 执行以下命令,查看集群节点是否已新增。
      kubectl get node 

      回显结果如下,可以看到集群中新增了一个节点,则说明Karpenter扩容成功。

      NAME             STATUS   ROLES    AGE   VERSION 
      10.0.0.1         Ready    <none>   18d   v1.30.0 
      10.0.0.2         Ready    <none>   2m    v1.30.0

参数说明

CCENodeClass参数说明

参数

是否必选

参数类型

描述

kind

是

String

参数解释:

API类型

约束限制:

该值不可修改

取值范围:

不涉及

默认取值:

CCENodeClass

apiVersion

是

String

参数解释:

API版本

约束限制:

该值不可修改

取值范围:

不涉及

默认取值:

karpenter.k8s.cce/v1

metadata

是

CCENodeClassMetadata object

参数解释:

metadata是对象的元数据定义,是集合类的元素类型,包含一组由不同名称定义的属性。

约束限制:

不涉及

spec

是

CCENodeClassSpec object

参数解释:

spec是集合类的元素类型,用户对需要管理的节点对象进行详细描述的主体部分都在spec中给出。系统通过spec的描述来创建节点。

约束限制:

不涉及

表3 CCENodeClassMetadata

参数

是否必选

参数类型

描述

name

是

String

参数解释:

节点名称

约束限制:

  • 格式要求:必须是合法的 DNS 子域名(遵循 RFC 1123 标准)。
  • 字符限制:只能包含小写字母、数字、连字符(-)和点(.)。
  • 首尾要求:必须以字母或数字开头和结尾。
  • 长度限制:总长度不能超过 253 个字符。

取值范围:

不涉及

默认取值:

不涉及

表4 CCENodeClassSpec

参数

是否必选

参数类型

描述

imsSelector

是

ImsSelector object

参数解释:

节点的OS信息

约束限制:

不涉及

login

否

Login object

参数解释:

节点的登录方式。不配置将保留所选择镜像的密码,为了保证您的正常使用,请确保所选择镜像中已经设置了密码。

约束限制:

不涉及

rootVolume

是

Volume object

参数解释:

节点的磁盘信息。

约束限制:

不涉及

dataVolumes

否

Array of Volume objects

参数解释:

节点的数据盘参数。针对专属云节点,参数解释与rootVolume一致。

约束限制:

  • 磁盘挂载上限为虚拟机不超过16块,裸金属不超过10块。在此基础上还受限于虚拟机/裸金属规格可挂载磁盘数上限。(目前支持通过控制台和API为CCE节点添加多块数据盘)。
  • 如果数据盘正供容器运行时和Kubelet组件使用,则不可被卸载,否则将导致节点不可用。
  • 仅在选择系统盘作为系统组件存储磁盘时,允许为空。

storage

否

Storage object

参数解释:

磁盘初始化配置管理参数。

该参数配置逻辑较为复杂,详细说明请参见节点磁盘挂载。

约束限制:

  • v1.15.11-r0及以上集群版本支持此字段。不支持集群版本填写此字段将被忽略。
  • 如存在节点规格涉及本地盘并同时使用云硬盘场景时,请勿缺省此参数,避免出现将用户未期望的磁盘分区。
  • 如希望数据盘取值范围调整至20-32768,请勿缺省此参数。
  • 如希望使用共享磁盘空间(取消runtime和kubernetes分区),请勿缺省此参数,共享磁盘空间请参考容器运行时和Kubelet共享磁盘空间说明。
  • 如希望系统组件存储在系统盘中,请勿缺省此参数。

取值范围:

不涉及

默认取值:

不涉及

publicIP

否

NodePublicIP object

参数解释:

节点的弹性公网IP。

约束限制:

创建节点池添加节点时不支持该参数。

nodeNicSpec

否

NodeNicSpec object

参数解释:

节点的网卡信息。

约束限制:

不涉及

waitPostInstallFinish

否

Boolean

参数解释:

该参数用于控制创建节点时 post-install脚本执行完成前允许节点调度 行为。当该参数未设置或者为false时,在kubernetes节点就绪时,容器即可被调度到可用节点。当该参数为true时,在kubernetes节点就绪时且post-install脚本执行完成时,容器才可被调度到可用节点。

约束限制:

不涉及

取值范围:

  • false:在kubernetes节点就绪时,容器即可被调度到可用节点。
  • true:在kubernetes节点就绪时且post-install脚本执行完成时,容器才可被调度到可用节点。

默认取值:

false

ecsGroupId

否

String

参数解释:

云服务器组ID,若指定,将节点创建在该云服务器组下。

约束限制:

创建、更新节点池时该配置不会生效,若要保持节点池中的节点都在同一个云服务器组内,请在节点池 nodeManagement 字段中配置。

取值范围:

不涉及

默认取值:

不涉及

userTags

否

Array of UserTag objects

参数解释:

云服务器标签(资源标签)。字段使用场景:在节点创建场景下,支持指定初始值,查询时不返回该字段;在节点池场景下,创建节点池时节点模板参数中支持指定初始值,查询时支持返回该字段;在其余场景下,查询时都不会返回该字段。

约束限制:

键必须唯一,CCE支持的最大用户自定义标签数量依region而定,自定义标签数上限为8个。

runtime

否

Runtime object

参数解释:

容器运行时, 默认场景:

  • 1.25以下集群:默认为"docker"
  • 1.25及以上集群,随操作系统变化,默认的容器运行时不同
  • 操作系统为欧拉2.5、欧拉2.8的节点仅支持"docker",其余操作系统的节点默认为"containerd"

约束限制:

不涉及

initializedConditions

否

Array of strings

参数解释:

自定义初始化标记,默认值为空。

CCE节点在初始化完成之前,会打上初始化未完成污点(node.cloudprovider.kubernetes.io/uninitialized)防止pod调度到节点上。用户在创建节点时,可以通过设置initializedConditions参数,控制污点的移除时间(默认不设置超时时间)。

使用示例如下:

  1. 创建节点,传入参数 "initializedConditions": ["CCEInitial", "CustomedInitial"];
  2. 用户在执行完自定义初始化操作后,调用k8s接口(例如PATCH /v1/nodes/{node_ip}/status)更新节点的conditions,插入type为CCEInitial、CustomedInitial的两个标记,状态为True,如下所示:
  3. CCE组件轮询节点的status.Conditions,查看是否存在type为CCEInitial、CustomedInitial的condition,若存在且status字段值为True,认为节点初始化完成,则移除初始化污点;
  4. initializedConditions支持设置超时时间,用户可以在创节点时传入,如:"initializedConditions": ["CCEInitial:15m", "CustomedInitial:15m"],表示超时时间为15分钟,达到超时时间后,当CCE组件轮询到节点时会自动忽略初始化condition,移除初始化污点。
status:
  conditions:
  - type: CCEInitial
    status: 'True'
  - type: CustomedInitial
    status: 'True'

约束限制:

  • initializedConditions中超时时间取值范围为[1-99]分钟
  • 必须以字母、数字组成,长度范围1-20位。
  • 标记数量不超过2个。
  • 超时时间仅支持分钟(m)单位。

extendParam

否

NodeExtendParam object

参数解释:

创建节点时的扩展参数。

约束限制:

不涉及

hostnameConfig

否

HostnameConfig object

参数解释:

K8S节点名称配置参数。

约束限制:

支持的集群版本为v1.23.6-r0到v1.25或者v1.25.2-r0及以上。

serverEnterpriseProjectID

否

String

参数解释:

服务器企业项目ID。CCE服务不实现EPS相关特性,该字段仅用于同步服务器企业项目ID。

约束限制:

创建节点/节点池场景:可指定已存在企业项目,当取值为空时,该字段继承集群企业项目属性。

更新节点池场景:配置修改后仅会对新增节点的服务器生效,存量节点需前往EPS界面迁移。

取值范围:

不涉及

默认取值:

如果更新时不指定值,不会更新该字段。

当该字段为空时,返回集群企业项目。

kubelet

否

Kubelet object

参数解释:

节点kubelet相关配置

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表5 ImsSelector

参数

是否必选

参数类型

描述

imsName

否

String

参数解释:

节点的操作系统类型。具体支持的操作系统请参见节点操作系统说明。

说明:

imsName和imsId必须配置其中一个。

约束限制:

  • 若在创建节点时未指定该配置,CCE会根据集群版本自动选择支持的OS版本。
  • 若当前集群版本不支持该OS类型,则会自动替换为当前集群版本支持的同系列OS类型。

取值范围:

不涉及

默认取值:

不涉及

imsId

否

String

参数解释:

节点自定义镜像ID,从IMS控制台获取,需要使用自定义镜像时使用此参数。

说明:

imsName和imsId必须配置其中一个。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表6 Login

参数

是否必选

参数类型

描述

sshKey

否

String

参数解释:

选择密钥对方式登录时的密钥对名称。

约束限制:

仅支持账号密钥对,不支持私有密钥对。账号/私有密钥对的区别详情请参见创建密钥对。

取值范围:

不涉及

默认取值:

不涉及

userPassword

否

UserPassword object

参数解释:

选择密码方式登录时的账号密码信息,之后可通过此账号密码登录节点。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表7 UserPassword

参数

是否必选

参数类型

描述

username

否

String

参数解释:

登录账号,默认为“root”。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

root

password

是

String

参数解释:

登录密码,若创建节点通过用户名密码方式,即使用该字段,则响应体中该字段作屏蔽展示。

约束限制:

创建节点时password字段需要加盐加密,具体方法请参见创建节点时password字段加盐加密。

取值范围:

密码复杂度要求:

  • 长度为8-26位。
  • 密码至少必须包含大写字母、小写字母、数字和特殊字符(!@$%^-_=+[{}]:,./?)中的三种。
  • 密码不能包含用户名或用户名的逆序。

默认取值:

不涉及

表8 Volume

参数

是否必选

参数类型

描述

size

是

Integer

参数解释:

磁盘大小,单位为GiB。

约束限制:

不涉及

取值范围:

  • 系统盘取值范围:40~1024
  • 第一块数据盘取值范围:20~32768(当缺省磁盘初始化配置管理参数storage时,数据盘取值范围:100-32768)
  • 其他数据盘取值范围:10~32768(当缺省磁盘初始化配置管理参数storage时,数据盘取值范围:100-32768)

从v1.28版本集群开始,系统盘取值范围支持20~1024GiB

默认取值:

不涉及

volumetype

是

String

参数解释:

磁盘类型,取值请参见创建云服务器 中“root_volume字段数据结构说明”。

约束限制:

不涉及

取值范围:

  • SAS:高IO,是指由SAS存储提供资源的磁盘类型。
  • SSD:超高IO,是指由SSD存储提供资源的磁盘类型。
  • SATA:普通IO,是指由SATA存储提供资源的磁盘类型。EVS已下线SATA磁盘,仅存量节点有此类型的磁盘。
  • ESSD:极速型SSD云硬盘,是指由极速型SSD存储提供资源的磁盘类型。
  • GPSSD:通用型SSD云硬盘,是指由通用型SSD存储提供资源的磁盘类型。
  • ESSD2:极速型SSD V2云硬盘,是指由极速型SSD V2存储提供资源的磁盘类型。
  • GPSSD2:通用型SSD V2云硬盘,是指由通用型SSD V2存储提供资源的磁盘类型。

了解不同磁盘类型的详细信息,请参见磁盘类型及性能介绍。

默认取值:

不涉及

iops

否

Integer

参数解释:

给云硬盘配置iops。

约束限制:

  • 购买GPSSD2、ESSD2类型的云硬盘时必填,其他类型不能设置。
  • 只支持按需计费。

取值范围:

了解GPSSD2、ESSD2类型的iops大小范围,请参见云硬盘类型及性能介绍。

默认取值:

不涉及

throughput

否

Integer

参数解释:

给云硬盘配置吞吐量,单位是MiB/s。

约束限制:

  • 购买GPSSD2类型云硬盘时必填,其他类型不能设置。
  • 只支持按需计费。

取值范围:

了解GPSSD2类型的吞吐量大小范围,请参见云硬盘类型及性能介绍。

默认取值:

不涉及

extendParam

否

Map<String,Object>

参数解释:

磁盘扩展参数,取值请参见创建云服务器中“extendparam”参数的描述。

详情请参见创建磁盘的extendparam字段数据结构说明。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

hw:passthrough

否

Boolean

参数解释:

  • 使用SDI规格创建虚拟机时请关注该参数,如果该参数值为true,说明创建的为SCSI类型的卷;
  • 节点池类型为ElasticBMS时,此参数必须填写为true;
  • 如存在节点规格涉及本地盘并同时使用云硬盘场景时,请设置磁盘初始化配置管理参数,配置参考:节点磁盘挂载。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

metadata

否

VolumeMetadata object

参数解释:

云硬盘加密信息,仅在创建节点系统盘或数据盘需加密时须填写。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表9 VolumeMetadata

参数

是否必选

参数类型

描述

__system__encrypted

否

String

参数解释:

表示云硬盘加密功能的字段,'0'代表不加密,'1'代表加密。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

该字段不存在时,云硬盘默认为不加密。

__system__cmkid

否

String

参数解释:

用户主密钥ID,是metadata中的表示加密功能的字段,与__system__encrypted配合使用。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表10 Storage

参数

是否必选

参数类型

描述

storageSelectors

是

Array of StorageSelectors objects

参数解释:

磁盘选择,根据matchLabels和storageType对匹配的磁盘进行管理。磁盘匹配存在先后顺序,靠前的匹配规则优先匹配。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

storageGroups

是

Array of StorageGroups objects

参数解释:

由多个存储设备组成的存储组,用于各个存储空间的划分。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表11 StorageSelectors

参数

是否必选

参数类型

描述

name

是

String

参数解释:

selector的名字,作为storageGroup中selectorNames的索引。

约束限制:

各个selector间的名字不能重复。

取值范围:

不涉及

默认取值:

不涉及

storageType

是

String

参数解释:

存储类型。

约束限制:

  • local存储类型不支持磁盘选择,所有本地盘将被组成一个VG,因此也仅允许只有一个local类型的storageSelector。
  • system存储类型不支持磁盘选择,选择系统盘作为系统组件存储磁盘。因此也仅允许只有一个system类型的storageSelector,且name必须为cceUse。

取值范围:

当前仅支持evs(云硬盘)、local(本地盘)和system(系统盘)。

默认取值:

不涉及

matchLabels

否

matchLabels object

参数解释:

evs盘的匹配字段。

约束限制:

storageType设置为system(系统盘)时,无需设置此字段。

取值范围:

支持DataVolume中的size、volumeType、iops、throughput、metadataEncrypted、metadataCmkid、count字段。

默认取值:

不涉及

表12 matchLabels

参数

是否必选

参数类型

描述

size

否

String

参数解释:

匹配的磁盘大小,不填则无磁盘大小限制。例如:100。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

volumeType

否

String

参数解释:

云硬盘类型,目前支持SSD、GPSSD、SAS、ESSD、SATA等,不填则无云硬盘类型限制。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

iops

否

String

参数解释:

匹配的磁盘iops大小,不填则无磁盘iops大小限制。当需要选择GPSSD2或ESSD2类型磁盘时,配置iops来准确选择磁盘。例如:3000。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

throughput

否

String

参数解释:

匹配的磁盘吞吐量大小,不填则无磁盘吞吐量大小限制。当需要选择GPSSD2类型磁盘时,配置throughput来准确选择磁盘。例如:125。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

metadataEncrypted

否

String

参数解释:

磁盘加密标识符,0代表不加密,1代表加密,不填则无磁盘加密标识符限制。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

metadataCmkid

否

String

参数解释:

加密磁盘的用户主密钥ID,长度为36字节的字符串,不填则无磁盘密钥ID限制。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

count

否

String

参数解释:

磁盘选择个数,不填则选择所有此类磁盘。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表13 StorageGroups

参数

是否必选

参数类型

描述

name

是

String

参数解释:

storageGroups的名字,作为虚拟存储组的名字,因此各个group名字不能重复。

约束限制:

不涉及

取值范围:

  • 当cceManaged=true时,name必须为:vgpaas。
  • 当数据盘作为临时存储卷时:name必须为:vg-everest-localvolume-ephemeral。
  • 当数据盘作为持久存储卷时:name必须为:vg-everest-localvolume-persistent。

默认取值:

不涉及

cceManaged

否

Boolean

参数解释:

k8s及runtime所属存储空间。有且仅有一个group被设置为true,不填默认false。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

selectorNames

是

Array of strings

参数解释:

对应storageSelectors中的name,一个group可选择多个selector;但一个selector只能被一个group选择。

约束限制:

系统组件无法分别存储于系统盘与数据盘中,因此选择selector的type为system时,group只能选择一个selector。

取值范围:

不涉及

默认取值:

不涉及

virtualSpaces

是

Array of VirtualSpace objects

参数解释:

group中空间配置的详细管理。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表14 VirtualSpace

参数

是否必选

参数类型

描述

name

是

String

参数解释:

virtualSpace的名称,当前仅支持四种类型:share、kubernetes、runtime、user。

约束限制:

不涉及

取值范围:

  • kubernetes:k8s空间配置,需配置lvmConfig;
  • runtime:运行时空间配置,需配置runtimeConfig;
  • user:用户空间配置,需配置lvmConfig。

默认取值:

不涉及

size

是

String

参数解释:

virtualSpace的大小,仅支持整数百分比。例如:90%。

约束限制:

  • 同一StorageGroup内所有VirtualSpace的size之和≤100%
  • 单个VirtualSpace的size必须≥1%且≤100%

取值范围:

1% ~ 100%

默认取值:

不涉及

lvmConfig

否

LVMConfig object

参数解释:

lvm配置管理,适用于share、kubernetes和user空间配置。

约束限制:

一个virtualSpace仅支持一个config配置。

取值范围:

不涉及

默认取值:

不涉及

runtimeConfig

否

RuntimeConfig object

参数解释:

runtime配置管理,适用于运行时空间配置。

约束限制:

一个virtualSpace仅支持一个config配置。

取值范围:

不涉及

默认取值:

不涉及

表15 LVMConfig

参数

是否必选

参数类型

描述

lvType

是

String

参数解释:

LVM写入模式:linear、striped。linear:线性模式;striped:条带模式,使用多块磁盘组成条带模式,能够提升磁盘性能。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

path

否

String

参数解释:

磁盘挂载路径,仅在用户配置中生效,支持包含:数字、大小写字母、点、中划线、下划线的绝对路径。

约束限制:

挂载路径请填写业务目录路径,不可设置为空或根目录等操作系统关键路径。不可填写的操作系统关键路径如下:

/, /home, /home/, /bin, /bin/, /lib, /lib/, /root, /root/, /boot, /boot/, /dev, /dev/, /etc, /etc/, /lost+found, /lost+found/, /mnt, /mnt/, /proc, /proc/,/sbin, /sbin/, /srv, /srv/, /tmp, /tmp/, /var, /var/, /media, /media/, /opt, /opt/, /selinux, /selinux/, /sys, /sys/, /usr, /usr/, /opt/cloud/, /mnt/paas/, /home/paas/, /var/paas/, /var/lib/, /var/script/

取值范围:

不涉及

默认取值:

不涉及

表16 RuntimeConfig

参数

是否必选

参数类型

描述

lvType

是

String

参数解释:

LVM写入模式:linear、striped。linear:线性模式;striped:条带模式,使用多块磁盘组成条带模式,能够提升磁盘性能。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表17 NodePublicIP

参数

是否必选

参数类型

描述

eip

否

NodeEIPSpec object

参数解释:

弹性IP参数。

约束限制:

创建节点池时不支持此参数

bandwidth

否

NodeBandwidth object

参数解释:

弹性IP的带宽参数

约束限制:

该参数仅给节点池使用

表18 NodeEIPSpec

参数

是否必选

参数类型

描述

iptype

是

String

参数解释:

弹性IP类型,取值请参见申请EIP接口中publicip.type说明。

详情请参见申请EIP。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

bandwidth

否

NodeBandwidth object

参数解释:

弹性IP的带宽参数。

约束限制:

不涉及

表19 NodeBandwidth

参数

是否必选

参数类型

描述

chargemode

否

String

参数解释:

带宽的计费类型。

  • 按带宽计费:按公网传输速率(单位为Mbps)计费。当您的带宽利用率高于10%时,建议优先选择按带宽计费。
  • 按流量计费:只允许在创建按需节点时指定,按公网传输的数据总量(单位为GB)计费。当您的带宽利用率低于10%时,建议优先选择按流量计费。

约束限制:

不涉及

取值范围:

  • 未传该字段,表示按带宽计费。
  • 字段值为空,表示按带宽计费。
  • 字段值为“traffic”,表示按流量计费。
  • 字段为其它值,会导致创建云服务器失败。

默认取值:

不涉及

size

否

Integer

参数解释:

带宽大小,取值请参见申请EIP接口中bandwidth.size说明。

详情请参见申请EIP。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

sharetype

否

String

参数解释:

带宽的共享类型,共享类型枚举:PER,表示独享,目前仅支持独享。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表20 NodeNicSpec

参数

是否必选

参数类型

描述

primaryNic

否

NicSpec object

参数解释:

主网卡的描述信息。

约束限制:

不涉及

extNics

否

Array of NicSpec objects

参数解释:

扩展网卡。

约束限制:

创建节点池添加节点时不支持该参数。

表21 NicSpec

参数

是否必选

参数类型

描述

subnetId

否

String

参数解释:

网卡所在子网的网络ID。若节点池同时配置了subnetList,则节点池扩容子网以subnetList字段为准。

约束限制:

  • 主网卡创建时若未指定subnetId,将使用集群子网;
  • 扩展网卡创建时必须指定subnetId。

取值范围:

不涉及

默认取值:

不涉及

subnetList

否

Array of strings

参数解释:

网卡所在子网的网络ID列表,支持节点池配置多个子网。

约束限制:

最多支持配置20个子网。

表22 Taint

参数

是否必选

参数类型

描述

key

是

String

参数解释:

K8s污点的键。

约束限制:

必须以字母或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符。

取值范围:

不涉及

默认取值:

不涉及

value

否

String

参数解释:

K8s污点的值。

约束限制:

必须以字母或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符。

取值范围:

不涉及

默认取值:

不涉及

effect

是

String

参数解释:

K8s污点的作用效果。

约束限制:

不涉及

取值范围:

只可选NoSchedule,PreferNoSchedule或NoExecute。

默认取值:

不涉及

表23 UserTag

参数

是否必选

参数类型

描述

key

否

String

参数解释:

云服务器标签的键。

约束限制:

不得以"CCE-"、"__type_baremetal"或"_sys_"开头。

取值范围:

标签键不能重复,首尾不能为空,不能包含特殊字符"=","*",“<”,“>”,“\”,“,”,“|”,“/”,不能包含非打印字符ASCII(0-31),长度不超过128个字符。

默认取值:

不涉及

value

否

String

参数解释:

云服务器标签的值。

约束限制:

不涉及

取值范围:

标签值首尾不能为空,不能包含特殊字符"=","*",“<”,“>”,“\”,“,”,“|”,不能包含非打印字符ASCII(0-31),长度不超过255个字符。

默认取值:

不涉及

表24 Runtime

参数

是否必选

参数类型

描述

name

否

String

参数解释:

容器运行时。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

  • v1.25以下集群:默认为"docker";
  • v1.25及以上集群,随操作系统变化,默认的容器运行时不同;
  • 操作系统为EulerOS 2.5、EulerOS 2.8的节点默认为"docker",其余操作系统的节点默认为"containerd"。

runtimeClass

否

String

参数解释:

容器运行时子类别。

约束限制:

仅CCE Turbo集群下弹性云服务器-物理机类型节点且上级运行时为containerd场景支持使用安全运行时。

取值范围:

  • runc: 普通运行时。
  • kata: 安全运行时,需配套c6、c7系列弹性云服务器-物理机,支持操作系统为EulerOS 2.10。
  • kuasar-vmm: 安全运行时v2,支持操作系统为HCE 2.0,集群版本需为v1.28.15-r70、v1.29.15-r30、v1.30.14-r30、v1.31.10-r30、v1.32.6-r30、v1.33.5-r20或以上版本。

默认取值:

runc

表25 NodeExtendParam

参数

是否必选

参数类型

描述

alpha.cce/preInstall

否

String

参数解释:

安装前执行脚本。

输入的值需要经过Base64编码,方法如下:

echo -n "待编码内容" | base64

约束限制:

安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。

取值范围:

不涉及

默认取值:

不涉及

alpha.cce/postInstall

否

String

参数解释:

安装后执行脚本。

输入的值需要经过Base64编码,方法如下:

echo -n "待编码内容" | base64

约束限制:

安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。

取值范围:

不涉及

默认取值:

不涉及

表26 HostnameConfig

参数

是否必选

参数类型

描述

type

是

String

参数解释:

K8S节点名称配置类型, 默认为“privateIp”。

约束限制:

  • 配置为cceNodeName的节点, 其节点名称、K8S节点名称以及虚机名称相同。节点名称不支持修改, 并且在ECS侧修改了虚机名称,同步云服务器时,不会将修改后的虚机名称同步到节点。
  • 配置为cceNodeName的节点,为了避免K8S节点名称冲突,系统会自动在节点名称后添加后缀,后缀的格式为中划线(-)+五位随机字符,随机字符的取值为[a-z0-9]。

取值范围:

  • privateIp: 将节点私有IP作为K8S节点名称
  • cceNodeName: 将CCE节点名称作为K8S节点名称

默认取值:

默认为“privateIp”。

表27 Kubelet

参数

是否必选

参数类型

描述

maxPods

否

Integer

参数解释:

节点最大允许创建的实例数(Pod),该数量包含系统默认实例。

该设置的目的为防止节点因管理过多实例而负载过重,请根据您的业务需要进行设置。

节点可以创建多少个Pod,受多个参数影响,具体请参见节点可创建的最大Pod数量说明。

约束限制:

不涉及

取值范围:

通用取值范围为16~256,节点运行时子类别为安全运行时v2(kuasar-vmm)场景取值范围为16~1024。

默认取值:

不涉及

dockerBaseSize

否

Integer

参数解释:

节点上单容器的可用磁盘空间大小(已废弃,请优先使用containerBaseSize参数),单位G。

CCE节点容器运行时空间配置请参考默认数据盘空间分配说明。

约束限制:

  • Devicemapper模式下建议dockerBaseSize配置不超过80G,设置过大时可能会导致容器运行时初始化时间过长而启动失败,若对容器磁盘大小有特殊要求,可考虑使用挂载外部或本地存储方式代替。
  • dockerBaseSize设置仅在v1.19.16-r0、v1.21.3-r0、v1.23.3-r0及以上的集群版本中的EulerOS/HCEOS2.0节点上生效。

取值范围:

10-500。

默认取值:

不配置该值或值为0时将使用默认值:

  • Devicemapper模式下默认值为10;
  • OverlayFS模式默认不限制单容器可用空间大小。

containerBaseSize

否

Integer

参数解释:

节点上单容器的可用磁盘空间大小,单位G。

CCE节点容器运行时空间配置请参考默认数据盘空间分配说明。

约束限制:

  • Devicemapper模式下建议containerBaseSize配置不超过80G,设置过大时可能会导致容器运行时初始化时间过长而启动失败,若对容器磁盘大小有特殊要求,可考虑使用挂载外部或本地存储方式代替;Devicemapper模式在新版中仅有共池裸机使用,已逐步废弃。
  • containerBaseSize设置仅在新版本集群(v1.23.14-r0/v1.25.9-r0/v1.27.6-r0/v1.28.4-r0及以上)的EulerOS/HCEOS2.0节点上生效。
  • 更新节点池时,不支持更新此参数。

取值范围:

10-500。

默认取值:

不配置该值或值为0时将使用默认值:

  • Devicemapper模式下默认值为10;
  • OverlayFS模式默认不限制单容器可用空间大小。

systemReserved

否

Map<String, String>

参数解释:

节点系统预留资源配置

示例:

{
  "cpu": "35m",
  "ephemeral-storage": "1Gi",
  "memory": "600Mi",
  "pid": "100"
}

约束限制:

不涉及

取值范围:

  • cpu:节点CPU预留,系统组件预留值。随节点规格变动,具体请参见节点预留资源策略说明。
  • memory:节点内存预留,系统组件预留值。随节点规格变动,具体请参见节点预留资源策略说明。
  • ephemeral-storage:节点临时存储空间预留,系统组件预留值。目的是为OS系统守护进程(如 sshd、udev 等)预留临时存储。
  • pid:节点PID预留,系统组件预留值。目的是为OS系统守护进程(如 sshd、udev 等)预留指定数量的进程ID。

默认取值:

不涉及

kubeReserved

否

Map<String, String>

参数解释:

节点Kubernetes相关组件预留资源配置

示例:

{
  "cpu": "35m",
  "ephemeral-storage": "1Gi",
  "memory": "600Mi",
  "pid": "100"
}

约束限制:

不涉及

取值范围:

  • cpu:节点CPU预留,Kubernetes相关组件预留值。随节点规格变动,具体请参见节点预留资源策略说明。
  • memory:节点内存预留,Kubernetes相关组件预留值。随节点规格变动,具体请参见节点预留资源策略说明。
  • ephemeral-storage:节点临时存储空间预留,Kubernetes组件预留值。目的是为Kubernetes系统守护进程(如kubelet、container runtime等)预留临时存储。
  • pid:节点PID预留,Kubernetes相关组件预留值。目的是为Kubernetes系统守护进程(如kubelet、container runtime等)预留指定数量的进程ID。

默认取值:

不涉及

NodePool参数说明

表28 请求Body

参数

是否必选

参数类型

描述

kind

是

String

参数解释:

API类型

约束限制:

该值不可修改

取值范围:

不涉及

默认取值:

NodePool

apiVersion

是

String

参数解释:

API版本

约束限制:

该值不可修改

取值范围:

不涉及

默认取值:

karpenter.sh/v1

metadata

是

NodePoolMetadata object

参数解释:

metadata是对象的元数据定义,是集合类的元素类型,包含一组由不同名称定义的属性。

约束限制:

不涉及

spec

是

NodePoolSpec object

参数解释:

spec是集合类的元素类型,用户对需要管理的节点池对象进行详细描述的主体部分都在spec中给出。系统通过spec的描述来创建节点。

约束限制:

不涉及

表29 NodePoolMetadata

参数

是否必选

参数类型

描述

name

是

String

参数解释:

节点池名称

约束限制:

  • 格式要求:必须是合法的 DNS 子域名(遵循 RFC 1123 标准)。
  • 字符限制:只能包含小写字母、数字、连字符(-)和点(.)。
  • 首尾要求:必须以字母或数字开头和结尾。
  • 长度限制:总长度不能超过 253 个字符。

取值范围:

不涉及

默认取值:

不涉及

annotations

否

Map<String,String>

参数解释:

格式为key/value键值对。

  • Key:必须以字母或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符;另外可以使用DNS子域作为前缀,例如example.com/my-key,DNS子域最长253个字符。
  • Value:可以为空或者非空字符串,无固定字符数限制(受 Pod/CRD 等 API 对象整体大小上限限制,通常为 1MB)

示例:

"annotations": {
"key": "value"
}

约束限制:

不涉及

取值范围:

按需以及竞价实例支持使用如下注解配置多规格扩容时的优先级策略:

  • karpenter.k8s.cce/on-demand-allocation-strategy:按需实例的优先级策略
  • karpenter.k8s.cce/spot-allocation-strategy: 竞价实例的优先级策略

按需实例支持的策略如下:

  • lowest-price:价格优先,优先创建价格低的规格
  • prioritized:按优先级,优先创建优先级高的规格,优先级配置参考配置多规格优先级。

竞价计费支持的策略如下:

  • lowest-price:价格优先,优先创建价格低的规格
  • capacity-optimized:容量优化,优先创建空闲容量最大的实例
  • price-capacity-optimized:价格容量优化,容量最安全的池子中,选择价格最低的实例
  • capacity-optimized-prioritized:带优先级的容量优化,优先级配置参考配置多规格优先级。

默认值:

不涉及

表30 NodePoolSpec

参数

是否必选

参数类型

描述

template

是

nodeClaimTemplate object

参数解释:

节点池配置模板

约束限制:

不涉及

disruption

否

disruption object

参数解释:

节点池缩容配置

约束限制:

不涉及

limits

否

Map<String, Quantity> object

参数解释:

限制节点池可以消耗的最大资源量。

说明:

Karpenter 的资源分配是高度并行的。因此,限制检查最终是一致的,这可能导致在快速扩展期间出现资源超限的情况。

约束限制:

不涉及

weight

否

int

参数解释:

节点池权重,扩容时优先从权高的节点池中扩容机器

约束限制:

不涉及

取值范围:

1-100

默认取值:

不配置weight默认为0

表31 nodeClaimTemplate

参数

是否必选

参数类型

描述

metadata

否

nodeClaimTemplateMetadata object

参数解释:

节点池配置元数据

约束限制:

不涉及

spec

是

nodeClaimTemplateSpec object

参数解释:

节点池配置模板

约束限制:

不涉及

表32 nodeClaimTemplateMetadata

参数

是否必选

参数类型

描述

labels

否

Map<String,String>

参数解释:

格式为key/value键值对。

  • Key:必须以字母或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符;另外可以使用DNS子域作为前缀,例如example.com/my-key,DNS子域最长253个字符。
  • Value:可以为空或者非空字符串,非空字符串必须以字符或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符。

示例:

"labels": {
      "key": "value"
}

约束限制:

不涉及

annotations

否

Map<String,String>

参数解释:

格式为key/value键值对。

  • Key:必须以字母或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符;另外可以使用DNS子域作为前缀,例如example.com/my-key,DNS子域最长253个字符。
  • Value:可以为空或者非空字符串,无固定字符数限制(受 Pod/CRD 等 API 对象整体大小上限限制,通常为 1MB)

示例:

"annotations": {
     "key": "value"
}

约束限制:

不涉及

表33 nodeClaimTemplateSpec

参数

是否必选

参数类型

描述

requirements

否

Array of nodeSelectorRequirement objects

参数解释:

Nodepool 节点约束配置

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

nodeClassRef

是

NodeClassReference object

参数解释:

NodePool节点池依赖使用的nodeClass配置

约束限制:

仅支持配置kind为CCENodeClass、group为karpenter.k8s.cce类型的资源对象。

取值范围:

不涉及

默认取值:

不涉及

taints

否

Array of Taint objects

参数解释:

配置需要给节点资源添加的k8s node taints

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

startupTaints

否

Array of Taint objects

参数解释:

配置节点启动taints。Karpenter会以当列表中的taints从k8s node移除作为节点弹性完成的判断标准之一。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

terminationGracePeriod

否

String

参数解释:

缩容时,节点优雅删除的时间。如果缩容耗时超过该时间,会通过删除pod的方式排空节点

约束限制:

不涉及

取值范围:

支持的时间单位:s、m、h

默认取值:

不配置时,会无限等待节点的pod被正常驱逐排空。

expireAfter

否

String

参数解释:

节点的过期时间

约束限制:

不涉及

取值范围:

“Never”、或者是以s、m、h为单位的时间

默认取值:

720h,如不希望节点过期删除,可配置参数值为“Never”。

表34 disruption

参数

是否必选

参数类型

描述

consolidateAfter

是

String

参数解释:

节点缩容冷却时间。节点持续低于利用率的时间超过该阈值,则会触发节点缩容

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

consolidationPolicy

否

String

参数解释:

节点缩容策略

约束限制:

不涉及

取值范围:

  • WhenEmpty:空节点缩容
  • WhenEmptyOrUnderutilized:空节点或者使用率低时缩容

默认取值:

WhenEmptyOrUnderutilized

budgets

否

Array of budgets objects

参数解释:

缩容规则配置,多项配置冲突时,以最严格的规则处理。

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

表35 budgets

参数

是否必选

参数类型

描述

reason

否

Array of strings

参数解释:

指定该缩容规则适用的场景。

约束限制:

不涉及

取值范围:

  • Empty: 空节点
  • Drifted:节点漂移
  • Underutilized:节点使用率低

默认取值:

如果不配置,默认规则适用所有的缩容的场景

nodes

否

String

参数解释:

指定允许同时处于缩容状态(准备缩容–该节点的pod全部被驱逐的时间范围属于缩容状态)处理状态的节点数目限制

约束限制:

不涉及

取值范围:

支持配置百分数与具体的节点数目,例如20%、2

默认取值:

10%,即该节点池同时被缩容处理的节点最多不超过节点的节点数*10%

schedule

否

String

参数解释:

指定节点池缩容的周期,与duration配合使用;schedule字段配置规范与k8s cronjob资源的schedule规范一致。

约束限制:

若配置了duration,则必须配置schedule

取值范围:

不涉及

默认取值:

不配置时,则缩容操作可随时进行

duration

否

String

参数解释:

指定节点池缩容的每个周期的可持续缩容的时间,与schedule配合使用。

约束限制:

若配置了schedule,则必须配置duration。

取值范围:

不涉及

默认取值:

不涉及

表36 nodeSelectorRequirement

参数

是否必选

参数类型

描述

key

是

String

参数解释:

属性key值

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

operator

是

String

参数解释:

属性操作符

约束限制:

不涉及

取值范围:

支持In、NotIn、Exists、DoesNotExist、Gt、Lt

默认取值:

不涉及

values

是

Array of strings

参数解释:

属性values值

约束限制:

不涉及

取值范围:

  • 操作In、NotIn,values不能为空
  • 操作Exists、DoesNotExist,values必须为空
  • 操作Gt、Lt,values必须为单一值,且是一个整型数据的字符串

默认取值:

不涉及

表37 NodeClassReference

参数

是否必选

参数类型

描述

kind

是

string

参数解释:

NodeClass资源对象类型

约束限制:

不涉及

取值范围:

固定值CCENodeClass

默认取值:

不涉及

name

是

string

参数解释:

NodeClass资源对象名称

约束限制:

不涉及

取值范围:

不涉及

默认取值:

不涉及

group

是

[]string

参数解释:

NodeClass的资源对象分组

约束限制:

不涉及

取值范围:

固定值karpenter.k8s.cce

默认取值:

不涉及

Karpenter节点池服务器机型配置说明

Karpenter NodePool通过配置requirements字段控制该节点池可以创建的服务器机型,配置多项值时,取所有配置项的交集。如果不指定,则说明在该配置上无约束,例如不提供“topology.kubernetes.io/zone”,则支持在任意可用区弹性节点。

图1 ECS Flavor命名规则
表38 requirements参数配置说明

参数

说明

karpenter.sh/capacity-type

服务器销售类型,按需配置“on-demand”、竞价“spot”。

karpenter.k8s.cce/instance-category

服务器主系列。

示例:指定使用“t”、“s”、“c”三个系列的服务器

key: karpenter.k8s.cce/instance-category
operator: In
values: ["t","s","c"]

karpenter.k8s.cce/instance-generation

服务器代数。

示例:指定使用第2代服务器

key: karpenter.k8s.cce/instance-generation
operator: In
values: ["2"]

karpenter.k8s.cce/instance-family

服务器flavor类型。

示例:指定使用t2、s2 flavor类型

key: karpenter.k8s.cce/instance-family
operator: In
values: ["t2","s2"]

karpenter.k8s.cce/instance-type

服务器类型。

示例:指定使用服务器机型“c7.xlarge.4”

key: karpenter.k8s.cce/instance-type
operator: In
values: ["c7.xlarge.4"]

karpenter.k8s.cce/instance-cpu

服务器的vCPU核数。

示例:

  • 指定使用4vCPU或者8vCPU的服务器
    key: karpenter.k8s.cce/instance-cpu
    operator: In
    values: ["4","8"]
  • 指定4及以上vCPU核数所有的机型
    key: karpenter.k8s.cce/instance-cpu
    operator: Gt
    values: ["3"]
  • 指定8及以下vCPU核数所有的机型
    key: karpenter.k8s.cce/instance-cpu
    operator: Lt
    values: ["9"]

karpenter.k8s.cce/instance-memory

服务器的内存量,单位:MiB。

示例:

  • 指定memory大小
    key: karpenter.k8s.cce/instance-memory
    operator: In
    values: ["4096", "8192"]
  • 指定8Gi及以上内存的所有的机型
    key: karpenter.k8s.cce/instance-memory
    operator: Gt
    values: ["8191"]
  • 指定32Gi及以下内存的所有的机型
    key: karpenter.k8s.cce/instance-memory
    operator: Lt
    values: ["32769"]

kubernetes.io/arch

服务器架构,支持配置“arm64”、“amd64”。使用时请配合使用对应的ECS Flavor与OS。

示例:

  • 指定amd64架构服务器
    key: kubernetes.io/arch
    operator: In
    values: ["amd64"]
  • 指定架构为arm64
    key: kubernetes.io/arch
    operator: In
    values: ["arm64"]

topology.kubernetes.io/region

指定region。

示例:指定region为cn-north-4

key: topology.kubernetes.io/region
operator: In
values: ["cn-north-4"]

topology.kubernetes.io/zone

指定可用区zone。

示例:指定zone为cn-north-4a

key: topology.kubernetes.io/zone
operator: In
values: ["cn-north-4a"]

常见扩容场景示例

场景一:指定arm64服务器节点池

选择鲲鹏架构的机型:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: arm-nodepool
spec:
  template:
    spec:
      requirements:
        # 指定节点的os架构为arm64
        - key: kubernetes.io/arch
          operator: In
          values: ["arm64"]
        # 选用鲲鹏架构的机型
        - key: karpenter.k8s.cce/instance-family
          operator: In
          values: ["km1n","km1"]

场景二:指定4vCPU及以上、8Gi内存及以上的“s7”、“s7n”机型

指定使用“s7.xlarge.2”、“s7.2xlarge.2”、“s7.xlarge.4”、“s7.2xlarge.4”、“s7n.xlarge.2”、“s7n.2xlarge.2”、“s7n.xlarge.4”、“s7n.2xlarge.4”:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: s7-nodepool
spec:
  template:
    spec:
      requirements:
        # 指定节点的os架构为amd64
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]
        # 指定使用"s7"、"s7n"
        - key: karpenter.k8s.cce/instance-family
          operator: In
          values: ["s7n", "s7"]
        # 4核及以上cpu
        - key: karpenter.k8s.cce/instance-cpu
          operator: Gt
          values: ["3"]
        # 8Gi及以上内存
        - key: karpenter.k8s.cce/instance-memory
          operator: Gt
          values: ["8191"]

场景三:指定服务器可用区

指定服务器可用区为“cn-north-4a”、“cn-north-4b”:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: zone-nodepool
spec:
  template:
    spec:
      requirements:
        # 指定服务器可用区:cn-north-4a、cn-north-4b
        - key: topology.kubernetes.io/zone
          operator: In
          values: ["cn-north-4a", "cn-north-4b"]
        # 指定使用该可用区销售的服务器机型"s7"、"s7n"
        - key: karpenter.k8s.cce/instance-family
          operator: In
          values: ["s7n", "s7"]

缩容场景说明

Karpenter在三种场景下会对集群中的节点池的节点进行缩容:节点资源利用率低(Consolidation)、Karpenter节点池存量节点与节点池实际配置不一致(Drift)、节点超期(Expiration)。

Consolidation(节点资源利用率低)

节点资源利用率较低时,Karpenter会通过缩容节点的方式提高集群的资源利用率。可以通过配置NodePool.Spec.Disruption.ConsolidationPolicy选择该节点池节点的缩容策略。

  • WhenEmpty:该节点池的节点只有在空节点场景下会被缩容。
  • WhenEmptyOrUnderutilized:该节点池的节点在空节点或者是节点上的业务Pod可以迁移到集群中的其余节点上时产生缩容。

如果集群中存在多个节点资源利用率比较低,Karpenter会评估其“删除代价”,并对“删除代价”比较低的节点优先缩容。“删除代价”的计算由节点上的Pod数目、Pod的优先级、节点的超期时间等因素总和评估。

ConsolidationPolicy字段的默认值为“WhenEmptyOrUnderutilized”,若不配置,请确认默认值是否符合预期。可以通过配置NodePool.Spec.Disruption.Budgets字段控制节点缩容发生的时间段,该配置仅能控制“Consolidation”与“Drift”两类场景下的节点缩容,暂不支持对Expiration场景的缩容。

Drift(节点配置漂移)

Karpenter NodePool Spec与CCENodeClass Spec资源中定义了对机型的限制要求,这些限制可能会随着时间而变化。例如,用户在创建了NodePool之后,会通过编辑该NodePool Spec以使从NodePool弹出的机器节点中添加或删除标签或污点,或者是编辑CCENodeClass Spec更新该节点池的子网、运行时、OS等信息。Drift功能则是为了让NodePool/CCENodeClass的存量节点的配置与NodePool/CCENodeClass保持一致,如果实际机器的配置与目标配置不一致,该节点将会被标记为Drift状态,Drift状态的节点将会被新建节点替换。

请谨慎编辑NodePool与CCENodeClass资源对象,以防不符合预期的Drift发生。

NodePool与CCENodeClass的配置字段分成三类:

  • Static:该类字段一旦更新,从该节点池弹性创建出的存量Node全部会被标记为Drift状态。
  • Dynamic:该类字段变动需要动态判断;例如Requirement中原本配置为:karpenter.k8s.cce/instance-type In [m5.large.2] ;后面改为karpenter.k8s.cce/instance-type In [m5.large.2, m5.2xlarge.4] 配置虽然更新了,但是存量的节点仍旧符合要求,则不需要将节点更新为Drift;反之如果存量的节点的配置不满足新的配置要求,则会将节点的状态更新为Drift。
  • Behavioral:这一类字段是属于节点池的配置,与节点的配置无关,不会引起Drift。

以下是NodePool与CCENodeClass的字段分类详情:

  • nodepool.spec Drift字段分类:

    字段

    类型

    template.metadata.labels

    Static

    template.metadata.annotations

    Static

    template.spec.taints

    Static

    template.spec.startupTaints

    Static

    template.spec.requirements

    Dynamic

    例如:配置项从

    key: karpenter.k8s.cce/instance-type
    operator: In
    values: ["c7.xlarge.4", "c7.xlarge.8"]

    更新为

    key: karpenter.k8s.cce/instance-type
    operator: In
    values: ["c7.xlarge.4", "s7.xlarge.4"]

    那么存量节点所有属于c7.xlarge.8机型的节点将会被标记Drift,属于c7.xlarge.4机型的节点不会被Drift。

    template.spec.nodeClassRef

    Static

    template.spec.expireAfter

    Static

    template.spec.terminationGracePeriod

    Static

    limits

    Behavioral

    weight

    Behavioral

    disruption

    Behavioral

  • CCENodeClass.spec drift字段分类:

    字段

    类型

    imsSelector

    Static

    login

    Behavioral

    rootVolume

    Static

    dataVolumes

    Static

    storage

    Static

    publicIP

    Behavioral

    nodeNicSpec

    Behavioral

    userTags

    Behavioral

    serverEnterpriseProjectID

    Behavioral

    runtime

    Static

    initializedConditions

    Behavioral

    hostnameConfig

    Behavioral

    waitPostInstallFinish

    Behavioral

    extendParam

    Behavioral

    kubelet

    Static

Expiration(节点超期)

节点超期特性适用于希望能够周期性对节点做升级的场景,例如周期性更新节点OS等。Expire是强制性的操作,节点的超期时间一到会立刻被删除。

expireAfter默认值为720h,若不配置,请确认默认值是否符合预期。

常用缩容场景示例

场景一:不启用Expiration,不启用Drifted,启用Empty Consolidation

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: worker-pool
spec:
  disruption:
    consolidationPolicy: WhenEmpty
    budgets:
      - nodes: 0
        reasons: [Drifted]  # 不对Drifted场景缩容节点
      - nodes: "100%"
        reasons: [Empty]  # 空节点随时可缩容

场景二:启用Expiration,启用Drifted,启用EmptyOrUnderutilized Consolidation

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: worker-pool
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    budgets:
      - nodes: 10%
      # 周一到周五9am开始,持续8h,不做Drift缩容
      - nodes: "0"
        schedule: "0 9 * * mon-fri"
        duration: 8h
        reasons: [Drifted]
      # 其他时间将进行Drift缩容,并发缩容量最多为该节点池节点数*10%
      - nodes: "10%"
        reasons: [Drifted]
      # 不限制WhenEmptyOrUnderutilized缩容时间,并发缩容量最多20个
      - nodes: 20
        reasons: [Empty, Underutilized]

配置多规格优先级

规格的优先级由规格价格决定,价格越低的规格优先级越高。支持通过创建自定义资源NodeOverlay修改某个规格的价格来控制优先级。

  1. 执行以下命令,创建NodeOverlay对象的YAML文件。

    vim nodeoverlay.yaml 

    文件内容如下:

    apiVersion: karpenter.sh/v1alpha1
    kind: NodeOverlay
    metadata:
      name: s6xlarge2-overlay
    spec:
      price: "0.75"
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values:
            - on-demand
        - key: karpenter.k8s.cce/instance-type
          operator: In
          values:
            - s6.xlarge.2

  2. 执行以下命令,创建NodeOverlay对象。

    kubectl create -f nodeoverlay.yaml 

    回显结果如下:

    nodeoverlay.karpenter.sh/s6xlarge2-overlay created

  3. 执行以下命令,查看NodeOverlay对象是否已经正常创建。

    kubectl get nodeoverlay 

    回显结果如下,则说明名为“s6xlarge2-overlay”的NodeOverlay对象已正常创建。

    NAME                AGE 
    s6xlarge2-overlay   20s

EKS迁移至CCE指导

NodePool修改样例

NodePool为Karpenter社区的核心资源,需要修改的部分较少,具体可参考如下示例进行修改。

apiVersion: karpenter.sh/v1  # 无需修改,与karpenter社区一致
kind: NodePool  # 无需修改,与karpenter社区一致
metadata:
  annotations:
    karpenter.sh/nodepool-hash: '4982684901400657622'  # 由karpenter-core计算得到,不需要修改
    karpenter.sh/nodepool-hash-version: v3  # 由karpenter-core计算得到,不需要修改
  creationTimestamp: '2025-01-15T02:45:07Z'
  generation: 1
  labels:  # 基于用户需要进行修改,CCE默认不设置
    app.kubernetes.io/managed-by: eks
  name: system  # 用户自定义
  resourceVersion: '3512'
  uid: cffb7a0f-f13f-4391-bf57-87e5febc9866
spec:
  disruption:  # 此处CCE与EKS没有区别,用户按照实际需求修改即可
    budgets:
      - nodes: 10%
    consolidateAfter: 30s
    consolidationPolicy: WhenEmptyOrUnderutilized
  template:
    metadata: {}
    spec:
      expireAfter: 336h  # 此处CCE与EKS没有区别,用户按照实际需求修改即可
      nodeClassRef:
        group: eks.amazonaws.com  # 修改为karpenter.k8s.cce
        kind: NodeClass  # 修改为CCENodeClass
        name: default  # 用户按照实际自建的CCENodeClass名称修改即可
      requirements:
        - key: karpenter.sh/capacity-type  # 不需要修改,该key和value值CCE也支持
          operator: In
          values:
            - on-demand
        - key: eks.amazonaws.com/instance-category  # 使用karpenter.k8s.cce/instance-category代替,values修改为CCE真正支持的节点类型,参考Karpenter节点池服务器机型配置说明章节
          operator: In
          values:
            - c
            - m
            - r
        - key: eks.amazonaws.com/instance-generation  # 使用karpenter.k8s.cce/instance-generation代替,values修改为CCE真正支持的节点类型,参考Karpenter节点池服务器机型配置说明章节
          operator: Gt
          values:
            - '4'
        - key: kubernetes.io/arch  # 不需要修改,kubernetes原生字段,CCE也支持
          operator: In
          values:
            - amd64
            - arm64
        - key: kubernetes.io/os  # 不需要修改,kubernetes原生字段,CCE也支持
          operator: In
          values:
            - linux
      taints:  # 用户基于实际需求自定义
        - effect: NoSchedule
          key: CriticalAddonsOnly
      terminationGracePeriod: 24h0m0s

NodeClass迁移至CCENodeClass样例

CCENodeClass是CCE节点模板的定义,需要关注其中spec字段的变化。

apiVersion: eks.amazonaws.com/v1  # 修改为karpenter.k8s.cce/v1
kind: NodeClass  # 修改为CCENodeClass
metadata:
  creationTimestamp: '2025-01-15T02:45:07Z'
  generation: 1
  labels:  # 用户自定义即可
    app.kubernetes.io/managed-by: eks
  name: default
  resourceVersion: '880'
  uid: c784a69b-f32e-4123-bb85-628cce9bec91
spec:  # 此处都需要修改,EKS与CCE字段的定义方式不同,具体可参考本文档中的spec参数配置说明表格
  imsSelector:
    imsName: Huawei Cloud EulerOS 2.0
  login:
    userPassword:
      password: 'xxx'
      username: root
  rootVolume:
    hw:passthrough: true
    size: 50
    volumetype: SAS
  dataVolumes:
    - hw:passthrough: true
      size: 100
      volumetype: SAS
  storage:
    storageGroups:
      - cceManaged: true
        name: vgpaas
        selectorNames:
          - cceUse
        virtualSpaces:
          - lvmConfig:
              lvType: linear
            name: share
            size: 100%
    storageSelectors:
      - matchLabels:
          count: "1"
          size: "100"
          volumeType: SAS
        name: cceUse
        storageType: evs

相关文档