这周开始会分享和解析我在阅读kubernetes源码时的一些理解和想法,争取每周更新一篇,目的是在阅读后用最通俗易懂的方法把其中的各种抽象封装,设计思想讲明白。第一篇首先是项目的结构组织,需要知道哪个目录是做什么的,后续讲解才能更方便,阅读时才会更加清晰。
首先介绍两个概念
- 声明式API : 我们常说k8s是声明式api,那他到底是什么意思?一个简单的理解,就是我们有一个遥控器,天气热的时候需要把空调温度从28度调低到24度,我们按遥控器把温度按成24度,就可以等空调把温度降下来,而不用关心空调内部是怎么把温度降下来的。也可以理解为我需要你帮我做点事,但是我只告诉你我需要你做什么,不是你应该怎么做。声明式api与命令式api的区别在于,命令式关注如何做,声明式关注做什么。
- reconcile : 也叫调谐,是一个电路电子相关的概念,但在k8s中,是控制器模式的核心逻辑。意思就是在一个控制器循环中获取一个对象的实际状态和期望状态,然后通过逻辑判断是否需要进行调谐,将不符合期望状态的对象进行调谐,执行编排动作,令不符合期望的对象调整为期望状态。
接下来介绍项目的结构组成,后续的代码都会基于release1.26
- api: 主要是定义了一些api规则以及openapi-spec
- build: 主要是一些.sh脚本,镜像,具体可以看里面的readme
- CHANGELOG: 每次release的变更内容
- cluster:主要是一些addon插件和脚本
- cmd:整个项目的入口,在这里通过cobra这个包生成命令然后拉起各个组件,通俗来说就是main包
- docs:无实际内容
- hack:一系列大而全的脚本,多数是e2e test
- LICENSE:无太多有用的实际内容
- logo:一些jpg,png图片,无太多实际内容
- pkg:cmd调用的实际业务逻辑在此处,整个系统非常多逻辑都在此处,做了很多抽象及实现
- plugin:认证相关的插件,又称3A,
admission,authenticator,authorizer - staging: 会同步到其他repository的代码,里面有很多底层的实现,通常与pkg目录进行联动
- test:测试相关的代码
- third_party: 第三方相关的东西,不需要太关注
- vendor:一些依赖包
- other:剩下的一堆大多是规范文件,感兴趣可以查看
下一篇会开始分析k8s组件中的源码