文档章节

如何对kubernetes scheduler进行二次开发

WaltonWang
 WaltonWang
发布于 2017/05/13 09:08
字数 551
阅读 503
收藏 8
点赞 0
评论 1

更多关于kubernetes的深入文章,请看我csdn或者oschina的博客主页。

通过新增Predicates&Priorities Policies来扩展default scheduler

新增Predicate Policy

  • predicate Interface
plugin/pkg/scheduler/algorithm/types.go:31

// FitPredicate is a function that indicates if a pod fits into an existing node.
// The failure information is given by the error.

type FitPredicate func(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []PredicateFailureReason, error)
  • Implement a predicate func
func PodFitsHostNew(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) {
	if len(pod.Spec.NodeName) == 0 {
		return true, nil, nil
	}
	node := nodeInfo.Node()
	if node == nil {
		return false, nil, fmt.Errorf("node not found")
	}
	if pod.Spec.NodeName == node.Name {
		return true, nil, nil
	}
	return false, []algorithm.PredicateFailureReason{ErrPodNotMatchHostName}, nil
}
  • register the custom predicate policy with a custom name
plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go:47

func init() {
	...
	
	factory.RegisterAlgorithmProvider(factory.DefaultProvider, defaultPredicates(), defaultPriorities())
	// Cluster autoscaler friendly scheduling algorithm.
	factory.RegisterAlgorithmProvider(ClusterAutoscalerProvider, defaultPredicates(),
		copyAndReplace(defaultPriorities(), "LeastRequestedPriority", "MostRequestedPriority"))
	...
	
	factory.RegisterFitPredicate("CustomPredicatePolicy", predicates.PodFitsHostNew)
	
	...
}	
  • rebuild kube-scheduler and restart with flag of --policy-config-file

kube-scheduler xxxx --policy-config-file=/var/lib/kube-scheduler/policy.config

  • the content of --policy-config-file specified file
/var/lib/kube-scheduler/policy.config

{
"kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [
    {"name" : "CustomPredicatePolicy"}
    ],
"priorities" : [
    ]
}

新增Priority Policy

  • Priority Interface
/Users/garnett/workspace/go/src/k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/types.go

// PriorityMapFunction is a function that computes per-node results for a given node.

type PriorityMapFunction func(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error)
  • Implement a predicate func

  • register the custom predicate policy with a custom name

  • rebuild kube-scheduler and restart with flag of --policy-config-file

  • the content of --policy-config-file specified file

/var/lib/kube-scheduler/policy.config

{
"kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [
    ],
"priorities" : [
    {"name" : "CumtomPriorityPolicy", "weight" : 1}
    ]
}

新增custom scheduler,pod指定scheduler-name进行调度

  • A custom scheduler can be written in any language and can be as simple or complex as you need.
  • Specify the “scheduleName” in pod.spec
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  schedulerName: my-scheduler
  containers:
  - name: nginx
    image: nginx:1.10

Here is a very simple example of a custom scheduler written in Bash that assigns a node randomly. Note that you need to run this along with kubectl proxy for it to work.

kubectl proxy --port=8001

#!/bin/bash
SERVER='localhost:8001'
while true;
do
    for PODNAME in $(kubectl --server $SERVER get pods -o json | jq '.items[] | select(.spec.schedulerName == "my-scheduler") | select(.spec.nodeName == null) | .metadata.name' | tr -d '"')
;
    do
        NODES=($(kubectl --server $SERVER get nodes -o json | jq '.items[].metadata.name' | tr -d '"'))
        NUMNODES=${#NODES[@]}
        CHOSEN=${NODES[$[ $RANDOM % $NUMNODES ]]}
        curl --header "Content-Type:application/json" --request POST --data '{"apiVersion":"v1", "kind": "Binding", "metadata": {"name": "'$PODNAME'"}, "target": {"apiVersion": "v1", "kind"
: "Node", "name": "'$CHOSEN'"}}' http://$SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/
        echo "Assigned $PODNAME to $CHOSEN"
    done
    sleep 1
