混合调度
概述
本文档介绍在多云混合部署场景下,如何通过混合调度插件无侵入协调客户负载在 CCE 集群节点和 BCI 之间的分布,帮助将弹性负载扩展到云上容器实例。稳态资源通常部署在自建或公有云 K8S 集群 IDC,弹性资源使用 BCI 容器实例。
| 策略 | 功能描述 |
|---|---|
bciOnly |
工作负载容器强制调度到 BCI。 |
localOnly |
工作负载强制调度到本地或公有云 IDC。 |
localprefer |
当工作负载扩容时,如果自建或公有云 IDC 有资源,优先调度到自建或公有云 IDC 节点;如果自建或公有云 IDC 没有资源,可调度到 BCI。当工作负载缩容时,根据配置优先删除删除优先级更高的 BCI 或 IDC 实例。还可限制本地 IDC 或 BCI 最多可部署的实例数。 |
1. 前提条件
用户在所使用的CCE集群中,已部署cce-virtual-kubelet Helm模板,如何部署详见文档 管理虚拟节点
2. 插件安装
当前只支持在CCE集群以命令行方式安装混合调度插件
1# 1. 添加 bci helm repo
2helm repo add bci https://registry.baidubce.com/chartrepo/bci-online-public
3# 2. 安装 bci schedule profile 混合调度插件
4helm install schedule-profile --version 0.3 bci/schedule-profile
3. 通过ScheduleProfile控制Pod在CCE集群节点和BCI之间的分布
用户可以通过创建ScheduleProfile资源,控制pod在本地IDC和BCI之间的分布情况,ScheduleProfile 具体定义如下
1apiVersion: scheduling.bci.cloud.baidu.com/v1
2kind: ScheduleProfile
3metadata:
4 name: test-schedule-profile
5 namespace: default
6spec:
7 objectSelector:
8 namespace:
9 labels:
10 type: hybrid
11 pod:
12 labels:
13 type: hybrid
14 strategy: localprefer
15 distribution:
16 local:
17 maxNum: 20
18 deletionPriority: 10
19 bci:
20 deletionPriority: 20
参数说明
| 参数 | 必填 | 说明 |
|---|---|---|
objectSelector.namespace.labels |
否 | 按命名空间标签匹配。命中命名空间内的 Pod 受该调度策略影响。多个标签需要同时匹配。 |
objectSelector.pod.labels |
否 | 按 Pod 标签匹配。多个标签需要同时匹配。 |
strategy |
是 | 调度策略。当前支持 localprefer、bciOnly、localOnly。 |
distribution.local.maxNum |
否 | 仅 localprefer 可配置。限制本地 IDC 最多可部署的 Pod 数。0 表示不限制。 |
distribution.local.deletionPriority |
否 | 仅 localprefer 可配置。本地 IDC Pod 的缩容删除优先级,值越大越容易被删除。 |
distribution.bci.maxNum |
否 | 仅 localprefer 可配置。限制 BCI 最多可部署的 Pod 数,任何时刻都不会被打破。 |
distribution.bci.deletionPriority |
否 | 仅 localprefer 可配置。BCI Pod 的缩容删除优先级,值越大越容易被删除。 |
- 当
namespace.labels或pod.labels中有多个条目时,只有同时匹配全部标签的命名空间或 Pod 才在该调度策略覆盖范围内。
1objectSelector:
2 namespace:
3 labels:
4 type: "<标签值 1>"
5 exp_enabled: "<标签值 2>"
同时包含 type 和 exp_enabled 两个标签的命名空间中的 Pod,才在该调度策略覆盖范围内。
- 当
namespace.labels和pod.labels同时存在时,命中命名空间标签的 Pod,以及命中 Pod 标签的 Pod,都会在该调度策略覆盖范围内。 - 当且仅当一个 Pod 只匹配一个
ScheduleProfile时,该 Pod 才受该调度策略影响。如果一个 Pod 同时匹配多个ScheduleProfile,或者不匹配任何ScheduleProfile,则该 Pod 不受任何ScheduleProfile影响。 - 如果需要通过多个
ScheduleProfile管理不同工作负载,建议通过配置 Pod 标签进行区分,规避工作负载同时匹配多个ScheduleProfile的风险。 bci和local中的maxNum不能同时设置。maxNum取值范围为[0, int32],0表示不限制。deletionPriority取值范围为[-100, 100]。
约束和说明
- 本地自建 IDC 和 BCI 的最大部署 Pod 数
maxNum不能同时设置。 - 可以调整
ScheduleProfile的覆盖范围objectSelector,但ScheduleProfile对存量已调度 Pod 无影响。例如,扩大ScheduleProfile覆盖范围后,新纳入覆盖范围的 Pod 的删除优先级不会发生变化。 deletionPriority仅对 Kubernetes1.22及以上版本的集群有效。如果集群版本低于1.22,工作负载缩容时会随机删除实例。- 在 Deployment 滚动升级场景下,建议配置尽可能小的
maxSurge值,例如0,避免升级时受maxNum限制的区域实际部署数少于maxNum。 - Pod 只能关联一个
ScheduleProfile。如果一个 Pod 的标签或所属命名空间的标签存在于多个ScheduleProfile中,系统不会对该 Pod 执行任何调度控制,效果等同于该 Pod 未关联ScheduleProfile。 ScheduleProfile的增删可能导致 Pod 归属的ScheduleProfile发生变化,进而打破maxNum等策略限制。- 如果用户负载中明确指定了
nodeName,其关联 Pod 不受ScheduleProfile限制,可能打破maxNum等策略限制。 - 为避免混合调度影响系统组件,对于需要开启混合调度的命名空间,必须打上开启混合调度的标签
hybrid-schedule=enabled。
使用样例
使用 ScheduleProfile 配置管理集群内 Pod,通过标签选择方式关联 ScheduleProfile 和 Pod,并配置关联 Pod 的分配策略,实现 Pod 在本地 IDC 和云上 BCI 之间的分配或数量限制。
本地突发负载上云场景
操作入口:命令行环境 -> 已连接目标 CCE 集群
当工作负载扩容时,本地资源不足或者达到设置的最大值后,将实例溢出到云端 BCI 容器实例,并限制本地最多创建指定数量的实例。工作负载缩容时,优先释放云端 BCI 容器实例。
为避免影响 K8S 系统组件,对需要开启混合调度功能的命名空间打上标签。以下以业务命名空间为例。
说明: 此处仅表示在某个命名空间开启混合调度功能。如果希望整个命名空间都受某个调度策略管理,仍需在
ScheduleProfile的objectSelector中配置匹配条件。
- 对业务命名空间打上开启混合调度功能标签。
1kubectl label namespace <业务命名空间> hybrid-schedule=enabled
- 配置
ScheduleProfile。
1apiVersion: scheduling.bci.cloud.baidu.com/v1
2kind: ScheduleProfile
3metadata:
4 name: "<调度策略名称>"
5spec:
6 objectSelector:
7 pod:
8 labels:
9 type: "<混合调度标签值>"
10 strategy: localprefer
11 distribution:
12 local:
13 maxNum: <本地最大实例数>
14 deletionPriority: <本地删除优先级>
15 bci:
16 deletionPriority: <BCI 删除优先级>
- 提交工作负载。
1kind: Deployment
2apiVersion: apps/v1
3metadata:
4 name: "<工作负载名称>"
5 namespace: "<业务命名空间>"
6spec:
7 replicas: <副本数>
8 selector:
9 matchLabels:
10 app: "<工作负载标签值>"
11 template:
12 metadata:
13 labels:
14 app: "<工作负载标签值>"
15 type: "<混合调度标签值>"
16 spec:
17 containers:
18 - name: "<容器名称>"
19 image: "<业务镜像>"
20 imagePullPolicy: IfNotPresent
21 imagePullSecrets:
22 - name: "<镜像拉取密钥名称>"
本地强制负载弹性到容器实例场景
操作入口:命令行环境 -> 已连接目标 CCE 集群
将工作负载强制调度到 BCI 容器实例时,可使用 bciOnly 策略。
- 对需要开启混合调度功能的命名空间打上开启混合调度功能标签
hybrid-schedule=enabled。
1kubectl label namespace <业务命名空间> hybrid-schedule=enabled
- 配置
ScheduleProfile。
1apiVersion: scheduling.bci.cloud.baidu.com/v1
2kind: ScheduleProfile
3metadata:
4 name: "<调度策略名称>"
5spec:
6 objectSelector:
7 pod:
8 labels:
9 type: "<混合调度标签值>"
10 strategy: bciOnly
插件卸载
操作入口:命令行环境 -> 已连接目标 CCE 集群
1helm uninstall schedule-profile
评价此篇文章
