kubernetes之kube-scheduler模块
泡一壶茶,点一根香,静坐阅读优秀的代码,感受生命的美好。
对于kubernetes的使用者来看,kube-scheduler模块到底是什么?
kube-scheduler是 Kubernetes 集群的默认调度器,并且是集群 控制面 的一部分。对每一个新创建的 Pod 或者是未被调度的 Pod,kube-scheduler 会过滤所有的node,然后选择一个最优的 Node 去运行这个 Pod。
首先,我们看一下kubernetes集群架构与组件图。
根据上图,对于scheduler模块。在看源码前想到了这么几个问题?
1.scheduler获取消息数据格式、输出数据格式?
2.社区有人说增加缓存能有效提高scheduler的效率,是否是真的?
从代码中获取问题结果:
scheduler代码
首先cmd入口,schduler.go:
package main
import ( "math/rand" "os" "time" "github.com/spf13/pflag" cliflag "k8s.io/component-base/cli/flag" "k8s.io/component-base/logs" _ "k8s.io/component-base/metrics/prometheus/clientgo" "k8s.io/kubernetes/cmd/kube-schedulkeyr/app" ) func main() { rand.Seed(time.Now().UnixNano())
//获取一个NewSchedulerCommand结构体
command := app.NewSchedulerCommand()
pflag.CommandLine.SetNormalizeFunc(cliflag.WordSepNormalizeFunc) // utilflag.InitFlags() logs.InitLogs() defer logs.FlushLogs() if err := command.Execute(); err != nil { os.Exit(1) } }
第二层入口:
command := app.NewSchedulerCommand()然而,app从这里引入:"k8s.io/kubernetes/cmd/kube-schedulkeyr/app"
可以追溯到文件app目录下的server.go:
函数:NewSchedulerCommand
// NewSchedulerCommand creates a *cobra.Command object with default parameters and registryOptions
//cobra是一个命令行启动框架.这里不做详细解释,了解更多可以看这个:https://github.com/spf13/cobra。 func NewSchedulerCommand(registryOptions ...Option) *cobra.Command { opts, err := options.NewOptions() if err != nil { klog.Fatalf("unable to initialize command options: %v", err) } cmd := &cobra.Command{ Use: "kube-scheduler", Long: `The Kubernetes scheduler is a policy-rich, topology-aware, workload-specific function that significantly impacts availability, performance, and capacity. The scheduler needs to take into account individual and collective resource requirements, quality of service requirements, hardware/software/policy constraints, affinity and anti-affinity specifications, data locality, inter-workload interference, deadlines, and so on. Workload-specific requirements will be exposed through the API as necessary. See [scheduling](https://kubernetes.io/docs/concepts/scheduling/) for more information about scheduling and the kube-scheduler component.`, Run: func(cmd *cobra.Command, args []string) { if err := runCommand(cmd, args, opts, registryOptions...); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } }, } fs := cmd.Flags() namedFlagSets := opts.Flags() verflag.AddFlags(namedFlagSets.FlagSet("global")) globalflag.AddGlobalFlags(namedFlagSets.FlagSet("global"), cmd.Name()) for _, f := range namedFlagSets.FlagSets { fs.AddFlagSet(f) } usageFmt := "Usage:\n %s\n" cols, _, _ := term.TerminalSize(cmd.OutOrStdout()) cmd.SetUsageFunc(func(cmd *cobra.Command) error { fmt.Fprintf(cmd.OutOrStderr(), usageFmt, cmd.UseLine()) cliflag.PrintSections(cmd.OutOrStderr(), namedFlagSets, cols) return nil }) cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) { fmt.Fprintf(cmd.OutOrStdout(), "%s\n\n"+usageFmt, cmd.Long, cmd.UseLine()) cliflag.PrintSections(cmd.OutOrStdout(), namedFlagSets, cols) }) cmd.MarkFlagFilename("config", "yaml", "yml", "json") return cmd }


浙公网安备 33010602011771号