混合调度
以多云的方式混合部署的客户,稳态资源一般用自建/公有云K8S集群IDC,弹性资源用BCI容器实例,
混合调度插件负责无侵入协调客户负载在K8S集群节点及BCI分布。其主要场景是帮助客户将弹性负载弹性到云上容器实例。
策略 | 功能描述 |
---|---|
bciOnly | 工作负载容器强制调度到BCI |
localOnly | 工作负载强制调度到本地/公有云IDC |
localprefer | 当工作负载扩容时,当自建/公有云IDC有资源,优先调度到自建/公有云IDC节点;若自建/公有云IDC没资源,可调度到BCI。 当工作负载缩容时,根据配置,优先缩容删除优先级高的BCI或IDC的实例。还可限制本地IDC/BCI最多可部署的实例数。 |
1. 前提条件
用户在所使用的CCE集群中,已部署cce-virtual-kubelet Helm模板,如何部署详见文档 管理虚拟节点
2. 插件安装
当前只支持在CCE集群以命令行方式安装混合调度插件
# 1. 添加 bci helm repo
helm repo add bci https://registry.baidubce.com/chartrepo/bci-online-public
# 2. 安装 bci schedule profile 混合调度插件
helm install schedule-profile --version 0.2 bci/schedule-profile
3. 通过ScheduleProfile控制Pod在CCE集群节点和BCI之间的分布
用户可以通过创建ScheduleProfile资源,控制pod在本地IDC和BCI之间的分布情况,ScheduleProfile 具体定义如下
apiVersion: scheduling.bci.cloud.baidu.com/v1
kind: ScheduleProfile
metadata:
name: test-schedule-profile
namespace: default
spec:
objectSelector:
namespace:
labels:
type: hybrid
pod:
labels:
type: hybrid
strategy: localprefer
distribution:
local:
maxNum: 20
deletionPriority: 10
bci:
deletionPriority: 20
参数说明:
-
objectSelector:控制调度策略覆盖的对象范围。当设置 namespace labels 时,匹配 labels 的所有 namespace 中的 pod,在该调度策略覆盖范围。当设置 pod labels 时,匹配 labels 的所有 pod,在该调度策略覆盖范围。
- 当 namespace 或者 pod 的 labels 中有多个条目时,对应 namespace 或者 pod 需同时匹配所有 label,才在该调度策略覆盖范围;仅匹配单个 label 不在该调度策略覆盖范围。e.g.
objectSelector: namespace: labels: type: hybrid exp_enabled: false 此时,同时包含 type: hybrid 和 exp_enabled: false 的 namespace 中的 pod 在调度策略覆盖范围
- namespace 和 pod 的 labels 同时存在时,匹配 namespace labels 的 namespace 中的 pod 及 匹配 pod labels 的所有 pod 都在该调度策略覆盖范围。
- 当且仅当一个pod只对应一个ScheduleProfile时,这个pod在其调度策略覆盖范围内。若一个 pod 同时匹配多个 ScheduleProfile 或不匹配任何 ScheduleProfile,则这个 pod 不受任何 ScheduleProfile 影响。若需要通过多个 ScheduleProfile 管理不同的工作负载,建议通过配置 pod labels 进行区分,规避工作负载同时匹配多个 ScheduleProfile 的风险。
- strategy:调度策略选择,目前支持 localprefer/bciOnly/localOnly三种。
-
distribution:仅localprefer策略可设置该字段。
- local 描述本地IDC的部署策略,maxNum 限制本地IDC最多可部署的pod数目;deletionPriority 的作用是,当deployment缩容时,部署在本地IDC的pod被删除的优先级,值越大,越容易被删除。
- bci 描述bci的部署策略,maxNum 限制bci最多可部署的pod数目,任何时刻都不会被打破;deletionPriority 的作用是,当deployment缩容时,部署在bci的pod被删除的优先级,值越大,越容易被删除。
- bci 和 local 中的 maxNum 不能同时设置,maxNum取值范围 [0~int32],0为不限制;deletionPriority取值范围[-100, 100]。
4. 约束和说明
- 本地自建IDC和BCI的最大部署pod数(maxNum)不能同时设置。
- 可以调整ScheduleProfile的覆盖范围(objectSelector),但是要注意,ScheduleProfile对存量已调度pod无影响,比如调大ScheduleProfile的覆盖范围后,新纳入覆盖范围的pod的删除优先级不会发生变化。
- deletionPriority 仅对 1.22 版本以上的 k8s 集群有效。若集群版本低于 1.22,工作负载缩容时,随机选择实例删除。
- 在deployment滚动升级场景下,推荐配置尽可能小的maxSurge值(如直接配置为0),避免出现升级时限制maxNum的区域实际部署数少于maxNum的现象。
- Pod只能关联一个ScheduleProfile,如果一个Pod的labels或所属namespace的labels存在于多个ScheduleProfile中,系统不会对该Pod做任何操作,效果类似于Pod没有关联的ScheduleProfile。
- ScheduleProfile的增删,可能导致Pod所属的ScheduleProfile变化,进而打破MaxNum等策略的限制。
- 若用户负载中明确指定了 nodeName,其关联的 pod 不受 ScheduleProfile 限制,可能打破 MaxNum 等策略的限制。
- 为了避免混合调度影响系统组件,对于需要开启混合调度的 namespace,必须打上开启混合调度的标签“hybrid-schedule = enabled”
5. 使用样例
使用profile配置管理集群内pod,通过labelSelector类方式关联profile和pod,并配置关联pod的分配策略,实现pod在自建/公有云K8S集群本地IDC和云上BCI的分配或数量限制。
本地突发负载上云场景
当工作负载扩容,本地资源不足或者达到设置的最大值时,将实例溢出到云端BCI容器实例,限制本地最多创建30个实例。工作负载缩容时,优先释放云端BCI容器实例。
为避免影响k8s系统组件,对需要开启混合调度功能的 namespace 打上 label,以 default namespace 为例
注:此处仅仅只是在某个名字空间开启混合调度功能,如果想让整个名字空间都被某个调度策略覆盖(受某个调度策略管理),仍然需要在 ScheduleProfile 的 objectSelector 中配置。
(1) 对需要开启混合调度功能的 namespace default打上开启混合调度功能标签
kubectl label namespace default hybrid-schedule=enabled
(2) 配置 ScheduleProfile
apiVersion: scheduling.bci.cloud.baidu.com/v1
kind: ScheduleProfile
metadata:
name: burst-to-cloud
namespace: default
spec:
objectSelector:
pod:
labels:
type: hybrid
strategy: localprefer
distribution:
local:
maxNum: 30
deletionPriority: 10
bci:
deletionPriority: 20
(3) 提交工作负载,以下为一个工作负载样例
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
type: hybrid
spec:
containers:
- name: container-1
image: nginx:latest
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: default-secret
本地强制负载弹性到容器实例场景
将工作负载强制调度到BCI容器实例时,可使用bciOnly策略。
(1) 对需要开启混合调度功能的 namespace 打上开启混合调度功能标签“hybrid-schedule=enabled”
kubectl label namespace default hybrid-schedule=enabled
(2) 配置 ScheduleProfile
apiVersion: scheduling.bci.cloud.baidu.com/v1
kind: ScheduleProfile
metadata:
name: burst-to-cloud
namespace: default
spec:
objectSelector:
pod:
labels:
type: hybrid
strategy: bciOnly
6. 插件卸载
helm uninstall schedule-profile