网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
云手机服务器 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器(旧版)
VR云渲游平台 CVR
Huawei Cloud EulerOS
云化数据中心 CloudDC
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘平台 IEF
CloudPond云服务
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
湖仓构建 LakeFormation
智能数据洞察 DataArts Insight
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
开天aPaaS
应用平台 AppStage
开天企业工作台 MSSE
开天集成工作台 MSSI
API中心 API Hub
云消息服务 KooMessage
交换数据空间 EDS
云地图服务 KooMap
云手机服务 KooPhone
组织成员账号 OrgID
云空间服务 KooDrive
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
区块链
区块链服务 BCS
数字资产链 DAC
华为云区块链引擎服务 HBS
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
价格
成本优化最佳实践
专属云商业逻辑
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
其他
管理控制台
消息中心
产品价格详情
系统权限
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
云服务信任体系能力说明
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
云存储网关 CSG
专属分布式存储服务 DSS
数据工坊 DWR
地图数据 MapDS
键值存储服务 KVS
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
云原生服务中心 OSC
应用服务网格 ASM
华为云UCS
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB
云数据库 GeminiDB
数据管理服务 DAS
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
语音交互服务 SIS
人证核身服务 IVS
视频智能分析服务 VIAS
城市智能体
自动驾驶云服务 Octopus
盘古大模型 PanguLargeModels
IoT物联网
设备接入 IoTDA
全球SIM联接 GSL
IoT数据分析 IoTA
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
企业应用
域名注册服务 Domains
云解析服务 DNS
企业门户 EWP
ICP备案
商标注册
华为云WeLink
华为云会议 Meeting
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMA Exchange
API全生命周期管理 ROMA API
政企自服务管理 ESM
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
数字内容生产线 MetaStudio
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
专属云
专属计算集群 DCC
开发者工具
SDK开发指南
API签名指南
DevStar
华为云命令行工具服务 KooCLI
Huawei Cloud Toolkit
CodeArts API
云化转型
云架构中心
云采用框架
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
我的凭证
华为云公共事业服务云平台
工业软件
工业数字模型驱动引擎
硬件开发工具链平台云服务
工业数据转换引擎云服务

动态资源超卖

更新时间:2025-02-18 GMT+08:00
分享

当前很多业务有波峰和波谷,部署服务时,为了保证服务的性能和稳定性,通常会按照波峰时需要的资源申请,但是波峰的时间可能很短,这样在非波峰时段就有资源浪费。另外,由于在线作业SLA要求较高,为了保证服务的性能和可靠性,通常会申请大量的冗余资源,因此,会导致资源利用率很低、浪费比较严重。

将这些申请而未使用的资源(即申请量与使用量的差值)利用起来,就是资源超卖。超卖资源适合部署离线作业,离线作业通常关注吞吐量,SLA要求不高,容忍一定的失败。

在线作业和离线作业混合部署在Kubernetes集群中将有效的提升集群整体资源利用率。

图1 资源超卖示意图

资源超卖功能特性

说明:

当节点池启用动态资源超卖和弹性伸缩时,由于高优先级应用业务资源使用量实时变化,导致超卖资源变化较快,为了避免节点频繁缩容和扩容,在节点缩容评估时暂不考虑超卖资源。

