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和节点资源状态。
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在右侧找到Karpenter插件,单击“安装”。
- 在安装插件页面,根据需求选择“规格配置”。CCE根据集群规模提供三种“系统预置规格”,您可根据自身需求进行选择,系统会根据不同的预置规格配置插件的实例数及资源配额,具体配置值请以控制台显示为准。
- 设置“委托配置”。 插件在运行时需要访问其他云服务资源,需要您通过委托配置授权插件对各类云服务资源进行操作。详情请参见插件自定义委托说明。
- 使用系统推荐委托:自动创建该插件的默认委托并使用,默认委托如果已存在则不会重复创建。
- 使用已有委托:在选择委托的下拉列表中选择创建的委托。请确保已对创建的自定义委托授予了必需的权限,否则插件功能可能无法正常使用。
- 设置“CBC终端节点配置”,使用Karpenter插件时需要通过CBC终端节点对接费用中心。如果未配置CBC终端节点,请先创建后再刷新查看终端节点最新状态。
- 设置插件实例的部署策略。
- 调度策略对于DaemonSet类型的插件实例不会生效。
- 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
表1 插件调度配置 参数
参数说明
多可用区部署
- 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区下的不同节点。
- 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
- 强制模式:插件Deployment实例强制调度到不同可用区的节点上,每个可用区下最多运行一个实例。如集群下节点不满足多可用区,插件实例将无法全部运行。节点故障后,插件实例存在无法迁移风险。
节点亲和
容忍策略
容忍策略与节点的污点能力配合使用,允许(不强制)插件的Deployment实例调度到带有与之匹配的污点的节点上,也可用于控制插件的Deployment实例所在的节点被标记污点后插件的Deployment实例的驱逐策略。
插件会对实例添加针对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。
详情请参见设置容忍策略。
- 单击“安装”。
组件说明
| 容器组件 | 说明 | 资源类型 |
|---|---|---|
| karpenter-provider-cce | 负责监听集群中Pending Pod的状态,聚合其资源申请量,并根据NodePool和CCENodeClass的配置做出弹性节点决策,创建或删除节点。 | Deployment |
使用Karpenter实现节点弹性伸缩
使用Karpenter实现节点弹性伸缩需要完成以下3个步骤:
- 创建CCENodeClass资源对象:定义弹性节点的模板,包括OS镜像、登录方式、磁盘配置、网络配置等。
- 创建NodePool资源对象:定义节点池的约束和策略,包括机型约束、缩容策略、过期时间等,并引用上一步创建的CCENodeClass。
- 创建业务工作负载:创建Pending Pod以触发Karpenter扩容,并验证节点是否成功创建。
以下内容将分别介绍具体操作流程。
步骤一:创建CCENodeClass资源对象
CCENodeClass用于定义Karpenter弹性节点的模板配置,包括OS镜像、登录方式、磁盘、网络、运行时等。Karpenter在扩容时会根据该模板创建ECS节点。
- 执行以下命令,创建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" - 执行以下命令,创建CCENodeClass对象。
kubectl create -f ccenodeclass.yaml
回显结果如下:
ccenodeclass.karpenter.k8s.cce/cce-nodeclass-1 created
- 执行以下命令,查看CCENodeClass对象是否已经正常创建。
kubectl get ccenodeclass
回显结果如下,则说明名为“cce-nodeclass-1”的CCENodeClass对象已正常创建。
NAME AGE cce-nodeclass-1 20s
步骤二:创建NodePool资源对象
NodePool用于定义Karpenter节点池的约束和策略,包括机型约束、缩容策略、过期时间等,并引用上一步创建的CCENodeClass作为节点模板。Karpenter在扩容时会根据NodePool中的requirements字段选择符合条件的ECS规格创建节点。
- 执行以下命令,创建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 - 执行以下命令,创建NodePool对象。
kubectl create -f nodepool.yaml
回显结果如下:
nodepool.karpenter.sh/karpenter-nodepool-1 created
- 执行以下命令,查看NodePool对象是否已经正常创建。
kubectl get nodepool
回显结果如下,则说明名为“karpenter-nodepool-1”的NodePool对象已正常创建。
NAME AGE karpenter-nodepool-1 20s
步骤三:创建业务工作负载并验证扩容
创建一个Pending Pod以触发Karpenter扩容。这里以创建一个nginx应用为例,该应用申请一定量的CPU和内存资源,集群中现有节点资源不足以调度该Pod,从而触发Karpenter自动扩容。
- 执行以下命令,创建业务工作负载的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 - 执行以下命令,创建业务工作负载。
kubectl create -f deployment.yaml
回显结果如下:
deployment.apps/nginx-deployment created
- 验证扩容结果。
创建工作负载后,由于集群中现有节点资源不足以调度该Pod,Pod将处于Pending状态,Karpenter会自动触发扩容创建新节点。本步骤用于检查Karpenter是否成功扩容节点并完成Pod调度。
- 执行以下命令,查看Pod状态。
kubectl get pod
回显结果如下,Pod的“STATUS”从“Pending”变为“Running”,则说明Karpenter已成功扩容节点并将Pod调度到新节点上。
NAME READY STATUS RESTARTS AGE nginx-deployment-5c689b8d6f-abc12 1/1 Running 0 2m
- 执行以下命令,查看集群节点是否已新增。
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
- 执行以下命令,查看Pod状态。
参数说明
CCENodeClass参数说明
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| kind | 是 | String | 参数解释: API类型 约束限制: 该值不可修改 取值范围: 不涉及 默认取值: CCENodeClass |
| apiVersion | 是 | String | 参数解释: API版本 约束限制: 该值不可修改 取值范围: 不涉及 默认取值: karpenter.k8s.cce/v1 |
| metadata | 是 | CCENodeClassMetadata object | 参数解释: metadata是对象的元数据定义,是集合类的元素类型,包含一组由不同名称定义的属性。 约束限制: 不涉及 |
| spec | 是 | CCENodeClassSpec object | 参数解释: spec是集合类的元素类型,用户对需要管理的节点对象进行详细描述的主体部分都在spec中给出。系统通过spec的描述来创建节点。 约束限制: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| name | 是 | String | 参数解释: 节点名称 约束限制:
取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| imsSelector | 是 | ImsSelector object | 参数解释: 节点的OS信息 约束限制: 不涉及 |
| login | 否 | Login object | 参数解释: 节点的登录方式。不配置将保留所选择镜像的密码,为了保证您的正常使用,请确保所选择镜像中已经设置了密码。 约束限制: 不涉及 |
| rootVolume | 是 | Volume object | 参数解释: 节点的磁盘信息。 约束限制: 不涉及 |
| dataVolumes | 否 | Array of Volume objects | 参数解释: 节点的数据盘参数。针对专属云节点,参数解释与rootVolume一致。 约束限制:
|
| storage | 否 | Storage object | 参数解释: 磁盘初始化配置管理参数。 该参数配置逻辑较为复杂,详细说明请参见节点磁盘挂载。 约束限制:
取值范围: 不涉及 默认取值: 不涉及 |
| publicIP | 否 | NodePublicIP object | 参数解释: 节点的弹性公网IP。 约束限制: 创建节点池添加节点时不支持该参数。 |
| nodeNicSpec | 否 | NodeNicSpec object | 参数解释: 节点的网卡信息。 约束限制: 不涉及 |
| waitPostInstallFinish | 否 | Boolean | 参数解释: 该参数用于控制创建节点时 post-install脚本执行完成前允许节点调度 行为。当该参数未设置或者为false时,在kubernetes节点就绪时,容器即可被调度到可用节点。当该参数为true时,在kubernetes节点就绪时且post-install脚本执行完成时,容器才可被调度到可用节点。 约束限制: 不涉及 取值范围:
默认取值: false |
| ecsGroupId | 否 | String | 参数解释: 云服务器组ID,若指定,将节点创建在该云服务器组下。 约束限制: 创建、更新节点池时该配置不会生效,若要保持节点池中的节点都在同一个云服务器组内,请在节点池 nodeManagement 字段中配置。 取值范围: 不涉及 默认取值: 不涉及 |
| userTags | 否 | Array of UserTag objects | 参数解释: 云服务器标签(资源标签)。字段使用场景:在节点创建场景下,支持指定初始值,查询时不返回该字段;在节点池场景下,创建节点池时节点模板参数中支持指定初始值,查询时支持返回该字段;在其余场景下,查询时都不会返回该字段。 约束限制: 键必须唯一,CCE支持的最大用户自定义标签数量依region而定,自定义标签数上限为8个。 |
| runtime | 否 | Runtime object | 参数解释: 容器运行时, 默认场景:
约束限制: 不涉及 |
| initializedConditions | 否 | Array of strings | 参数解释: 自定义初始化标记,默认值为空。 CCE节点在初始化完成之前,会打上初始化未完成污点(node.cloudprovider.kubernetes.io/uninitialized)防止pod调度到节点上。用户在创建节点时,可以通过设置initializedConditions参数,控制污点的移除时间(默认不设置超时时间)。 使用示例如下:
status:
conditions:
- type: CCEInitial
status: 'True'
- type: CustomedInitial
status: 'True' 约束限制:
|
| 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相关配置 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| imsName | 否 | String | 参数解释: 节点的操作系统类型。具体支持的操作系统请参见节点操作系统说明。 说明: imsName和imsId必须配置其中一个。 约束限制:
取值范围: 不涉及 默认取值: 不涉及 |
| imsId | 否 | String | 参数解释: 节点自定义镜像ID,从IMS控制台获取,需要使用自定义镜像时使用此参数。 说明: imsName和imsId必须配置其中一个。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| sshKey | 否 | String | 参数解释: 选择密钥对方式登录时的密钥对名称。 约束限制: 仅支持账号密钥对,不支持私有密钥对。账号/私有密钥对的区别详情请参见创建密钥对。 取值范围: 不涉及 默认取值: 不涉及 |
| userPassword | 否 | UserPassword object | 参数解释: 选择密码方式登录时的账号密码信息,之后可通过此账号密码登录节点。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| username | 否 | String | 参数解释: 登录账号,默认为“root”。 约束限制: 不涉及 取值范围: 不涉及 默认取值: root |
| password | 是 | String | 参数解释: 登录密码,若创建节点通过用户名密码方式,即使用该字段,则响应体中该字段作屏蔽展示。 约束限制: 创建节点时password字段需要加盐加密,具体方法请参见创建节点时password字段加盐加密。 取值范围: 密码复杂度要求:
默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| size | 是 | Integer | 参数解释: 磁盘大小,单位为GiB。 约束限制: 不涉及 取值范围:
从v1.28版本集群开始,系统盘取值范围支持20~1024GiB 默认取值: 不涉及 |
| volumetype | 是 | String | 参数解释: 磁盘类型,取值请参见创建云服务器 中“root_volume字段数据结构说明”。 约束限制: 不涉及 取值范围:
了解不同磁盘类型的详细信息,请参见磁盘类型及性能介绍。 默认取值: 不涉及 |
| iops | 否 | Integer | 参数解释: 给云硬盘配置iops。 约束限制:
取值范围: 了解GPSSD2、ESSD2类型的iops大小范围,请参见云硬盘类型及性能介绍。 默认取值: 不涉及 |
| throughput | 否 | Integer | 参数解释: 给云硬盘配置吞吐量,单位是MiB/s。 约束限制:
取值范围: 了解GPSSD2类型的吞吐量大小范围,请参见云硬盘类型及性能介绍。 默认取值: 不涉及 |
| extendParam | 否 | Map<String,Object> | 参数解释: 磁盘扩展参数,取值请参见创建云服务器中“extendparam”参数的描述。 详情请参见创建磁盘的extendparam字段数据结构说明。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| hw:passthrough | 否 | Boolean | 参数解释:
约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| metadata | 否 | VolumeMetadata object | 参数解释: 云硬盘加密信息,仅在创建节点系统盘或数据盘需加密时须填写。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| __system__encrypted | 否 | String | 参数解释: 表示云硬盘加密功能的字段,'0'代表不加密,'1'代表加密。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 该字段不存在时,云硬盘默认为不加密。 |
| __system__cmkid | 否 | String | 参数解释: 用户主密钥ID,是metadata中的表示加密功能的字段,与__system__encrypted配合使用。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| storageSelectors | 是 | Array of StorageSelectors objects | 参数解释: 磁盘选择,根据matchLabels和storageType对匹配的磁盘进行管理。磁盘匹配存在先后顺序,靠前的匹配规则优先匹配。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| storageGroups | 是 | Array of StorageGroups objects | 参数解释: 由多个存储设备组成的存储组,用于各个存储空间的划分。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| name | 是 | String | 参数解释: selector的名字,作为storageGroup中selectorNames的索引。 约束限制: 各个selector间的名字不能重复。 取值范围: 不涉及 默认取值: 不涉及 |
| storageType | 是 | String | 参数解释: 存储类型。 约束限制:
取值范围: 当前仅支持evs(云硬盘)、local(本地盘)和system(系统盘)。 默认取值: 不涉及 |
| matchLabels | 否 | matchLabels object | 参数解释: evs盘的匹配字段。 约束限制: storageType设置为system(系统盘)时,无需设置此字段。 取值范围: 支持DataVolume中的size、volumeType、iops、throughput、metadataEncrypted、metadataCmkid、count字段。 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| 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 | 参数解释: 磁盘选择个数,不填则选择所有此类磁盘。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| name | 是 | String | 参数解释: storageGroups的名字,作为虚拟存储组的名字,因此各个group名字不能重复。 约束限制: 不涉及 取值范围:
默认取值: 不涉及 |
| 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中空间配置的详细管理。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| name | 是 | String | 参数解释: virtualSpace的名称,当前仅支持四种类型:share、kubernetes、runtime、user。 约束限制: 不涉及 取值范围:
默认取值: 不涉及 |
| size | 是 | String | 参数解释: virtualSpace的大小,仅支持整数百分比。例如:90%。 约束限制:
取值范围: 1% ~ 100% 默认取值: 不涉及 |
| lvmConfig | 否 | LVMConfig object | 参数解释: lvm配置管理,适用于share、kubernetes和user空间配置。 约束限制: 一个virtualSpace仅支持一个config配置。 取值范围: 不涉及 默认取值: 不涉及 |
| runtimeConfig | 否 | RuntimeConfig object | 参数解释: runtime配置管理,适用于运行时空间配置。 约束限制: 一个virtualSpace仅支持一个config配置。 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| 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/ 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| lvType | 是 | String | 参数解释: LVM写入模式:linear、striped。linear:线性模式;striped:条带模式,使用多块磁盘组成条带模式,能够提升磁盘性能。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| eip | 否 | NodeEIPSpec object | 参数解释: 弹性IP参数。 约束限制: 创建节点池时不支持此参数 |
| bandwidth | 否 | NodeBandwidth object | 参数解释: 弹性IP的带宽参数 约束限制: 该参数仅给节点池使用 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| iptype | 是 | String | 参数解释: 弹性IP类型,取值请参见申请EIP接口中publicip.type说明。 详情请参见申请EIP。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| bandwidth | 否 | NodeBandwidth object | 参数解释: 弹性IP的带宽参数。 约束限制: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| chargemode | 否 | String | 参数解释: 带宽的计费类型。
约束限制: 不涉及 取值范围:
默认取值: 不涉及 |
| size | 否 | Integer | 参数解释: 带宽大小,取值请参见申请EIP接口中bandwidth.size说明。 详情请参见申请EIP。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| sharetype | 否 | String | 参数解释: 带宽的共享类型,共享类型枚举:PER,表示独享,目前仅支持独享。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| primaryNic | 否 | NicSpec object | 参数解释: 主网卡的描述信息。 约束限制: 不涉及 |
| extNics | 否 | Array of NicSpec objects | 参数解释: 扩展网卡。 约束限制: 创建节点池添加节点时不支持该参数。 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| subnetId | 否 | String | 参数解释: 网卡所在子网的网络ID。若节点池同时配置了subnetList,则节点池扩容子网以subnetList字段为准。 约束限制:
取值范围: 不涉及 默认取值: 不涉及 |
| subnetList | 否 | Array of strings | 参数解释: 网卡所在子网的网络ID列表,支持节点池配置多个子网。 约束限制: 最多支持配置20个子网。 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| key | 是 | String | 参数解释: K8s污点的键。 约束限制: 必须以字母或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符。 取值范围: 不涉及 默认取值: 不涉及 |
| value | 否 | String | 参数解释: K8s污点的值。 约束限制: 必须以字母或数字开头和结尾,可以包含字母、数字、连字符、下划线和点,最长63个字符。 取值范围: 不涉及 默认取值: 不涉及 |
| effect | 是 | String | 参数解释: K8s污点的作用效果。 约束限制: 不涉及 取值范围: 只可选NoSchedule,PreferNoSchedule或NoExecute。 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| key | 否 | String | 参数解释: 云服务器标签的键。 约束限制: 不得以"CCE-"、"__type_baremetal"或"_sys_"开头。 取值范围: 标签键不能重复,首尾不能为空,不能包含特殊字符"=","*",“<”,“>”,“\”,“,”,“|”,“/”,不能包含非打印字符ASCII(0-31),长度不超过128个字符。 默认取值: 不涉及 |
| value | 否 | String | 参数解释: 云服务器标签的值。 约束限制: 不涉及 取值范围: 标签值首尾不能为空,不能包含特殊字符"=","*",“<”,“>”,“\”,“,”,“|”,不能包含非打印字符ASCII(0-31),长度不超过255个字符。 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| name | 否 | String | 参数解释: 容器运行时。 约束限制: 不涉及 取值范围: 不涉及 默认取值:
|
| runtimeClass | 否 | String | 参数解释: 容器运行时子类别。 约束限制: 仅CCE Turbo集群下弹性云服务器-物理机类型节点且上级运行时为containerd场景支持使用安全运行时。 取值范围:
默认取值: runc |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| alpha.cce/preInstall | 否 | String | 参数解释: 安装前执行脚本。 输入的值需要经过Base64编码,方法如下: echo -n "待编码内容" | base64 约束限制: 安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。 取值范围: 不涉及 默认取值: 不涉及 |
| alpha.cce/postInstall | 否 | String | 参数解释: 安装后执行脚本。 输入的值需要经过Base64编码,方法如下: echo -n "待编码内容" | base64 约束限制: 安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| type | 是 | String | 参数解释: K8S节点名称配置类型, 默认为“privateIp”。 约束限制:
取值范围:
默认取值: 默认为“privateIp”。 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| maxPods | 否 | Integer | 参数解释: 节点最大允许创建的实例数(Pod),该数量包含系统默认实例。 该设置的目的为防止节点因管理过多实例而负载过重,请根据您的业务需要进行设置。 节点可以创建多少个Pod,受多个参数影响,具体请参见节点可创建的最大Pod数量说明。 约束限制: 不涉及 取值范围: 通用取值范围为16~256,节点运行时子类别为安全运行时v2(kuasar-vmm)场景取值范围为16~1024。 默认取值: 不涉及 |
| dockerBaseSize | 否 | Integer | 参数解释: 节点上单容器的可用磁盘空间大小(已废弃,请优先使用containerBaseSize参数),单位G。 CCE节点容器运行时空间配置请参考默认数据盘空间分配说明。 约束限制:
取值范围: 10-500。 默认取值: 不配置该值或值为0时将使用默认值:
|
| containerBaseSize | 否 | Integer | 参数解释: 节点上单容器的可用磁盘空间大小,单位G。 CCE节点容器运行时空间配置请参考默认数据盘空间分配说明。 约束限制:
取值范围: 10-500。 默认取值: 不配置该值或值为0时将使用默认值:
|
| systemReserved | 否 | Map<String, String> | 参数解释: 节点系统预留资源配置 示例: {
"cpu": "35m",
"ephemeral-storage": "1Gi",
"memory": "600Mi",
"pid": "100"
} 约束限制: 不涉及 取值范围:
默认取值: 不涉及 |
| kubeReserved | 否 | Map<String, String> | 参数解释: 节点Kubernetes相关组件预留资源配置 示例: {
"cpu": "35m",
"ephemeral-storage": "1Gi",
"memory": "600Mi",
"pid": "100"
} 约束限制: 不涉及 取值范围:
默认取值: 不涉及 |
NodePool参数说明
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| kind | 是 | String | 参数解释: API类型 约束限制: 该值不可修改 取值范围: 不涉及 默认取值: NodePool |
| apiVersion | 是 | String | 参数解释: API版本 约束限制: 该值不可修改 取值范围: 不涉及 默认取值: karpenter.sh/v1 |
| metadata | 是 | NodePoolMetadata object | 参数解释: metadata是对象的元数据定义,是集合类的元素类型,包含一组由不同名称定义的属性。 约束限制: 不涉及 |
| spec | 是 | NodePoolSpec object | 参数解释: spec是集合类的元素类型,用户对需要管理的节点池对象进行详细描述的主体部分都在spec中给出。系统通过spec的描述来创建节点。 约束限制: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| name | 是 | String | 参数解释: 节点池名称 约束限制:
取值范围: 不涉及 默认取值: 不涉及 |
| annotations | 否 | Map<String,String> | 参数解释: 格式为key/value键值对。
示例: "annotations": {
"key": "value"
} 约束限制: 不涉及 取值范围: 按需以及竞价实例支持使用如下注解配置多规格扩容时的优先级策略:
按需实例支持的策略如下:
竞价计费支持的策略如下:
默认值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| template | 是 | nodeClaimTemplate object | 参数解释: 节点池配置模板 约束限制: 不涉及 |
| disruption | 否 | disruption object | 参数解释: 节点池缩容配置 约束限制: 不涉及 |
| limits | 否 | Map<String, Quantity> object | 参数解释: 限制节点池可以消耗的最大资源量。 说明: Karpenter 的资源分配是高度并行的。因此,限制检查最终是一致的,这可能导致在快速扩展期间出现资源超限的情况。 约束限制: 不涉及 |
| weight | 否 | int | 参数解释: 节点池权重,扩容时优先从权高的节点池中扩容机器 约束限制: 不涉及 取值范围: 1-100 默认取值: 不配置weight默认为0 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| metadata | 否 | nodeClaimTemplateMetadata object | 参数解释: 节点池配置元数据 约束限制: 不涉及 |
| spec | 是 | nodeClaimTemplateSpec object | 参数解释: 节点池配置模板 约束限制: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| labels | 否 | Map<String,String> | 参数解释: 格式为key/value键值对。
示例: "labels": {
"key": "value"
} 约束限制: 不涉及 |
| annotations | 否 | Map<String,String> | 参数解释: 格式为key/value键值对。
示例: "annotations": {
"key": "value"
} 约束限制: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| 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”。 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| consolidateAfter | 是 | String | 参数解释: 节点缩容冷却时间。节点持续低于利用率的时间超过该阈值,则会触发节点缩容 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| consolidationPolicy | 否 | String | 参数解释: 节点缩容策略 约束限制: 不涉及 取值范围:
默认取值: WhenEmptyOrUnderutilized |
| budgets | 否 | Array of budgets objects | 参数解释: 缩容规则配置,多项配置冲突时,以最严格的规则处理。 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| reason | 否 | Array of strings | 参数解释: 指定该缩容规则适用的场景。 约束限制: 不涉及 取值范围:
默认取值: 如果不配置,默认规则适用所有的缩容的场景 |
| nodes | 否 | String | 参数解释: 指定允许同时处于缩容状态(准备缩容–该节点的pod全部被驱逐的时间范围属于缩容状态)处理状态的节点数目限制 约束限制: 不涉及 取值范围: 支持配置百分数与具体的节点数目,例如20%、2 默认取值: 10%,即该节点池同时被缩容处理的节点最多不超过节点的节点数*10% |
| schedule | 否 | String | 参数解释: 指定节点池缩容的周期,与duration配合使用;schedule字段配置规范与k8s cronjob资源的schedule规范一致。 约束限制: 若配置了duration,则必须配置schedule 取值范围: 不涉及 默认取值: 不配置时,则缩容操作可随时进行 |
| duration | 否 | String | 参数解释: 指定节点池缩容的每个周期的可持续缩容的时间,与schedule配合使用。 约束限制: 若配置了schedule,则必须配置duration。 取值范围: 不涉及 默认取值: 不涉及 |
| 参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
| key | 是 | String | 参数解释: 属性key值 约束限制: 不涉及 取值范围: 不涉及 默认取值: 不涉及 |
| operator | 是 | String | 参数解释: 属性操作符 约束限制: 不涉及 取值范围: 支持In、NotIn、Exists、DoesNotExist、Gt、Lt 默认取值: 不涉及 |
| values | 是 | Array of strings | 参数解释: 属性values值 约束限制: 不涉及 取值范围:
默认取值: 不涉及 |
Karpenter节点池服务器机型配置说明
Karpenter NodePool通过配置requirements字段控制该节点池可以创建的服务器机型,配置多项值时,取所有配置项的交集。如果不指定,则说明在该配置上无约束,例如不提供“topology.kubernetes.io/zone”,则支持在任意可用区弹性节点。
| 参数 | 说明 |
|---|---|
| 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核数。 示例:
|
| karpenter.k8s.cce/instance-memory | 服务器的内存量,单位:MiB。 示例:
|
| kubernetes.io/arch | 服务器架构,支持配置“arm64”、“amd64”。使用时请配合使用对应的ECS Flavor与OS。 示例:
|
| 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修改某个规格的价格来控制优先级。
- 执行以下命令,创建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 - 执行以下命令,创建NodeOverlay对象。
kubectl create -f nodeoverlay.yaml
回显结果如下:
nodeoverlay.karpenter.sh/s6xlarge2-overlay created
- 执行以下命令,查看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