done

更多关于kubernetes的深入文章,请看我csdn或者oschina的博客主页。

© 著作权归作者所有

共有 人打赏支持
WaltonWang
粉丝 158
博文 88
码字总数 182269
作品 0
深圳
程序员
加载中

评论(1)

宝马320
宝马320
@linklogis@icloud.com @linklogis@icloud.com @WrBug
Kubernetes之scheduler模块源码分析

传送门 哈哈,隔了太长时间,网上已经有对应的分析,而且我看了以后觉得写的还真的挺好的,基本想要写的他都写的。 Kubernetes Scheduler原理解析 Kubernetes Scheduler源码分析 如何对kuber...

weixin_38975685 ⋅ 2017/09/29 ⋅ 0

Kubernetes系统架构简介[转]

1. 前言 Together we will ensure that Kubernetes is a strong and open container management framework for any application and in any environment, whether in a private, public or ......

长征2号 ⋅ 2017/07/04 ⋅ 0

容器化RDS:PersistentLocalVolumes和VolumeScheduling

容器化RDS系列文章: 容器化RDS:计算存储分离架构下的“Split-Brain” 容器化RDS:计算存储分离还是本地存储? 容器化RDS:你需要了解数据是如何被写"坏"的 数据库的高可用方案非常依赖底层...

Docker ⋅ 04/28 ⋅ 0

《Kubernetes集成外部服务实践》- 第三期Docker技术沙龙主题剖析系列【第一篇】

分享嘉宾:柴宗三,亚信大数据云平台部高级研发工程师。目前负责亚信DataFoundry大数据PaaS云平台。本文源自于3月12号《第三期Kubernetes沙龙》四个Topic之一,是《第三期kubernetes沙龙主题剖...

时速云 ⋅ 2016/03/16 ⋅ 0

openshift/origin工作记录(2)——RESTful编程接口使用

由于工作原因,需要对openshift进行二次开发,初步研究了一下RESTful编程接口使用。 本部分内容借鉴了开源项目https://github.com/fabric8io/kubernetes-client,目前是引用开源项目的jar包对...

huqigang ⋅ 2017/10/31 ⋅ 0

漫画 | Kubernetes带你一帆风顺去远航

译者注:伊阿宋(英:Jason,另译:杰森),古希腊神话人物。 原文链接:https://cloud.google.com/kubernetes-engine/kubernetes-comic/ 基于Kubernetes的容器云平台实践培训 width="632px...

m2l0zgssvc7r69efdtj ⋅ 2017/12/24 ⋅ 0

Kubernetes内部组件工作原理介绍

本篇文章讲述了Kubernetes内部组件的工作原理,及创建Pod的流程。如果你是运维人员或者是Kubernetes的使用者,你可以不需要知道Kubernetes的内部工作原理,但是如果你想理解Kubernetes内部的...

Docker ⋅ 04/25 ⋅ 0

伸缩Kubernetes到2500个节点中遇到的问题和解决方法

Kubernetes自从1.6起便号称可以承载5000个以上的节点,但是从数十到5000的路上,难免会遇到问题。 本片文章即分享Open API在kubernetes 5000之路上的经验,包括遇到的问题、尝试解决问题以及...

好雨云帮 ⋅ 04/24 ⋅ 0

使用二进制安装包部署kubernetes v1.9.8集群的参考手册

一、使用二进制方式部署k8s的Master节点 more /usr/lib/systemd/system/kube-apiserver.service more /usr/lib/systemd/system/kube-controller-manager.service more /usr/lib/systemd/sys......

watermelonbig ⋅ 05/24 ⋅ 0

K8S 1.9.0二进制包部署(二)

3、k8s master #############kube-apiserver cp kube-apiserver /usr/bin chmod 755 /usr/bin/kube-apiserver mkdir -p /app/kubernetes/conf mkdir -p /app/kubernetes/log vi /usr/lib/sy......

sai_2008 ⋅ 02/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部