文档首页> 云容器引擎 CCE> 用户指南> 旧版UI> 在线离线作业混合部署
更新时间:2022-05-19 GMT+08:00
分享

在线离线作业混合部署

在线离线作业混合部署特性当前为公测特性。

在线作业与离线作业

从业务是否一直在线的角度看,其类型可分为在线作业和离线作业。

  • 在线作业:一般运行时间长,服务流量呈周期性,资源存在潮汐现象,但对服务SLA要求较高,如广告业务、电商业务等。
  • 离线作业:往往运行时间短,计算需求大,可容忍较高的时延,如AI/大数据业务。

资源超卖与混合部署

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

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

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

在线离线作业混部超卖功能特性

当前特性支持CPU和内存资源超卖。关键特性如下:

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

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

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

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

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

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

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

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

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

约束与限制

  • 仅支持使用1.21及以上版本的CCE Turbo集群裸金属资源。
  • 节点需使用EulerOS 2.10。
  • 集群需安装volcano 1.3.4及以上版本插件。
  • 开启volcano超卖插件时,需保证未开启overcommit插件。
  • 开启volcano超卖插件时,需保证未开启CPU Manager Policies。
  • 开启volcano超卖插件时,需保证未开启Topology Management Policies。

超卖标签配置调度说明

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

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

插件超卖配置

节点超卖标签

调度行为

超卖调度

正常调度

正常调度

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

使用混部特性的步骤

  1. 配置Volcano插件。

    1. 请参见通过kubectl连接集群,使用kubectl连接集群。
    2. 执行如下命令, 在volcano- scheduler-configmap中增加oversubscription插件配置。同时确保插件配置中不能包含overcommit插件,如果存在(- name: overcommit),则需要删除该配置。
      # kubectl edit cm volcano-scheduler-configmap -n kube-system
      apiVersion: v1
      data:
        volcano-scheduler.conf: |
          actions: "enqueue, allocate, backfill"
          tiers:
          - plugins:
            - name: gang
            - name: priority
            - name: conformance
            - name: oversubscription
          - plugins:
            - name: drf
            - name: predicates
            - name: proportion
            - name: nodeorder
            - name: binpack

  2. 开启节点超卖特性。

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

    1. 创建裸金属节点池。
    2. 节点池创建完成后,单击节点池名称后的“配置管理”。
    3. 在侧边栏滑出的“配置管理”窗口中,将kubelet组件下的“over-subscription-resource”参数设置为“true”(该参数只针对裸金属节点池可见),单击确定。

  3. 设置节点超卖标签。

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

    # kubectl label node 192.168.0.0 volcano.sh/oversubscription=true

    节点还支持如下超卖相关的阈值,如表2所示。您可以使用kubectl annotate node nodeIP xxxxxx=xxxxxx命令。示例如下:

    kubectl annotate node 192.168.0.0 volcano.sh/oversubscription-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/oversubscription-evicting-cpu-high-watermark: 70
    表2 节点超卖annotations

    名称

    说明

    volcano.sh/oversubscription-evicting-cpu-high-watermark

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

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

    volcano.sh/oversubscription-evicting-cpu-low-watermark

    触发驱逐后,当节点CPU使用率低于设置值后,重新开始调度。

    默认值为30,即当节点CPU使用率低于30%后,重新开始调度。

    volcano.sh/oversubscription-evicting-memory-high-watermark

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

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

    volcano.sh/oversubscription-evicting-memory-low-watermark

    触发驱逐后,当节点内存使用率低于设置值后,重新开始调度。

    默认值为30,即当节点内存使用率低于30%后,重新开始调度。

    volcano.sh/oversubscription-types

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

    • cpu (超卖CPU)
    • memory (超卖Memory)
    • cpu,memory (超卖CPU和memory)

    默认值为”cpu,memory”

  4. 部署在离线作业。

    离线作业需在annotation中增加volcano.sh/preemptable标签以区分其为离线作业,在线作业不需要设置该标签。在线、离线作业均需设置schedulerName字段的值为“volcano”,启用Volcano调度器。

    离线作业:

    kind: Deployment
    apiVersion: apps/v1
    spec:
      replicas: 4
      template:
        metadata:
          annotations:
            metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
            volcano.sh/preemptable: ‘true’ # 离线作业标签
        spec:
          schedulerName: volcano             # 调度器使用volcano
          ...

    在线作业:

    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
          ...

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

    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%)

