102 - kube-scheduler源码分析 - cobra-寻找scheduler组件启动函数
main函数在哪里?
看到这个go文件时大家是不是有一种找到入口的欣喜,同时有一种难以言表的郁闷,为什么那么短?获取一个command,然后执行一个Execute()就运行了?好像是这么回事,然后点开了Execute()方法:
越往下看越郁闷,咋那么难。。。
这时候看一下我们在哪里,可以发现当前路径是:
D:/go/src/k8s.io/kubernetes/vendor/github.com/spf13/cobra/command.go:790
尴尬,一开始就陷入了3方库。点开NewSchedulerCommand()函数看看呢:
到这里好像我们发现了什么,cobra是个什么东西?似乎cobra影响了整个代码结构,获取command是cobra的Command对象,最后的Execute()方法也是cobra提供的方法。于是不难发现,这是一个绕不过去的三方库,我们得先花点力气查查cobra是什么!
cobra是什么?
我们可以在github上看到这个项目
来自spf13,看来是精品!上图的英文介绍里可以看到一点消息:A Commander for modern Go CLI interactions
然后浏览一下README.md(建议大家到github上认真看一下这个说明文档),我们大致可以看出来
天哪,那么多知名开源go项目,k8s生态的etcd、docker、之上的openshift等等居然都用了cobra!明显这些项目都用了cobra当做“脚手架”,也就是入口风格会很像!spf13写的pflag等都是大名鼎鼎的轮子中的精品啊,看来cobra很值得稍微深入一下,如果自己开发命令行工具,需要用到子命令和flag的话,spf13的cobra和pflag是不二之选了。
一句话介绍cobra,然后我们简单实践一下:支持子命令行模式和复杂flag的时髦命令行程序脚手架!
cobra程序长什么样?
要写个demo,当然得先install cobra. 作为一只gopher,我相信大家install 一个github上的go项目是没有压力的,此中无非可能遇到网络问题,go get不行就git clone,缺啥找啥,最终下载完是这样的:
下面我们试着写一个小小的cobra程序:
如上命令,cobra告诉我们application is ready at xxx,所以我们看一下本地生成了些什么:
本地自动创建好了一个项目,我们看一下main.go里面是什么:
是不是有点小激动?和kube-scheduler的入口一样一样的!我们运行如下命令来添加2个command:
我们打开version.go稍微修改一下:
发现没有,当我们执行一个命令时,对应的command中Run方法会被执行!我们最后看一个子命令的玩法:
怎么样,轻轻松松写了一个支持多级命令的程序,后面一张图可以看到上面我们输入命令中serverCmd的含义:
下面看kube-scheduler中对应的Run在哪里?
cmd/kube-scheduler/app/server.go:322 func NewSchedulerCommand() *cobra.Command
继续看一下Run:后面是什么:
这个Run()方法继续跟一下:
是不是发现好像接近真相了?
这个server.Run()我们继续看看:
太和谐了!这个注释也可以直观看到这就是运行SchedulerServer的入口,这个函数接收到stop信息前会一直运行下去,也就是一直运行着的kube-scheduler!!!
我们最后回头看一下main.go
是不是很好理解了?第一个红框中设置Run()方法中需要做什么,后面的Execute()方法其实就是运行了前面定义的Run()方法!
今天就讲到这里,我们下一讲寻找调度算法!