总结:调度扩展自带默认调度器,融合了多项节点预选和最优调度算法,可以满足常见调度场景的需求。 为了实现适合您业务场景的调度,您需要扩展调度器。 请参阅实现增强调度程序的第三种解决方案。 保证并增强调度程序通信。
kube-scheduler调度扩展
Kubernetes自带了一个默认的调度器kube-scheduler,它包含了很多内置的节点出版社 -调度算法的选择和优化,满足常见调度场景的要求。 但在某些特殊场景下,默认的调度器无法满足您复杂的调度需求。 为了实现适合您业务场景的调度,您需要扩展调度器。
背景
中间件Redis容器化后,同一个节点上不能有两个master,同一个节点上可以有主从对也是不可能的。 Elasticsearch容器化后,同一个节点上不能有两个数据实例。 在这种场景下,默认调度器内置的预选和优化算法无法满足您的需求。 有以下三种选择:
将新的调度算法添加到默认调度程序中并重新编译映像。 最后,运行该镜像的实例被用作 kubernetes 集群调度器。
要实现一个满足自己业务场景的调度器、编译镜像、运行程序,请参见kube-scheduler。 向您的 kubernetes 集群添加一个独立的调度程序。 在 pod 实例中的 spec.schedulerName 中指定应由调度程序调度的调度程序。
实现调度扩展:默认调度器 kube- 调度器在预选期间调用此扩展来过滤节点。 在选择时调用此扩展器以对节点进行评分,或在绑定操作期间调用此扩展器以执行绑定操作。
评估以上三种方法:
第一:将自己的调度算法添加到默认调度器 kube-scheduler 中。随着 Kubernetes 版本的升级,原生代码的侵入性更大,维护成本也更高。
第二:默认的调度器包含了很多好的调度算法,包括: 检查节点资源是否充足;端口是否被占用。 该卷是否已被其他 Pod 挂载。 亲和性;如果你完全使用自己开发的调度器程序,你可能会失去一个更好的调度解决方案,同时仍然满足现实场景的调度需求,除非你将默认调度器的算法集成到你自己的独立调度器中。 这绝对是不现实的。
第三种方法:通过启动参数策略设置选择一些预先选定的参数。 在优化调度算法的同时,还可以调用外部扩展调度器的算法来计算最优参数。 调度节点。 无需更改 kube- 调度程序代码。 要将默认调度程序与高级调度程序结合起来,只需将配置文件添加到启动参数中即可。 调度器是相互关联的。
参见:
https://github.com/kubernetes...
因此采用第三种方案。 扩展调度程序。
整体架构
kube-scheduler在调度Pod实例时,首先需要获取三个节点信息:Node1、Node2、Node3。 Default 预选阶段会筛选出符合要求的节点,并调用扩展的预选算法来选择剩余的节点。 假设Node3资源不足,在预选阶段被排除。 预选后,只剩下Node1和Node2。 节点1和节点2进入kube-调度器,在默认优化阶段进行节点评分,并调用增强调度器中的最优算法进行评分。 kube-scheduler 对所有算法的评分结果进行加权求和,将得分最高的节点作为 pod。 最后,我们绑定节点,kube-scheduler调用apiserver执行绑定操作。
实现步骤实现增强型调度器代码
根据实际业务调度场景创建增强型调度器程序代码。预选逻辑、优化逻辑:
实现预选接口。 输入参数为schedulederapi.ExtenderArgs,输出参数为schedulederapi.ExtenderFilterResult。
实现首选接口。 输入参数为schedulederapi.ExtenderArgs,输出参数为schedulederapi.HostPriorityList。
公开http接口。 :
参考:
https://github.com/ll83744879...
默认调度程序部署
使用 kubernetes 集群中已存在名为 default-scheduler 的默认调度程序。 下面创建一个名为 my-kube-scheduler 的调度器,这样就不会影响集群的正常调度功能。 该调度程序与默认的-相同。 除了调度程序启动参数不同之外,图像相同。
1. 创建一个名为 my-scheduler-config 的配置映射。 data下的config.yaml文件指定了调度器的一些参数,如leader选举、调度算法策略选择(指定不同的configmap),并将调度器命名为 my-kube- 指定为调度器。
类似地,为 my-scheduler-policy 创建配置映射。 这指定选择哪些预选和首选策略、urlPrefix、扩展预选 URI、扩展首选 URI 和扩展。 外部扩展调度程序。 Pod优先级抢占URI、扩展绑定URI、扩展优化算法权重等
确保 my-kube-scheduler 和扩展调度程序之间的通信。
apiVersion: v1kind: ConfigMapmetadata: 名称: my-scheduler-config 命名空间: kube-systemdata: config.yaml: | apiVersion: kubescheduler.config.k8s.io/v1alpha1 类型: KubeSchedulerConfiguration 调度程序名称: my[ k4 ] kube-scheduler 算法来源:policy:configMap:namespace:kube-系统名称:my-scheduler-policyleaderElection:leaderElect:falselockObjectName:my-kube-schedulerlockObjectNamespace:kube -system---apiVersion:v1kind:ConfigMapmetadata:名称:my-scheduler-policy命名空间:kube-systemdata:policy.cfg:|{“kind”:“Policy ", "apiVersion" : "v1", "谓词" : [ {"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": "抢占", "bindVerb": "" , "weight": 1, "enableHttps": false, "nodeCacheCapable": false }], "hardPodAffinitySymmetricWeight": 10 }
2. 在我的-kube-scheduler yaml 文件中,configmap添加。 my-scheduler-config 作为文件安装在容器的 /my-scheduler 目录中,并指定 -- ]conf 作为启动参数。ig=/my-scheduler/config.yaml,使用与默认调度程序相同的镜像。
添加挂载:
创建和部署增强型调度程序映像
1. 编译扩展调度程序 my-scheduler-extender 映像。 下面是 Dockerfile:
将 my-scheduler-extender 镜像推送到harbor:
2. 为外部扩展程序 my-scheduler-extender 创建部署,如下所示: yaml 描述:
apiVersion: apps/ v1kind: Deploymentmetadata: name: my-scheduler[ k4]extender 命名空间: kube-系统标签: app: my-scheduler-extenderspec: 副本: 1 选择器: matchLabels: app: my-scheduler -extender 模板: 元数据: 标签: App: my- ]scheduler-extender 规范: 容器:- 名称:my-scheduler-extender 镜像:192.168.26.46/k8s-deploy /my-scheduler-extender:v1.0 imagePullPolicy : 始终livenessProbe: httpGet: 路径: /version 端口: 80 readinessProbe: httpGet: 路径: /version 端口: 80 ports: -containerPort: 80
验证
查看我的-将 kube- 调度器 Pod 日志加载到策略的扩展器信息中,以获取扩展调度器接口地址。
创建nginx pod并指定schedulerName。 as my[ k4]kube-scheduler:
查看扩展调度程序 Pod 日志并验证默认调度程序是否调用了 Extender 扩展调度程序。 以下是打印到扩展器日志的输入参数和输出。 参考:
因此,可以通过创建扩展调度器来扩展默认调度器的预选和优化算法。
评论前必须登录!
注册