tencent cloud

文档反馈

安装 CoScheduling 实现批调度

最后更新时间:2024-12-24 15:48:44

    背景

    针对 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
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持