全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:通过ack-co-scheduler组件实现协同调度

更新时间:Oct 18, 2024

与原生的Kubernetes调度器相比,容器服务ACK的调度器扩展出更多其他功能,例如Gang Scheduling、CPU拓扑感知、ECI弹性调度等。本文介绍通过为注册集群安装ack-co-scheduler组件的方式,以实现在您的本地集群中使用阿里云容器服务ACK的调度能力,让您能够便捷地使用容器服务对于大数据、AI等应用扩展出的差异化能力,提高应用的运行效率。

前提条件

  • 已创建注册集群,并将自建Kubernetes集群接入注册集群。具体操作,请参见创建注册集群

  • 系统组件版本要求具体如下表所示。

    组件

    版本要求

    Kubernetes

    1.18.8及以上版本

    Helm

    3.0及以上版本

    Docker

    19.03.5

    操作系统

    CentOS 7.6、CentOS 7.7、Ubuntu 16.04、Ubuntu 18.04、Alibaba Cloud Linux

注意事项

在部署任务时需要指定调度器的名称为ack-co-scheduler,即将.template.spec.schedulerName配置为ack-co-scheduler

安装ack-co-scheduler组件

通过onectl安装

  1. 在本地安装配置onectl。具体操作,请参见通过onectl管理注册集群

  2. 执行以下命令,安装ack-co-scheduler组件。

    onectl addon install ack-co-scheduler

    预期输出:

    Addon ack-co-scheduler, version **** installed.

通过控制台安装

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击其他页签,找到ack-co-scheduler组件,在卡片右下方单击安装

  4. 在提示对话框中单击确定

Gang scheduling

阿里云容器服务ACK基于新版的Kube-scheduler框架实现Gang scheduling的能力,解决原生调度器无法支持All-or-Nothing作业调度的问题。

使用以下模板向集群中提交Tensorflow分布式作业。关于如何运行Tensorflow的分布式作业,请参见使用Gang scheduling

apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
  name: "tf-smoke-gpu"
spec:
  tfReplicaSpecs:
    PS:
      replicas: 1
      template:
        metadata:
          creationTimestamp: null
          labels:
            pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
            pod-group.scheduling.sigs.k8s.io/min-available: "2"
        spec:
          schedulerName: ack-co-scheduler   #指定调度器的名称为ack-co-scheduler。
          containers:
          - args:
            - python
            - tf_cnn_benchmarks.py
            - --batch_size=32
            - --model=resnet50
            - --variable_update=parameter_server
            - --flush_stdout=true
            - --num_gpus=1
            - --local_parameter_device=cpu
            - --device=cpu
            - --data_format=NHWC
            image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
            name: tensorflow
            ports:
            - containerPort: 2222
              name: tfjob-port
            resources:
              limits:
                cpu: '10'
            workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
          restartPolicy: OnFailure
    Worker:
      replicas: 4
      template:
        metadata:
          creationTimestamp: null
          labels:
            pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
            pod-group.scheduling.sigs.k8s.io/min-available: "2"
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - args:
            - python
            - tf_cnn_benchmarks.py
            - --batch_size=32
            - --model=resnet50
            - --variable_update=parameter_server
            - --flush_stdout=true
            - --num_gpus=1
            - --local_parameter_device=cpu
            - --device=gpu
            - --data_format=NHWC
            image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
            name: tensorflow
            ports:
            - containerPort: 2222
              name: tfjob-port
            resources:
              limits:
                cpu: 10
            workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
          restartPolicy: OnFailure

CPU拓扑感知调度

在使用CPU拓扑感知调度前,需要预先部署组件resource-controller。具体操作,请参见管理组件

使用以下模板在Deployment中使用CPU拓扑感知调度。关于CPU拓扑感知调度的更多信息,请参见CPU拓扑感知调度

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-numa
  labels:
    app: nginx-numa
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-numa
  template:
    metadata:
      annotations:
        cpuset-scheduler: "true"
      labels:
        app: nginx-numa
    spec:
      schedulerName: ack-co-scheduler #指定调度器的名称为ack-co-scheduler。
      containers:
      - name: nginx-numa
        image: nginx:1.13.3
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 4
          limits:
            cpu: 4

ECI弹性调度

ECI弹性调度是阿里云提供的弹性调度策略。您可以在部署服务时通过添加Annotations来申明只使用ECS或ECI弹性资源,或者是在ECS资源不足时自动申请ECI资源。通过ECI弹性调度可以满足您在不同工作负载的场景下对弹性资源的不同需求。

在使用ECI弹性调度前,需要在集群中预先部署组件ack-virtual-node。具体操作,请参见ACK使用ECI

使用以下模板在Deployment中使用ECI弹性调度。关于如何使用ECI弹性调度,请参见使用ECI弹性调度

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx
      annotations:
        alibabacloud.com/burst-resource: eci #添加注解,选择弹性调度的资源类型。
      labels:
        app: nginx
    spec:
      schedulerName: ack-co-scheduler #指定调度器的名称为ack-co-scheduler。
      containers:
      - name: nginx
        image: nginx
        resources:
          limits:
            cpu: 2
          requests:
            cpu: 2

template. metadata下配置Pod的Annotations alibabacloud.com/burst-resource,声明弹性调度资源的类型。alibabacloud.com/burst-resource取值说明如下:

  • 默认不填Annotations时:只使用集群现有的ECS资源。

  • eci:当前集群ECS资源不足时,使用ECI弹性资源。

  • eci_only:只使用ECI弹性资源,不使用集群的ECS资源。

共享GPU调度

关于如何使用共享GPU调度,请参见运行共享GPU调度组件监控和隔离GPU资源基于节点池管理共享GPU