当前特性支持集群内在离线作业混部以及节点CPU和内存资源超卖,关键特性如下:

  • 离线作业优先使用超卖节点

    若同时存在超卖与非超卖节点,在离线作业调度过程中,超卖节点得分高于非超卖节点,离线作业优先调度到超卖节点。

  • 在线作业预选超卖节点时只能使用其非超卖资源

    在线作业只能使用超卖节点的非超卖资源,离线作业可以使用超卖节点的超卖及非超卖资源。

  • 同一调度周期在线作业先于离线作业调度

    在线作业和离线作业同时存在时,优先调度在线作业。当节点资源使用率超过设定的驱逐上限且节点request值超过100%时,将会驱逐离线作业。

  • 内核提供CPU/内存隔离特性

    CPU隔离:在线作业能够快速抢占离线作业的CPU资源,并压制离线作业的CPU使用。

    内存隔离:系统内存资源用尽触发OOM Kill时,内核优先驱逐离线作业。

  • Kubelet离线作业准入规则

    在调度器将Pod调度到某个节点上之后,Kubelet在启动该Pod之前,会对该Pod进行准入判断,如果此时节点资源无法满足该Pod的Request值,kubelet则拒绝启动该Pod(predicateAdmitHandler.Admit)。满足以下两个条件时,Kubelet准入该Pod:

    • 待启动Pod Request与运行的在线作业Request之和 < 节点Allocatable
    • 待启动Pod Request与运行的在/离线作业Request之和 < 节点Allocatable + 节点超卖资源
  • 支持超卖和混部分离

    开启节点池的混部开关后,默认的混部配置同时打开了混部和超卖功能,节点会被同时打上volcano.sh/colocation="true"和volcano.sh/oversubscription="true"的标签。若只进行在离线作业混部,而不使用超卖资源,需在混部配置中关闭资源超卖特性,关闭超卖特性后volcano.sh/oversubscription="true"标签会被移除。

    开启混部或超卖后可使用的特性组合如下:

    开启混部

    开启超卖

    可以使用超卖资源

    驱逐离线Pod场景

    当节点实际资源使用率超过高水位线时,触发离线Pod驱逐

    当节点实际资源使用率超过高水位线并且节点Pod的Request和大于100%,触发离线Pod驱逐

    当节点实际资源使用率超过高水位线,触发离线Pod驱逐

使用方式

请根据集群版本确定资源超卖使用方式,详情请参见表1

云原生混部资源超卖与兼容模式存在冲突,使用时选择两者中的一种即可。当集群版本不支持云原生混部时,云原生混部里的资源超卖的功能和参数配置均不会生效,若要使用资源超卖功能,请使用kubelet超卖
表1 集群版本与资源超卖功能生效方式对应关系表

集群版本

具体版本号

资源超卖功能生效方式

说明

v1.25以上

-

云原生混部资源超卖

-

v1.25

v1.25.4-r0及以上

云原生混部资源超卖

-

v.1.25.4-r0以前的版本已经使用kubelet超卖,升级至v1.25.4-r0及以上版本

存量节点池:kubelet超卖

新建节点池:云原生混部资源超卖

对于存量的节点池,推荐将kubelet超卖迁移至云原生混部超卖进行统一管理,详情请参见kubelet超卖迁移至云原生混部超卖说明

v1.25.4-r0以下

kubelet超卖

不支持将kubelet超卖能力迁移到云原生混部超卖

v1.23

v1.23.9-r0及以上

云原生混部资源超卖

-

v.1.23.9-r0以前的版本已经使用kubelet超卖,升级至v1.23.9-r0及以上版本

存量节点池:kubelet超卖

新建节点池:云原生混部资源超卖

对于存量的节点池,推荐将kubelet超卖迁移至云原生混部超卖进行统一管理,详情请参见kubelet超卖迁移至云原生混部超卖说明

v1.23.9-r0以下,但需满足集群版本大于等于v1.23.5-r0

kubelet超卖

不支持将kubelet超卖能力迁移到云原生混部超卖

v1.21

v1.21.7-r0及以上

kubelet超卖

-

v1.19

v1.19.16-r4及以上

kubelet超卖

-

开启云原生混部功能后,默认即开启了资源超卖功能,详情请参见云原生混部资源超卖。云原生混部volcano-agent负责超卖资源上报和节点压力驱逐,其核心特性包括CPU/内存压制、动态资源超卖、CPU Burst、出口网络QoS分级控制等。

为了兼容旧版本支持的资源超卖特性,仍然保留了通过人工设置kubelet参数来开启资源超卖的能力,详情请参见kubelet超卖兼容模式(不推荐),但该方案仅支持基础能力,且不再演进,不支持CPU Burst、出口网络QoS分级控制等后续新特性。

云原生混部资源超卖

须知:

规格约束

  • 集群版本:
    • v1.23集群:v1.23.9-r0及以上
    • v1.25集群:v1.25.4-r0及以上
  • 集群类型:CCE Standard集群或CCE Turbo集群。
  • 节点OS:Huawei Cloud EulerOS 2.0
  • 节点类型:x86架构的弹性虚拟机。
  • Volcano插件版本:1.10.0及以上版本。

