如何更改kubernetes中的默认kube调度程序

如何更改kubernetes中的默认kube调度程序,kubernetes,kube-scheduler,Kubernetes,Kube Scheduler,说明如何运行多个计划程序。但我无法理解默认调度程序是如何决定的?它是否基于-领导人选举选项 我可以告诉Kubernetes使用我的自定义计划程序作为默认计划程序而不是kube计划程序吗? 除了Pod/Deployment规范中的schedulerName之外,还有其他方法指定调度器吗 如何确定默认调度程序?它是基于领导人选举吗 选择权 不,它不是基于-leader elect,即在启用leader election的情况下运行同一计划程序的多个复制副本,以便在任何给定时间点只有一个副本充当lea

说明如何运行多个计划程序。但我无法理解默认调度程序是如何决定的?它是否基于-领导人选举选项

我可以告诉Kubernetes使用我的自定义计划程序作为默认计划程序而不是kube计划程序吗? 除了Pod/Deployment规范中的schedulerName之外,还有其他方法指定调度器吗

如何确定默认调度程序?它是基于领导人选举吗 选择权

不,它不是基于-leader elect,即在启用leader election的情况下运行同一计划程序的多个复制副本,以便在任何给定时间点只有一个副本充当leader

我可以告诉Kubernetes使用我的自定义计划程序作为默认计划程序吗 而不是kube调度器

您不需要在kubernetes群集级别更改默认调度程序,因为您可以告诉kubernetes在pod规范中使用您的自定义调度程序。下面的示例使用我的调度程序而不是默认调度程序

上述pod将由我的调度程序而不是默认的kube调度程序进行调度。如果省略schedulerName,则默认情况下它将被调度

默认情况下,将创建一个调度程序名为default scheduler的配置文件 创建。此配置文件包括上述默认插件。 声明多个配置文件时,每个配置文件都有一个唯一的计划程序名称 这些都是必需的

如果Pod未指定调度程序名称,kube apiserver将对其进行设置 默认调度程序。因此,使用此计划程序名称的配置文件 应该存在以安排这些吊舱

因此,您可以将现有的kube调度程序替换为名为default scheduler的调度程序

用/etc/kubernetes/manifests/kube-scheduler.yaml或 编辑kube计划程序部署并更改映像 如何确定默认调度程序?它是基于领导人选举吗 选择权

不,它不是基于-leader elect,即在启用leader election的情况下运行同一计划程序的多个复制副本,以便在任何给定时间点只有一个副本充当leader

我可以告诉Kubernetes使用我的自定义计划程序作为默认计划程序吗 而不是kube调度器

您不需要在kubernetes群集级别更改默认调度程序,因为您可以告诉kubernetes在pod规范中使用您的自定义调度程序。下面的示例使用我的调度程序而不是默认调度程序

上述pod将由我的调度程序而不是默认的kube调度程序进行调度。如果省略schedulerName,则默认情况下它将被调度

默认情况下,将创建一个调度程序名为default scheduler的配置文件 创建。此配置文件包括上述默认插件。 声明多个配置文件时,每个配置文件都有一个唯一的计划程序名称 这些都是必需的

如果Pod未指定调度程序名称,kube apiserver将对其进行设置 默认调度程序。因此,使用此计划程序名称的配置文件 应该存在以安排这些吊舱

因此,您可以将现有的kube调度程序替换为名为default scheduler的调度程序

用/etc/kubernetes/manifests/kube-scheduler.yaml或 编辑kube计划程序部署并更改映像
首先确保配置了自定义计划程序,并确保禁用-leader elect=false。你们可以在pod的“规格”部分使用它,就像这样

spec: 
  containers:
  - image: nginx
    name: nginx
  schedulerName: your-scheduler-name

首先确保配置了自定义计划程序,并确保禁用-leader elect=false。你们可以在pod的“规格”部分使用它,就像这样

spec: 
  containers:
  - image: nginx
    name: nginx
  schedulerName: your-scheduler-name

我还需要用一个自定义的Kubernetes调度器替换默认的Kubernetes调度器。我是这样做的

我认为这是答案的主要部分。我移动或删除了文件etc/kubernetes/manifests/kube-scheduler.yaml。这将禁用或删除默认的Kubernetes调度程序。此外,您可以通过在删除文件之前和之后运行kubectl get po-n kube system | grep-i调度程序来检查它是否被删除

现在默认的调度程序被禁用了,我有了一个自定义的调度程序—一个执行调度的python脚本。我只是运行它。下面是脚本。它不是很干净,但应该能用。你可以随意调整它。请注意,在清理脚本之后,我没有尝试运行它。可能存在小错误


