前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从源码解析kube-scheduler默认的配置

从源码解析kube-scheduler默认的配置

作者头像
Walton
发布2018-04-13 16:25:29
1.1K0
发布2018-04-13 16:25:29
举报
文章被收录于专栏:KubernetesKubernetes

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

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

代码语言:javascript
复制
--- 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 = true
	s := SchedulerServer{
		KubeSchedulerConfiguration: cfg,
	}
	return &s
}

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

代码语言:javascript
复制
--- 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。

代码语言:javascript
复制
---- 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"
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档