使用限制

  • 使用超卖特性时,需保证Volcano未启用overcommit插件。
  • 运行中的Pod无法进行在线和离线业务转换,如需转换需要重建Pod。
  • 当节点设置cpu-manager-policy为静态绑核时,不允许将离线Pod设置为Guaranteed的Pod,若需要绑核则需要调整Pod为在线Pod,否则可能会发生离线Pod占用在线Pod的CPU导致在线Pod启动失败,以及离线Pod虽然调度成功但仍然启动失败的情况。
  • 当节点设置cpu-manager-policy为静态绑核时,不应对所有在线Pod进行绑核,否则会出现在线Pod占用了所有的CPU或者memory资源导致上报的超卖资源很少的情况。
  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“节点管理”,在需要开启动态资源超卖的节点池中,单击“更多 > 混部配置”

    确认“节点池混部开关”“资源超卖”开关已打开,详情请参见云原生混部配置

  3. (可选)调整资源超卖参数。

    表2 资源超卖参数

    名称

    说明

    CPU驱逐高水位线(%)

    当节点CPU使用率超过设置值时,触发离线作业驱逐,节点不可调度。

    默认值80,即当节点CPU使用率超过80%时,触发离线作业驱逐。

    CPU驱逐低水位线(%)

    CPU使用率高于高水位线时,触发离线作业驱逐,等到节点CPU使用率低于低水位线后,该节点才会重新接纳离线作业。

    默认值为30,即当节点CPU使用率低于30%后,重新接纳离线作业。

    内存驱逐高水位线(%)

    当节点内存使用率超过设置值时,触发离线作业驱逐,节点不可调度。

    默认值60,即当节点内存使用率超过60%时,触发离线作业驱逐。

    内存驱逐低水位线(%)

    节点内存使用率高于高水位线时,触发离线作业驱逐,等到节点内存利用率低于低水位线后,该节点才会重新接纳离线作业。

    默认值为30,即当节点内存使用率低于30%后,重新接纳离线作业。

  4. 确认Volcano插件配置。

    kubectl edit cm volcano-scheduler-configmap -n kube-system
    在volcano- scheduler-configmap中查看超卖的相关配置如下。同时确保插件配置中不能包含overcommit插件,如果存在(- name: overcommit),则需要删除该配置。
    ...
    data:
      volcano-scheduler.conf: |
        actions: "allocate, backfill, preempt"   #设置preempt action
        tiers:
        - plugins:
          - name: gang
            enablePreemptable: false
            enableJobStarving: false
          - name: priority
          - name: conformance
          - name: oversubscription
        - plugins:
          - name: drf
          - name: predicates
          - name: nodeorder
          - name: binpack
        - plugins:
          - name: cce-gpu-topology-predicate
          - name: cce-gpu-topology-priority
          - name: cce-gpu
    ...

  5. 创建高优、低优priorityClass资源。

    cat <<EOF | kubectl apply -f -
    
    apiVersion: scheduling.k8s.io/v1
    description: Used for high priority pods
    kind: PriorityClass
    metadata:
      name: volcano-production
    preemptionPolicy: PreemptLowerPriority
    value: 999999
    ---
    apiVersion: scheduling.k8s.io/v1
    description: Used for low priority pods
    kind: PriorityClass
    metadata:
      name: volcano-free
    preemptionPolicy: PreemptLowerPriority
    value: -90000
    
    EOF

  6. 部署在离线作业。

    在线、离线作业均需设置schedulerName字段的值为“volcano”,启用Volcano调度器。

    • 对于离线作业,在创建工作负载时,开启“低优业务”,该工作负载会被添加对应的离线作业注解volcano.sh/qos-level: "-1"

      并设置priorityClassName字段为volcano-free:

      kind: Deployment 
      apiVersion: apps/v1 
      spec: 
        replicas: 4 
        template: 
          metadata: 
            annotations: 
              metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' 
              volcano.sh/qos-level: "-1" # 离线作业注解 
          spec: 
            schedulerName: volcano             # 调度器使用Volcano 
            priorityClassName: volcano-free         # 设置volcano-free priorityClass
            ...
    • 对于在线作业,设置priorityClassName字段为volcano-production:
      kind: Deployment 
      apiVersion: apps/v1 
      spec: 
        replicas: 4 
        template: 
          metadata: 
            annotations: 
              metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' 
          spec: 
            schedulerName: volcano          # 调度器使用Volcano 
            priorityClassName: volcano-production   # 设置volcano-production priorityClass
            ...

  7. 通过如下命令可查看当前超卖资源量以及资源使用情况。

    kubectl describe node <nodeIP>
    # kubectl describe node 192.168.0.0 
    Name:             192.168.0.0 
    Roles:              <none> 
    Labels:           ... 
                      volcano.sh/oversubscription=true 
    Annotations:      ... 
                      volcano.sh/oversubscription-cpu: 2335 
                      volcano.sh/oversubscription-memory: 341753856 
    Allocatable: 
      cpu:               3920m 
      memory:            6263988Ki 
    Allocated resources: 
      (Total limits may be over 100 percent, i.e., overcommitted.) 
      Resource           Requests      Limits 
      --------           --------      ------ 
      cpu                 4950m (126%)  4950m (126%) 
      memory             1712Mi (27%)  1712Mi (27%)

