Kubernetes 自带了一个默认调度器kube-scheduler,其内置了不少节点预选和优选的调度算法,通常调度场景下能够知足要求。可是在一些特殊场景下,默认调度器不能知足咱们复杂的调度需求。咱们就须要对调度器进行扩展,以达到调度适合业务场景的目的。前端
中间件redis容器化后,须要两主不能在同一个节点上,一对主从不能在同一节点上;elasticsearch容器化后,两个data实例不能在同一节点上。在这类场景下,默认调度器内置的预选、优选算法不能知足需求,咱们有如下三种选择:java
对上述三种方式进行评估:node
第一种:将本身的调度算法添加到默认调度器kube-scheduler中,对原生代码侵入性较高,并且随着kubernetes版本升级,维护成本也较高;python
第二种:默认调度器里内置了不少优秀调度算法,如:检查节点资源是否充足;端口是否占用;volume是否被其余pod挂载;亲和性;均衡节点资源利用等,若是彻底使用本身开发的调度器程序,可能在达到了实际场景调度需求同时,失去更佳的调度方案,除非集成默认调度器中的算法到本身独立调度程序中,但这无疑是不现实的;nginx
第三种:经过启动参数的policy配置,选用某些默认调度器中的预选、优选调度算法的同时,也能够调用外部扩展调度程序的算法,计算获得最优的调度节点,无需修改kube-scheduler代码,只须要在启动参数中增长配置文件便可将默认调度程序和扩展调度程序相互关联。git
能够参考:github
故采用第三种:实现扩展调度程序的方案。面试
kube-scheduler在调度pod实例时,首先获取到Node一、Node二、Node3三个节点信息,进行默认的预选阶段,筛选知足要求的节点,其次再调用扩展程序中的预选算法,选出剩下的节点,假设预选阶段Node3上资源不足被过滤掉,预选结束后只剩Node1和Node2;Node1和Node2进入kube-scheduler默认的优选阶段进行节点打分,其次再调用扩展调度程序中的优选算法进行打分,kube-scheduler会将全部算法的打分结果进行加权求和,得到分数最高的节点做为pod最终bind节点,而后kube-scheduler调用apiserver进行bind操做。redis
编写扩展调度器程序代码,根据实际业务调度场景编写预选逻辑、优选逻辑:算法
实现预选接口,入参为schedulerapi.ExtenderArgs,出参为schedulerapi.ExtenderFilterResult:
实现优选接口,入参为schedulerapi.ExtenderArgs,出参为schedulerapi.HostPriorityList:
暴露http接口:
参考:
因为kubernetes集群内已经有了一个名为default-scheduler的默认调度器,为了避免影响集群正常调度功能,下面会建立一个名为my-kube-scheduler的调度器,这个调度器和default-scheduler除了启动参数不同外,镜像无差异。
一、建立一个名为my-scheduler-config的configmaps,data下的config.yaml文件指定了调度器的一些参数,包括leader选举,调度算法策略的选择(指定另外一个configmaps),以及指定调度器的名称为my-kube-scheduler。
相应的建立一个my-scheduler-policy的configmaps,里面指定了选择哪些预选、优选策略,以及外部扩展调度程序的urlPrefix、扩展预选URI、扩展优选URI、扩展pod优先级抢占URI、扩展bind URI、扩展优选算法的权重等。
以保证my-kube-scheduler和扩展调度程序的通讯。
apiVersion: v1
kind: ConfigMap
metadata:
name: my-scheduler-config
namespace: kube-system
data:
config.yaml: |
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
schedulerName: my-kube-scheduler
algorithmSource:
policy:
configMap:
namespace: kube-system
name: my-scheduler-policy
leaderElection:
leaderElect: false
lockObjectName: my-kube-scheduler
lockObjectNamespace: kube-system
---
apiVersion: v1
kind: ConfigMap
metadata:
name: my-scheduler-policy
namespace: kube-system
data:
policy.cfg : |
{
"kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [
{"name" : "PodFitsHostPorts"},
{"name" : "PodFitsResources"},
{"name" : "NoDiskConflict"},
{"name" : "MatchNodeSelector"},
{"name" : "HostName"}
],
"priorities" : [
{"name" : "LeastRequestedPriority", "weight" : 1},
{"name" : "BalancedResourceAllocation", "weight" : 1},
{"name" : "ServiceSpreadingPriority", "weight" : 1},
{"name" : "EqualPriority", "weight" : 1}
],
"extenders" : [{
"urlPrefix": "http://10.168.107.12:80/scheduler",
"filterVerb": "predicates/always_true",
"prioritizeVerb": "priorities/zero_score",
"preemptVerb": "preemption",
"bindVerb": "",
"weight": 1,
"enableHttps": false,
"nodeCacheCapable": false
}],
"hardPodAffinitySymmetricWeight" : 10
}复制代码
二、在my-kube-scheduler yaml文件中将configmaps:my-scheduler-config以文件的形式挂载到容器内/my-scheduler目录下,并在启动参数中指定--config=/my-scheduler/config.yaml,使用和默认调度器同样的镜像。
增长挂载:
一、编译扩展调度程序my-scheduler-extender镜像,如下为Dockerfile:
推送my-scheduler-extender镜像到harbor:
二、建立外部扩展程序my-scheduler-extender的deployment,以下为yaml描述:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-scheduler-extender
namespace: kube-system
labels:
app: my-scheduler-extender
spec:
replicas: 1
selector:
matchLabels:
app: my-scheduler-extender
template:
metadata:
labels:
app: my-scheduler-extender
spec:
containers:
- name: my-scheduler-extender
image: 192.168.26.46/k8s-deploy/my-scheduler-extender:v1.0
imagePullPolicy: Always
livenessProbe:
httpGet:
path: /version
port: 80
readinessProbe:
httpGet:
path: /version
port: 80
ports:
- containerPort: 80复制代码
查看my-kube-scheduler pod日志,加载到了policy里的extender信息,获取到了扩展调度器的接口地址:
建立一个nginx的pod,指定schedulerName为my-kube-scheduler:
查看扩展调度器pod日志,发现默认调度器会调用extender扩展调度器,以下为extender日志打印的入参、出参:
从而能够经过编写扩展调度程序,对默认调度器的预选和优选算法进行扩展。
参考
------------
本公众号免费提供csdn下载服务,海量IT学习资源,若是你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时咱们组建了一个技术交流群,里面有不少大佬,会不定时分享技术文章,若是你想来一块儿学习提升,能够公众号后台回复【2】,免费邀请加技术交流群互相学习提升,会不按期分享编程IT相关资源。
扫码关注,精彩内容第一时间推给你