容器服务 安装 CoScheduling 实现批调度

针对 AI、大数据等多任务协作场景,对调度有 “All-or-Nothing” 的需求,即所有的任务在同一时间被调度。CoScheduling 是一套开源的方案,在 Kubernetes 集群中将一组 Pod(或称为 PodGroup)同时调度到同一个节点上。这里说明如何在 TKE 上安装 CoScheduling,实现批调度。

相关产品
容器服务 产品页,含版本规格、价格与购买入口。

一、前提条件

·已创建了 TKE 集群。

·已安装了 Helm。

·已配置了 TKE 集群的 kubeconfig,并具有操作 TKE 集群的权限。详情请参见 连接集群。

二、在 TKE 配置 SSH 密钥

生成 SSH 密钥对,将 "your_email@example.com" 替换为你的 GitHub 注册邮箱。命令示例如下:

ssh-keygen -t ed25519 -C "your_email@example.com"

将公钥添加到 GitHub,查看并复制生成的公钥内容,命令示例如下:

cat ~/.ssh/id_ed25519.pub

你可以登录 GitHub,依次点击右上角头像 > Settings > SSH and GPG keys > New SSH key。

取一个易识别的 Title(例如 My TKE Node),将复制的内容粘贴到 Key 框中,点击 Add SSH key。

在 TKE 集群中创建 Kubernetes Secret,假设你的私钥文件名为 id_ed25519。使用 kubectl 命令在需要访问仓库的命名空间下创建一个 Secret。例如,创建在 istio-system 命名空间中:

kubectl create secret generic github-ssh-key \\ –namespace=istio-system \\ –from-file=id_ed25519=./id_ed25519

在 Pod 的 YAML 配置中挂载该 Secret。

apiVersion: apps/v1kind: Deploymentmetadata: name: my-app namespace: istio-systemspec: template: spec: containers: – name: my-app-container image: my-app-image volumeMounts: – name: ssh-key-volume mountPath: "/root/.ssh" # 挂载到容器的 SSH 目录,用户需根据镜像调整(如 root 或非root用户) volumes: – name: ssh-key-volume secret: secretName: github-ssh-key # 之前创建的 Secret 名称 defaultMode: 0600 # 关键:设置文件权限为 600,否则 SSH 会因权限太开放而拒绝使用

三、将 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: 10 minMember: 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

创建 PodGroup:

kubectl apply -f podgroup.yaml

我们将在调度程序中计算正在运行的 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: 10 minMember: 3—apiVersion: apps/v1kind: ReplicaSetmetadata: name: nginx labels: app: nginxspec: 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 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

赞 (0)
上一篇 4天前
下一篇 4天前