kubelet超卖兼容模式(不推荐)

须知:
规格约束
  • 集群版本:
    • v1.19集群:v1.19.16-r4及以上版本
    • v1.21集群:v1.21.7-r0及以上版本
    • v1.23集群:v1.23.5-r0及以上版本
    • v1.25及以上版本
  • 集群类型:CCE Standard集群或CCE Turbo集群。
  • 节点OS:EulerOS 2.9 (内核kernel-4.18.0-147.5.1.6.h729.6.eulerosv2r9.x86_64)或者Huawei Cloud EulerOS 2.0
  • 节点类型:弹性虚拟机。
  • Volcano插件版本:1.7.0及以上版本。
使用限制
  • 使用超卖特性时,需保证Volcano未启用overcommit插件。
  • 修改超卖节点标签不会影响已经运行的pod。
  • 运行中的pod无法进行在线和离线业务转换,如需转换需要重建pod。
  • 集群中有节点配置超卖标签volcano.sh/oversubscription=true时,Volcano插件必须要增加oversubscription配置,否则会导致超卖节点调度异常。标签配置需要由用户保证,调度器不会对插件和节点配置进行检查。详细标签说明请参见表3
  • 超卖特性开关目前不支持统一配置,若要关闭超卖特性,需要同时进行以下操作:
    • 去掉超卖节点的volcano.sh/oversubscription标签。
    • 设置节点池的超卖开关over-subscription-resource为false。
    • 修改Volcano调度器的名字为volcano-scheduler-configmap的configmap,并去掉oversubscription插件。
  • 当节点设置cpu-manager-policy为静态绑核时,不允许将离线Pod设置为Guaranteed的Pod,若需要绑核则需要调整Pod为在线Pod,否则可能会发生离线Pod占用在线Pod的CPU导致在线Pod启动失败,以及离线Pod虽然调度成功但仍然启动失败的情况。
  • 当节点设置cpu-manager-policy为静态绑核时,不应对所有在线Pod进行绑核,否则会出现在线Pod占用了所有的CPU或者memory资源导致上报的超卖资源很少的情况。

集群中有节点配置超卖标签volcano.sh/oversubscription=true时,Volcano插件必须要增加oversubscription配置,否则会导致超卖节点调度异常。相关配置情况如表3所示。

标签配置需要您自行保证,调度器不会对插件和节点配置进行检查。
表3 超卖标签配置调度说明

插件超卖配置

节点超卖标签

调度行为

超卖调度

正常调度

正常调度

