2019独角兽企业重金招聘Python工程师标准>>>

本文作为Kubernetes Scheduler源码分析的番外篇,补充一个方面的分析:从源码层面解析kube-scheduler的默认配置是怎么做的。

从头来看,在kube-scheduler的main函数中,s := options.NewSchedulerServer()创建SchedulerServer时,是按照默认参数创建的。

--- plugin/cmd/kube-scheduler/scheduler.go:30 ---func main() {s := options.NewSchedulerServer()s.AddFlags(pflag.CommandLine)flag.InitFlags()logs.InitLogs()defer logs.FlushLogs()verflag.PrintAndExitIfRequested()if err := app.Run(s); err != nil {glog.Fatalf("scheduler app failed to run: %v", err)}
}--- plugin/cmd/kube-scheduler/app/options/options.go:44 ---// NewSchedulerServer creates a new SchedulerServer with default parameters
func NewSchedulerServer() *SchedulerServer {versioned := &v1alpha1.KubeSchedulerConfiguration{}api.Scheme.Default(versioned)cfg := componentconfig.KubeSchedulerConfiguration{}api.Scheme.Convert(versioned, &cfg, nil)cfg.LeaderElection.LeaderElect = trues := SchedulerServer{KubeSchedulerConfiguration: cfg,}return &s
}

上面NewSchedulerServerapi.Scheme.Default(versioned)就是设置默认参数的操作。看看Default(...)的代码:

--- pkg/runtime/scheme.go:439 ---// Default sets defaults on the provided Object.
func (s *Scheme) Default(src Object) {if fn, ok := s.defaulterFuncs[reflect.TypeOf(src)]; ok {fn(src)}
}

原来Default(...)做的工作就是从Scheme.defaulterFuncs这个Map中获取&v1alpha1.KubeSchedulerConfiguration{}这个type对应的defaultFunc fn,并执行fn(&v1alpha1.KubeSchedulerConfiguration{})来完成默认参数的配置。

OK,那么问题来了。这些type对应的defaultFunc是怎么register到Scheme.defaulterFuncs这个Map中的呢?

答案就在pkg/apis/componentconfig/v1alpha1/register.go中定义的全局变量SchemeBuilder。SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes, addDefaultingFuncs)在创建SchemeBuilder时就调用了addDefaultFuncs函数。注册defaultFunc的工作应该就是在addDefaultingFuncs方法中实现的。

看看addDefaultingFuncs的实现,果不其然啊.SetDefaults_KubeSchedulerConfiguration就是&v1alpha1.KubeSchedulerConfiguration{}对应的defaultFuncs。

---- pkg/apis/componentconfig/v1alpha1/register.go ----var (SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes, addDefaultingFuncs)AddToScheme   = SchemeBuilder.AddToScheme
)---- pkg/apis/componentconfig/v1alpha1/defaults.go -----func addDefaultingFuncs(scheme *kruntime.Scheme) error {RegisterDefaults(scheme)return scheme.AddDefaultingFuncs(SetDefaults_KubeProxyConfiguration,SetDefaults_KubeSchedulerConfiguration,SetDefaults_LeaderElectionConfiguration,SetDefaults_KubeletConfiguration,)
}func SetDefaults_KubeSchedulerConfiguration(obj *KubeSchedulerConfiguration) {if obj.Port == 0 {obj.Port = ports.SchedulerPort}if obj.Address == "" {obj.Address = "0.0.0.0"}if obj.AlgorithmProvider == "" {obj.AlgorithmProvider = "DefaultProvider"}if obj.ContentType == "" {obj.ContentType = "application/vnd.kubernetes.protobuf"}if obj.KubeAPIQPS == 0 {obj.KubeAPIQPS = 50.0}if obj.KubeAPIBurst == 0 {obj.KubeAPIBurst = 100}if obj.SchedulerName == "" {obj.SchedulerName = api.DefaultSchedulerName}if obj.HardPodAffinitySymmetricWeight == 0 {obj.HardPodAffinitySymmetricWeight = api.DefaultHardPodAffinitySymmetricWeight}if obj.FailureDomains == "" {obj.FailureDomains = api.DefaultFailureDomains}
}

再结合plugin/cmd/kube-scheduler/app/options/options.go:57定义的AddFlags,可得kube-scheduler的默认配置如下:

  • port = 10251
  • address = "0.0.0.0"
  • algorithm-provider = "DefaultProvider"
  • content-type = "application/vnd.kubernetes.protobuf"
  • kube-api-qps = 50
  • kube-api-burst = 100
  • scheduler-name = "default-scheduler"
  • hard-pod-affinity-symmetric-weight = 1
  • failure-domains = "kubernetes.io/hostname,failure-domain.beta.kubernetes.io/zone,failure-domain.beta.kubernetes.io/region"

