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