无法调度,或者调度失败,应避免这种配置

  1. 使用kubectl连接集群。
  2. 确认Volcano插件配置。

    kubectl edit cm volcano-scheduler-configmap -n kube-system
    在volcano- scheduler-configmap中查看超卖的相关配置如下。同时确保插件配置中不能包含overcommit插件,如果存在(- name: overcommit),则需要删除该配置。
    ...
    data:
      volcano-scheduler.conf: |
        actions: "allocate, backfill, preempt"   #设置preempt action
        tiers:
        - plugins:
          - name: gang
            enablePreemptable: false
            enableJobStarving: false
          - name: priority
          - name: conformance
          - name: oversubscription
        - plugins:
          - name: drf
          - name: predicates
          - name: nodeorder
          - name: binpack
        - plugins:
          - name: cce-gpu-topology-predicate
          - name: cce-gpu-topology-priority
          - name: cce-gpu
    ...

  3. 开启节点超卖特性。

    开启超卖特性的节点,才能配置标签使用超卖资源。相关节点只能在节点池中创建。当前超卖特性开关配置方式如下:

    1. 创建节点池。
    2. 节点池创建完成后,单击节点池名称后的“配置管理”。
    3. 在侧边栏滑出的“配置管理”窗口中,将kubelet组件配置中的“节点超卖特性 (over-subscription-resource)”参数设置为开启,并单击“确定”。

  4. 设置节点超卖标签。

    超卖节点需增加超卖标签volcano.sh/oversubscription。当节点设置该标签并且值为true时,该节点为超卖节点,否则为非超卖节点。

    kubectl label node 192.168.0.0 volcano.sh/oversubscription=true

    节点还支持如下超卖相关的阈值,如表4所示。示例如下:

    kubectl annotate node 192.168.0.0 volcano.sh/evicting-cpu-high-watermark=70

    查询该节点信息:

    # kubectl describe node 192.168.0.0
    Name:             192.168.0.0
    Roles:              <none>
    Labels:           ...
                      volcano.sh/oversubscription=true
    Annotations:      ...
                      volcano.sh/evicting-cpu-high-watermark: 70
    表4 节点超卖Annotations

    名称

    说明

    volcano.sh/evicting-cpu-high-watermark

    CPU使用率高水位线。当节点CPU使用率超过设置值时,触发离线作业驱逐,节点不可调度。

    默认值80,即当节点CPU使用率超过80%时,触发离线作业驱逐。

    volcano.sh/evicting-cpu-low-watermark

    CPU使用率低水位线。CPU使用率高于高水位线时,触发离线作业驱逐,等到节点CPU使用率低于低水位线后,该节点才会重新接纳离线作业。

    默认值为30,即当节点CPU使用率低于30%后,重新接纳离线作业。

    volcano.sh/evicting-memory-high-watermark

    内存使用率高水位线。当节点内存使用率超过设置值时,触发离线作业驱逐,节点不可调度。

    默认值60,即当节点内存使用率超过60%时,触发离线作业驱逐。

    volcano.sh/evicting-memory-low-watermark

    内存使用率低水位线。节点内存使用率高于高水位线时,触发离线作业驱逐,等到节点内存利用率低于低水位线后,该节点才会重新接纳离线作业。

    默认值为30,即当节点内存使用率低于30%后,重新接纳离线作业。

    volcano.sh/oversubscription-types

    超卖资源类型,支持如下三种配置:

    • cpu (超卖CPU)
    • memory (超卖内存)
    • cpu,memory (超卖CPU和内存)

    默认值为“cpu,memory”

  5. 创建高优、低优priorityClass资源。

    cat <<EOF | kubectl apply -f -
     
    apiVersion: scheduling.k8s.io/v1
    description: Used for high priority pods
    kind: PriorityClass
    metadata:
      name: volcano-production
    preemptionPolicy: PreemptLowerPriority
    value: 999999
    ---
    apiVersion: scheduling.k8s.io/v1
    description: Used for low priority pods
    kind: PriorityClass
    metadata:
      name: volcano-free
    preemptionPolicy: PreemptLowerPriority
    value: -90000
     
    EOF

  6. 部署在离线作业,并分别为在离线作业设置priorityClass。

    离线作业需在annotation中增加volcano.sh/qos-level标签以区分其为离线作业,值的范围为-7~7之间的整数,小于0代表低优先级任务,即离线作业,大于等于0代表高优先级任务,即在线作业。在线作业不需要设置该标签。在线、离线作业均需设置schedulerName字段的值为“volcano”,启用Volcano调度器。

    说明:

    在线/在线、离线/离线作业间的优先级暂时未做区分,且未对值的合法性做校验,若设置的离线作业的volcano.sh/qos-level标签值不是-7~0之间的负整数,则统一按在线作业处理。

    离线作业:

    kind: Deployment
    apiVersion: apps/v1
    spec:
      replicas: 4
      template:
        metadata:
          annotations:
            metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
            volcano.sh/qos-level: "-1"       # 离线作业注解
        spec:
          schedulerName: volcano             # 调度器使用Volcano
          priorityClassName: volcano-free         # 设置volcano-free priorityClass 
          ...

    在线作业:

    kind: Deployment
    apiVersion: apps/v1
    spec:
      replicas: 4
      template:
        metadata:
          annotations:
            metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
        spec:
          schedulerName: volcano          # 调度器使用Volcano
          priorityClassName: volcano-production   # 设置volcano-production priorityClass
          ...

  7. 通过如下命令可查看当前超卖资源量以及资源使用情况。

    kubectl describe node <nodeIP>

    # kubectl describe node 192.168.0.0
    Name:             192.168.0.0
    Roles:              <none>
    Labels:           ...
                      volcano.sh/oversubscription=true
    Annotations:      ...
                      volcano.sh/oversubscription-cpu: 2335
                      volcano.sh/oversubscription-memory: 341753856
    Allocatable:
      cpu:               3920m
      memory:            6263988Ki
    Allocated resources:
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource           Requests      Limits
      --------           --------      ------
      cpu                 4950m (126%)  4950m (126%)
      memory             1712Mi (27%)  1712Mi (27%)

    其中,CPU单位为m,内存单位为字节。

