与原生的Kubernetes调度器相比,容器服务ACK的调度器扩展出更多其他功能,例如Gang Scheduling、CPU拓扑感知、ECI弹性调度等。本文介绍通过为注册集群安装ack-co-scheduler组件的方式,以实现在您的本地集群中使用阿里云容器服务ACK的调度能力,让您能够便捷地使用容器服务对于大数据、AI等应用扩展出的差异化能力,提高应用的运行效率。
前提条件
- 已创建注册集群,并将自建Kubernetes集群接入注册集群。具体操作,请参见创建注册集群并接入本地数据中心集群。
- 在注册集群中安装ack-co-scheduler组件。具体操作,请参见管理组件。
- 系统组件版本要求具体如下表所示。
组件 版本要求 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
。
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
共享GPU调度
关于如何使用共享GPU调度,请参见运行共享GPU示例、监控和隔离GPU资源、基于节点池管理共享GPU。