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()方法!
今天就讲到这里,我们下一讲寻找调度算法!
102 - kube-scheduler源码分析 - cobra-寻找scheduler组件启动函数的更多相关文章
- external-provisioner源码分析(3)-组件启动参数分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(3)-组件启动参数分析 本文将对extern ...
- ceph-csi源码分析(2)-组件启动参数分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(2)-组件启动参数分析 ceph-csi组件的源码分析分为五部分: ...
- scheduler源码分析——preempt抢占
前言 之前探讨scheduler的调度流程时,提及过preempt抢占机制,它发生在预选调度失败的时候,当时由于篇幅限制就没有展开细说. 回顾一下抢占流程的主要逻辑在DefaultPreemption ...
- [源码分析] 消息队列 Kombu 之 启动过程
[源码分析] 消息队列 Kombu 之 启动过程 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 是 ...
- ceph-csi组件源码分析(1)-组件介绍与部署yaml分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi组件源码分析(1)-组件介绍与部署yaml分析 基于tag v3.0.0 ht ...
- scheduler源码分析——调度流程
前言 当api-server处理完一个pod的创建请求后,此时可以通过kubectl把pod get出来,但是pod的状态是Pending.在这个Pod能运行在节点上之前,它还需要经过schedule ...
- scrapy-redis(调度器Scheduler源码分析)
settings里面的配置:'''当下面配置了这个(scrapy-redis)时候,下面的调度器已经配置在scrapy-redis里面了'''##########连接配置######## REDIS_ ...
- angular源码分析:图解angular的启动流程
今天做了一些图来说明angular,由于angular实在太复杂了,不知道用什么图表示比较好,所以就胡乱画了一些,希望有人能看得懂. 一.源码文件编译合并顺序图 二.angular.module函数功 ...
- angular源码分析:angular中各种常用函数,比较省代码的各种小技巧
angular的工具函数 在angular的API文档中,在最前面就是讲的就是angular的工具函数,下面列出来 angular.bind //用户将函数和对象绑定在一起,返回一个新的函数 angu ...
- 【Canal源码分析】Canal Server的启动和停止过程
本文主要解析下canal server的启动过程,希望能有所收获. 一.序列图 1.1 启动 1.2 停止 二.源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...
随机推荐
- bzoj5153&uoj348 【WC2018】州区划分
五十分就是裸的O(3^n)子集dp. $$f[S]*{w[S]^{p}}=\sum_{T \in S}{f[T]*{w[S-T]^{p}}}$$ 然后我们考虑优化这个dp,我们发现这是子集卷积的形式, ...
- html中 submit和button的区别?
前者是向数据库提交表单 后者是单纯的按钮功能
- kolla 多节点部署 openstack
kolla 介绍 简介 kolla 的使命是为 openstack 云平台提供生产级别的.开箱即用的交付能力.kolla 的基本思想是一切皆容器,将所有服务基于 Docker 运行,并且保证一个容器只 ...
- ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE
前言 这是一篇纯技术干货的分享文章,FreeSql 已经基本完成 .NETCore 最方便的 ORM 使命,我们正在筹备生态的建立,比如 ABP 中如何使用 FreeSql 的实现,需要各种各样的扩展 ...
- windows下,读取快捷方式lnk所指向的路径
BOOL GetLnkFileName( OUT PWSTR pLnkName, OUT PWSTR OepnFileNameBuufer, IN DWORD OpenFileNameBufferSi ...
- Sql的分库分表,及优化
对Sql细节优化 在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考. 首先给大家介绍一下分库分表 分库分表 分库 垂直分库 业务 ...
- d3实现家族树
1. jQuery和CSS3支持移动手机的DOM元素移动和缩放插件:panzoom 2.拖动:jqueryUI-Draggable.touchpunch 3.图表:echart.heig ...
- 解决Dynamics 365使用JS调用Web API时报no property value was found in the payload 错误。
摘要: 微软动态CRM专家罗勇 ,回复323或者20190421可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 碰到如下报错: message: "An er ...
- 基于geoserver样式服务实现图层要素自定义配图
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 在一般项目中,我们将geoserver样式服务中的SLD各参 ...
- maven pom 引入本地jar包
maven pom 引入本地jar包 在pom.xml同级目录下新建lib文件夹,并放入本地jar包. 配置Jar包的dependency,包括groupId,artifactId,version三个 ...