资源超卖部署示例

下面将通过示例演示混合部署离线作业和在线作业。

  1. 假设一个集群存在两个节点,1个超卖节点和1个非超卖节点,如下所示。

    # kubectl get node
    NAME           STATUS   ROLES    AGE    VERSION
    192.168.0.173   Ready    <none>   4h58m   v1.19.16-r2-CCE22.5.1
    192.168.0.3     Ready    <none>   148m    v1.19.16-r2-CCE22.5.1
    • 192.168.0.173为超卖节点(包含标签volcano.sh/oversubscirption=true)
    • 192.168.0.3为非超卖节点(不包含标签volcano.sh/oversubscirption=true)
    # kubectl describe node 192.168.0.173
    Name:               192.168.0.173
    Roles:              <none>
    Labels:             beta.kubernetes.io/arch=amd64
                        ...
                        volcano.sh/oversubscription=true

  2. 提交离线作业,资源充足的情况下,离线作业都调度到了超卖节点上。

    离线作业模板如下。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: offline
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: offline
      template:
        metadata:
          labels:
            app: offline
          annotations:
            volcano.sh/qos-level: "-1"       #离线作业标签
        spec:
          schedulerName: volcano             #调度器使用Volcano
          priorityClassName: volcano-free         # 设置volcano-free priorityClass
          containers:
            - name: container-1
              image: nginx:latest
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  cpu: 500m
                  memory: 512Mi
                limits:
                  cpu: "1"
                  memory: 512Mi
          imagePullSecrets:
            - name: default-secret
    离线作业调度到超卖节点上运行。
    # kubectl get pod -o wide
    NAME                      READY   STATUS   RESTARTS  AGE     IP             NODE 
    offline-69cdd49bf4-pmjp8   1/1    Running   0         5s    192.168.10.178   192.168.0.173
    offline-69cdd49bf4-z8kxh   1/1    Running   0         5s    192.168.10.131   192.168.0.173

  3. 提交在线作业,资源充足时,在线作业调度到了非超卖节点。

    在线作业模板如下。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: online
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: online
      template:
        metadata:
          labels:
            app: online
        spec:
          schedulerName: volcano                 # 调度器使用Volcano
          priorityClassName: volcano-production          # 设置volcano-production priorityClass
          containers:
            - name: container-1
              image: resource_consumer:latest
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  cpu: 1400m
                  memory: 512Mi
                limits:
                  cpu: "2"
                  memory: 512Mi
          imagePullSecrets:
            - name: default-secret
    在线作业调度到非超卖节点上运行。
    # kubectl get pod -o wide
    NAME                   READY   STATUS   RESTARTS  AGE     IP             NODE 
    online-ffb46f656-4mwr6  1/1    Running   0         5s    192.168.10.146   192.168.0.3
    online-ffb46f656-dqdv2   1/1    Running   0         5s    192.168.10.67   192.168.0.3

  4. 提升超卖节点资源使用率,观察触发离线作业驱逐。

    部署在线任务到超卖节点(192.168.0.173)上:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: online
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: online
      template:
        metadata:
          labels:
            app: online
        spec:
           affinity:                             # 提交在线任务至超卖节点
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                    - 192.168.0.173
          schedulerName: volcano                 # 调度器使用Volcano
          priorityClassName: volcano-production          # 设置volcano-production priorityClass
          containers:
            - name: container-1
              image: resource_consumer:latest
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  cpu: 700m
                  memory: 512Mi
                limits:
                  cpu: 700m
                  memory: 512Mi
          imagePullSecrets:
            - name: default-secret
    同时提交在/离线作业到超卖节点(192.168.0.173)上。
    # kubectl get pod -o wide
    NAME                     READY   STATUS   RESTARTS  AGE     IP             NODE 
    offline-69cdd49bf4-pmjp8  1/1     Running    0      13m   192.168.10.178   192.168.0.173 
    offline-69cdd49bf4-z8kxh  1/1     Running     0      13m   192.168.10.131   192.168.0.173 
    online-6f44bb68bd-b8z9p  1/1     Running     0     3m4s   192.168.10.18   192.168.0.173 
    online-6f44bb68bd-g6xk8  1/1     Running     0     3m12s   192.168.10.69   192.168.0.173
    观察超卖节点(192.168.0.173),可以看出存在超卖资源,其中CPU为2343m,内存为3073653200字节。同时CPU分配率已超过100%。
    # kubectl describe node 192.168.0.173
    Name:              192.168.0.173
    Roles:              <none>
    Labels:              …
                        volcano.sh/oversubscription=true
    Annotations:         …                  
                        volcano.sh/oversubscription-cpu: 2343
                        volcano.sh/oversubscription-memory: 3073653200
                        …
    Allocated resources:
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource               Requests      Limits
      --------               --------        ------
      cpu                    4750m (121%)  7350m (187%)
      memory                 3760Mi (61%)  4660Mi (76%)
                             …
    增大节点上在线作业的CPU使用率,可以观察到触发离线作业驱逐。
    # kubectl get pod -o wide
    NAME                     READY   STATUS   RESTARTS  AGE     IP             NODE 
    offline-69cdd49bf4-bwdm7  1/1    Running   0       11m   192.168.10.208  192.168.0.3 
    offline-69cdd49bf4-pmjp8   0/1    Evicted    0       26m   <none>         192.168.0.173
    offline-69cdd49bf4-qpdss   1/1     Running   0       11m   192.168.10.174  192.168.0.3  
    offline-69cdd49bf4-z8kxh   0/1     Evicted    0       26m   <none>        192.168.0.173
    online-6f44bb68bd-b8z9p   1/1     Running   0       24m   192.168.10.18  192.168.0.173
    online-6f44bb68bd-g6xk8   1/1     Running   0       24m   192.168.10.69  192.168.0.173