转载于:https://my.oschina.net/jxcdwangtao/blog/827747

从源码解析kube-scheduler默认的配置相关推荐

  1. 源码解析Spring Boot2默认数据库连接池HikariCP(高性能原因分析)

    现在市面上的数据库连接池非常多,其中HikariCP被Sping Boot2选中为默认的数据库连接池,且体积仅有152kb 为何选择HikariCP? 高性能,可以PK掉其它所有连接池,这个原因就足够 ...

  2. 【详解】Ribbon 负载均衡服务调用原理及默认轮询负载均衡算法源码解析、手写

    Ribbon 负载均衡服务调用 一.什么是 Ribbon 二.LB负载均衡(Load Balancer)是什么 1.Ribbon 本地负载均衡客户端 VS Nginx 服务端负载均衡的区别 2.LB负 ...

  3. react源码解析15.schedulerLane

    react源码解析15.scheduler&Lane 视频讲解(高效学习):进入学习 往期文章: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 ...

  4. tns03505 无法解析名称_SpringBootWeb源码解析SpringMVC自动配置

    SpringMVC自动配置 在 Spring Boot 中引入了 spring-boot-starter-web 依赖,并完成了 DispatcherServlet 的自动配置之后,便会通过 WebM ...

  5. .Net Core 源码解析

    .Net core 源码解析 启动代码 创建并配置主机Builder CreateDefaultBuilder分析 Host类-用于产生初始的builder静态类 IHostBuilder转变成IWe ...

  6. Soul网关源码解析目录

    Soul网关源码解析目录 Soul网关源码解析文章列表     对用Java写的高性能网关:Soul,进行一波学习和研究,下面是相关的文章记录 掘金 了解与初步运行 Soul网关源码解析(一) 概览 ...

  7. abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析

    老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的D ...

  8. quartz源码解析--转

    quartz源码解析(一)  . http://ssuupv.blog.163.com/blog//146156722013829111028966/ 任何个人.任何企业.任何行业都会有作业调度的需求 ...

  9. 【Vue.js源码解析 一】-- 响应式原理

    前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:建议通过左侧导航栏进行阅读 课程目标 Vue.js 的静态成员和实例成员初始化过程 首次渲染的过程 数据响应式原理 – 最核心的特性之一 准备工作 ...

  10. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

    女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...

最新文章

  1. android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
  2. 单元测试命名最佳实践[关闭]
  3. Linux redis安装教程,Linux 下redis5.0.0安装教程详解
  4. ***远程连接MYSQL提示1130 - Host is not allowed to connect to this MySQL server
  5. 介绍微软一个罕为人知的无敌命令
  6. java usb 无驱打印_Windows Usb 无驱动打印
  7. 中职计算机英语课件ppt,语文版中职英语(基础模块 上册)Unit 7《Computers》ppt课件1.ppt...
  8. 计算机速录学什么,学速录需要哪些能力
  9. Ubuntu 关闭服务详解
  10. envi神经网络分类原理,ENVI神经网络分类
  11. 苹果手机回收价格怎么查询
  12. 【java】模拟物流快递系统程序设计
  13. 【vue】【开源】vue开源电商项目hello-mall嗨喽商城
  14. Linux共享库概述
  15. Django之Cookie和 Session
  16. oracle查询值的字符串长度、字节长度、大小写字母转换
  17. 【一周搞定计算机网络】计算机网络第5章(运输层)
  18. Linux 进程管理之进程调度与切换
  19. 关于Oralce OAM/OIM及与P6/Unifier 集成SSO的想法
  20. 【MQTT基础篇(十四)】MQTT心跳机制

热门文章

  1. 多功能数字钟c语言单片机PPT,单片机多功能数字时钟设计电路大全(五款单片机多功能数字时钟设计电路)...
  2. 搭建java web框架_基于springboot搭建的web系统架构的方法步骤
  3. mysql:多表查询方式
  4. iphone开机白苹果_iphone白苹果原因是什么 iphone白苹果解决方法【介绍】
  5. html java对象_Java遇见HTML——JSP篇之JSP内置对象(下)
  6. es 怎么验证是否安装成功_ElasticSearch(ES)预警服务 Watcher安装以及探究
  7. 计算机专业基础 -- Spring系列框架相关基础知识
  8. 人月神话阅读笔记(2)
  9. Linux之进程管理基础概念
  10. 和我一起学Effective Java之创建和销毁对象