背景
针对 AI、大数据等多任务协作场景,对调度有 “All-or-Nothing” 的需求,即所有的任务在同一时间被调度。CoScheduling 是一套开源的方案,在 Kubernetes 集群中将一组 Pod(或称为 PodGroup)同时调度到同一个节点上。本文将介绍如何在 TKE 上安装 CoScheduling 实现批调度。
前提条件
已创建了 TKE 集群。
已安装了 Helm。
已配置了 TKE 集群的 kubeconfig,并具有操作 TKE 集群的权限。详情请参见 连接集群。
使用 Helm 安装
将 CoScheduler 作为第二调度器完成安装
pod 调度时需要指定 schedulerName 为 scheduler-plugins-scheduler。命令示例如下:
$ git clone git@github.com:kubernetes-sigs/scheduler-plugins.git$ cd scheduler-plugins/manifests/install/charts$ helm install scheduler-plugins as-a-second-scheduler/ --create-namespace --namespace scheduler-plugins
验证安装成功
执行如下命令,观察 Pod 运行情况。
$ kubectl get deploy -n scheduler-plugins
预期输出:
NAME READY UP-TO-DATE AVAILABLE AGEscheduler-plugins-controller 1/1 1 1 7sscheduler-plugins-scheduler 1/1 1 1 7s
如何使用
PodGroup
PodGroup 是 CoScheduling 组件自定义资源,用来定义最少需要同时调度的 Pod 数。通过设置标签定义 Pod 属于哪一个 PodGroup。以下是 PodGroup 的 CRD 规范示例:
# PodGroup CRD specapiVersion: scheduling.x-k8s.io/v1alpha1kind: PodGroupmetadata:name: nginxspec:scheduleTimeoutSeconds: 10minMember: 3---# Add a label `scheduling.x-k8s.io/pod-group` to mark the pod belongs to a grouplabels:scheduling.x-k8s.io/pod-group: nginx
我们将在调度程序中计算正在运行的 pod 和正在等待的 pod(假设但未绑定)的总和,如果总和大于或等于 minMember,则将创建等待 pod。同一 PodGroup 中具有不同优先级的 Pod 可能会导致意外行为,因此需要确保同一 PodGroup 中的 Pod 具有相同的优先级。
示例
假设我们有一个只能容纳3个 nginx pod 的集群。我们创建一个 replicas=6 的 ReplicaSet,并将 minMember 的值设置为3。
apiVersion: scheduling.x-k8s.io/v1alpha1kind: PodGroupmetadata:name: nginxspec:scheduleTimeoutSeconds: 10minMember: 3---apiVersion: apps/v1kind: ReplicaSetmetadata:name: nginxlabels:app: nginxspec:replicas: 6selector:matchLabels:app: nginxtemplate:metadata:name: nginxlabels:app: nginxscheduling.x-k8s.io/pod-group: nginxspec:containers:- name: nginximage: nginxresources:limits:cpu: 3000mmemory: 500Mirequests:cpu: 3000mmemory: 500Mi
3个 Pod 将一起被调度,如下:
$ kubectl get podsNAME READY STATUS RESTARTS AGEnginx-4jw2m 0/1 Pending 0 55snginx-4mn52 1/1 Running 0 55snginx-c9gv8 1/1 Running 0 55snginx-frm24 0/1 Pending 0 55snginx-hsflk 0/1 Pending 0 55snginx-qtj5f 1/1 Running 0 55s
如果此时修改 minMember 为4,因不满足 PodGroup 定义的 minMember 为3的要求,所有的 nginx pod 都处于 pending 状态:
$ kubectl get podsNAME READY STATUS RESTARTS AGEnginx-4vqrk 0/1 Pending 0 3snginx-bw9nn 0/1 Pending 0 3snginx-gnjsv 0/1 Pending 0 3snginx-hqhhz 0/1 Pending 0 3snginx-n47r7 0/1 Pending 0 3snginx-n7vtq 0/1 Pending 0 3s