我还需要用一个自定义的Kubernetes调度器替换默认的Kubernetes调度器。我是这样做的

我认为这是答案的主要部分。我移动或删除了文件etc/kubernetes/manifests/kube-scheduler.yaml。这将禁用或删除默认的Kubernetes调度程序。此外,您可以通过在删除文件之前和之后运行kubectl get po-n kube system | grep-i调度程序来检查它是否被删除

现在默认的调度程序被禁用了,我有了一个自定义的调度程序pyt 完成日程安排的脚本。我只是运行它。下面是脚本。它不是很干净,但应该能用。你可以随意调整它。请注意,在清理脚本之后,我没有尝试运行它。可能存在小错误


如果我希望所有pod/deploy都使用我的调度程序,该怎么办。除了schedulerName,还有其他指定调度器的方法吗?您可以在/etc/kubernetes/manifests中的kube调度器的静态pod yaml中用自己的调度器docker映像替换调度器docker映像。这将使您的调度程序成为整个系统中任何pod的默认设置cluster@ArghyaSadhu我希望你的回答能详细一点。我还想更改所有POD的默认调度程序。您提供了两个高级说明。我需要有关如何执行这些操作的详细信息。如果您使用诸如“头盔图表”之类的工具,则可以提供schedulerName。无法通过kubernetes cmds提供schedulerName。@Netro我使用的是舵图OpenWhisk。我无法更改创建的pod的schedulerName参数。如果我希望所有pod/deploy都使用我的计划程序,该怎么办。除了schedulerName,还有其他指定调度器的方法吗?您可以在/etc/kubernetes/manifests中的kube调度器的静态pod yaml中用自己的调度器docker映像替换调度器docker映像。这将使您的调度程序成为整个系统中任何pod的默认设置cluster@ArghyaSadhu我希望你的回答能详细一点。我还想更改所有POD的默认调度程序。您提供了两个高级说明。我需要有关如何执行这些操作的详细信息。如果您使用诸如“头盔图表”之类的工具,则可以提供schedulerName。无法通过kubernetes cmds提供schedulerName。@Netro我使用的是舵图OpenWhisk。我无法更改创建的pod的schedulerName参数。如果我希望所有pod/deploy都使用我的计划程序,该怎么办。?除了schedulerName@Netro之外,是否还有其他方法可以指定调度程序?如果我希望所有pod/deploy都使用我的调度程序,该怎么办。?除了schedulerName@Netro之外,还有其他方法可以指定schedulerName@Netro以外的其他计划程序吗?到目前为止,代码不可能使用它。@Netro这是我的参考资料:但它不是现成的。我不得不调整它,直到它成为答案。谢谢代码的功劳。@Netro这是我的参考资料:但它不是开箱即用的。我不得不调整它,直到它成为答案。谢谢
#!/usr/bin/env python

import time
import random
import json

from kubernetes import client, config, watch

config.load_kube_config()
v1 = client.CoreV1Api()

def get_request_time(hostname):
    # You can do some magic here.
    print("returning 1.2")
    return 1.2

def best_request_time(nodes):
    if not nodes:
        return []
    node_times = [get_request_time(hostname) for hostname in nodes]
    best_node = nodes[node_times.index(min(node_times)) + 1]
    print("Best node: " + best_node)
    return best_node


def nodes_available():
    ready_nodes = []
    for n in v1.list_node().items:
            # This loops over the nodes available. n is the node. We are trying to schedule the pod on one of those nodes.
            for status in n.status.conditions:
                if status.status == "True" and status.type == "Ready":
                    ready_nodes.append(n.metadata.name)
    return ready_nodes


def scheduler(name, node, namespace="<YOUR-NAMESPACE-HERE"): # You can use "default" as a namespace.
    target=client.V1ObjectReference()
    target.kind="Node"
    target.apiVersion="v1"
    target.name= node
    meta=client.V1ObjectMeta()
    meta.name=name
    body=client.V1Binding(target=target)
    body.metadata=meta
    return v1.create_namespaced_binding(namespace, body, _preload_content=False)

def main():
    w = watch.Watch()
    for event in w.stream(v1.list_namespaced_pod, "<YOUR-NAMESPACE-HERE>"):
        # We get an "event" whenever a pod needs to be scheduled
        if event['object'].status.phase == "Pending": # and event['object'].spec.scheduler_name == scheduler_name:
            try:
                arg2 = best_request_time(nodes_available())
                print("Scheduling " + event['object'].metadata.name)
                res = scheduler(event['object'].metadata.name, arg2)
            except client.rest.ApiException as e:
                print("exception")
                print(json.loads(e.body)['message'])

if __name__ == '__main__':
    main()