文档中心>容器服务>实践教程>调度>安装 CoScheduling 实现批调度

安装 CoScheduling 实现批调度

最近更新时间:2024-05-23 15:10:52

我的收藏

背景

针对 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 AGE
scheduler-plugins-controller 1/1 1 1 7s
scheduler-plugins-scheduler 1/1 1 1 7s

如何使用

PodGroup

PodGroup 是 CoScheduling 组件自定义资源,用来定义最少需要同时调度的 Pod 数。通过设置标签定义 Pod 属于哪一个 PodGroup。以下是 PodGroup 的 CRD 规范示例:
# PodGroup CRD spec
apiVersion: scheduling.x-k8s.io/v1alpha1
kind: PodGroup
metadata:
name: nginx
spec:
scheduleTimeoutSeconds: 10
minMember: 3
---
# Add a label `scheduling.x-k8s.io/pod-group` to mark the pod belongs to a group
labels:
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/v1alpha1
kind: PodGroup
metadata:
name: nginx
spec:
scheduleTimeoutSeconds: 10
minMember: 3
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 6
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
scheduling.x-k8s.io/pod-group: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
cpu: 3000m
memory: 500Mi
requests:
cpu: 3000m
memory: 500Mi
3个 Pod 将一起被调度,如下:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-4jw2m 0/1 Pending 0 55s
nginx-4mn52 1/1 Running 0 55s
nginx-c9gv8 1/1 Running 0 55s
nginx-frm24 0/1 Pending 0 55s
nginx-hsflk 0/1 Pending 0 55s
nginx-qtj5f 1/1 Running 0 55s
如果此时修改 minMember 为4,因不满足 PodGroup 定义的 minMember 为3的要求,所有的 nginx pod 都处于 pending 状态:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-4vqrk 0/1 Pending 0 3s
nginx-bw9nn 0/1 Pending 0 3s
nginx-gnjsv 0/1 Pending 0 3s
nginx-hqhhz 0/1 Pending 0 3s
nginx-n47r7 0/1 Pending 0 3s
nginx-n7vtq 0/1 Pending 0 3s