错误处理建议

  • 超卖节点kubelet重启后,由于Volcano调度器和kubelet的资源视图不同步,部分新调度的作业会出现OutOfCPU的情况,属于正常现象,一段时间后会恢复正常,Volcano调度器能够正常调度在/离线作业。
  • 在/离线作业提交后,因当前内核不支持离线作业修改为在线作业,因此不建议动态修改作业类型(添加或者删除Pod的annotation volcano.sh/qos-level: "-1")。
  • CCE通过cgroups系统中的状态信息收集节点上所有运行的Pod占用的资源量(CPU/内存),可能与用户监控到的资源使用率有所不同,例如使用top命令看到的资源统计。
  • 对于增加超卖资源类型,如超卖资源由cpu变为cpu、memory,此时可以随时添加。

    对于减少超卖资源类型,如由cpu、memory变为仅超卖cpu,此时需要在合适的时间进行更改,即分配率不超过100%时才可进行安全更改。

  • 当离线作业先部署到节点,并占用了在线作业的资源,导致资源不足在线作业无法调度时,需要为在线作业设置比离线作业更高的priorityClass。
  • 若节点上只有在线作业,且达到了驱逐水位线,则离线作业调度到当前节点后会很快被驱逐,此为正常现象。

kubelet超卖迁移至云原生混部超卖说明

当集群满足表1中的迁移场景时,您可以参照以下步骤进行迁移:

  1. 在节点池中开启云原生混部资源超卖时,若检测到之前已开启了kubelet混部超卖,由于云原生混部资源超卖与kubelet超卖兼容模式无法同时生效,此时将自动关闭kubelet超卖实现迁移。
  2. kubelet超卖将自动迁移至云原生混部超卖,切换过程中kubelet会短暂清除掉节点annotation上报的超卖资源,并驱逐离线Pod直至节点分配率小于100%,此为正常现象,随后由volcano-agent接管超卖,超卖功能恢复正常。
提示

您即将访问非华为云网站,请注意账号财产安全

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容