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启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...
随机推荐
- BZOJ_4892_[Tjoi2017]dna_哈希
BZOJ_4892_[Tjoi2017]dna_哈希 Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的 性状,但是研究人员 ...
- 为什么说JAVA中要慎重使用继承
JAVA中使用到继承就会有两个无法回避的缺点: 打破了封装性,迫使开发者去了解超类的实现细节,子类和超类耦合. 超类更新后可能会导致错误. 继承打破了封装性 关于这一点,下面是一个详细的例子(来源于E ...
- 循环神经网络之LSTM和GRU
看了一些LSTM的博客,都推荐看colah写的博客<Understanding LSTM Networks> 来学习LSTM,我也找来看了,写得还是比较好懂的,它把LSTM的工作流程从输入 ...
- RabbitMQ和Kafka到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...
- 工厂模式讲解, 引入Spring IOC
目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { ...
- 目标检测 anchor 理解笔记
anchor在计算机视觉中有锚点或锚框,目标检测中常出现的anchor box是锚框,表示固定的参考框. 目标检测的任务: 在哪里有东西 难点: 目标的类别不确定.数量不确定.位置不确定.尺度不确定 ...
- Nginx技术进阶详讲
Nginx技术进阶详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 并发数问题 讲到并发数这个概念,想必各位应该都知道是什么意思,就是同时访问一个项目,就比我们现在做的一些项目完 ...
- 浅谈MySQL架构体系
一 数据库和数据库实例 在MySQL的学习研究中,存在两个非常容易混淆的概念,即数据库和数据库实例.在MySQL中,数据库和数据库实例定义如下: 数据库:存储数据的集合: 数据库实例:操作数据库的集 ...
- MySQL 四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- Restframe_work 回顾记忆集
目录 Restframe_work 回顾记忆集 rest_framework主要功能介绍 rest_framework主要模块介绍 记忆集 错题集 混淆集 重点集 难点集 Restframe_work ...