混合部署示例

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

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

    # kubectl get node
    NAME           STATUS   ROLES    AGE    VERSION
    192.168.0.24   Ready    <none>   5d3h   v1.21.4-r0-CCE21.11.1.B003
    192.168.0.76   Ready    <none>   2d2h   v1.21.4-r0-CCE21.11.1.B004
    • 192.168.0.76为超卖节点(包含标签volcano.sh/oversubscirption=true)
    • 192.168.0.24为非超卖节点(不包含标签volcano.sh/oversubscirption=true)
    # kubectl describe no 192.168.0.76
    Name:               192.168.0.76
    Roles:              <none>
    Labels:             beta.kubernetes.io/arch=amd64
                        ...
                        os.architecture=amd64
                        os.name=EulerOS_2.0_SP10x86_64
                        os.version=4.18.0-147.5.2.1.h579.eulerosv2r10.x86_64
                        volcano.sh/oversubscription=true

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

    离线作业模板如下。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: offline-job
      namespace: oversubscription
      labels:
        app: offline-job
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: offline-job
      template:
        metadata:
          labels:
            app: offline-job
          annotations:
            volcano.sh/preemptable: "true"       # 离线作业标签
        spec:
          schedulerName: volcano                 # 调度器使用volcano
          containers:
            - name: nginx
              imagePullPolicy: IfNotPresent
              image: centos:7
              command: ["/bin/sh", "-c", "while true; do sleep 1; done"]
              resources:
                requests:
                  cpu: 1000m
                  memory: 500Mi
                limits:
                  cpu: 1000m
                  memory: 500Mi
    离线作业调度到超卖节点上运行。
    # kubectl get po -n oversubscription -o wide
    NAME                           READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
    offline-job-5dc944f84f-grzb2   1/1     Running   0          30s   192.168.3.200   192.168.0.76   <none>           <none>
    offline-job-5dc944f84f-xjsx2   1/1     Running   0          30s   192.168.2.143   192.168.0.76   <none>           <none>

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

    在线作业模板如下。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: online-service
      namespace: oversubscription
      labels:
        app: online-service
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: online-service
      template:
        metadata:
          labels:
            app: online-service
        spec:
          schedulerName: volcano
          nodeSelector:
            demo-node: "true"
          containers:
            - name: nginx
              imagePullPolicy: IfNotPresent
              image: centos:7
              command: ["/bin/sh", "-c", "while true; do sleep 1; done"]
              resources:
                requests:
                  cpu: 1000m
                  memory: 500M
                limits:
                  cpu: 1000m
                  memory: 500M
    在线作业调度到非超卖节点上运行。
    # kubectl get po -n oversubscription -o wide
    NAME                              READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
    online-service-6f94f8cdf9-5mhn6   1/1     Running   0          30s   192.168.3.150   192.168.0.24   <none>           <none>
    online-service-6f94f8cdf9-mz82w   1/1     Running   0          30s   192.168.2.238   192.168.0.24   <none>           <none>

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

    同时提交在/离线作业到超卖节点(192.168.0.76)上。
    # kubectl get po -n oversubscription -o wide
    NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
    offline-job-776b4f75bc-5dpxm     1/1     Running   0          8s    192.168.2.228   192.168.0.76   <none>           <none>
    offline-job-776b4f75bc-kkhbn     1/1     Running   0          8s    192.168.2.16    192.168.0.76   <none>           <none>
    online-service-886d79845-5fqhq   1/1     Running   0          8s    192.168.3.169   192.168.0.76   <none>           <none>
    online-service-886d79845-bpd9m   1/1     Running   0          8s    192.168.3.128   192.168.0.76   <none>           <none>
    观察节点(192.168.0.76),可以看出存在超卖资源,同时CPU分配率已超过100%。
    # kubectl describe no 192.168.0.76
    Name:               192.168.0.76
    Roles:              <none>
    Labels:             beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=c6.22xlarge.2.physical
                        beta.kubernetes.io/os=linux
                        ...
                        kubernetes.io/arch=amd64
                        kubernetes.io/hostname=192.168.0.76
                        volcano.sh/oversubscription=true
    Annotations:        alpha.kubernetes.io/provided-node-ip: 192.168.0.76
                        volcano.sh/oversubscription-cpu: 52278
                        volcano.sh/oversubscription-memory: 3033176651
    ...
    Allocated resources:	
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource           Requests         Limits
      --------           --------         ------
      cpu                105350m (120%)   105350m (120%)
      memory             5127195136 (1%)  5336910336 (1%)
      ephemeral-storage  0 (0%)           0 (0%)
      hugepages-1Gi      0 (0%)           0 (0%)
      hugepages-2Mi      0 (0%)           0 (0%)
    增大节点上在线作业的CPU使用率,可以观察到触发离线作业驱逐。
    # kubectl get po -n oversubscription -o wide
    NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
    offline-job-776b4f75bc-5dpxm     1/1     Running   0          18m   192.168.2.228   192.168.0.76   <none>           <none>
    offline-job-776b4f75bc-htjwr     0/1     Pending   0          13s   <none>          <none>         <none>           <none>
    offline-job-776b4f75bc-kkhbn     0/1     Evicted   0          18m   <none>          192.168.0.76   <none>           <none>
    online-service-886d79845-5fqhq   1/1     Running   0          18m   192.168.3.169   192.168.0.76   <none>           <none>
    online-service-886d79845-bpd9m   1/1     Running   0          18m   192.168.3.128   192.168.0.76   <none>           <none>

错误处理建议

  • 超卖节点kubelet重启后,由于volcano调度器和kubelet的资源视图不同步,部分新调度的作业会出现OutOfCPU的情况,属于正常现象,一段时间后会恢复正常,volcano调度器能够正常调度在/离线作业。
  • 在/离线作业提交后,因当前内核不支持离线作业修改为在线作业,因此不建议动态修改作业类型(添加或者删除annotation volcano.sh/preemptable: ‘true’)。
  • CCE通过cgroups系统中的状态信息收集节点上所有运行的Pod占用的资源量(CPU/内存),可能与用户监控到的资源使用率有所不同,例如使用top命令看到的资源统计。
  • 操作系统内存隔离功能由/proc/sys/vm/memcg_qos_enable开启,若无法编辑可参考Linux内存映像文件编辑方式
分享:

    相关文档

    相关产品

close