k8s 内容庞大,今天我们希望能从 k8s 的架构和源码出发,构建一个学习 k8s 架构图。这样我们才能在后面深入的学习过程中,不至于忘记所有知识之间的联系,从而达到深入浅出学习 k8s 的目的。
1. kubernetes 架构
1.1 kubernetes 核心设计
Kubernetes 从 Google Borg 系统演化而来。因此从一开始就把关注点放到了如何编排、管理、调度用户提交的作业上。这个出发点来自于 Borg 的研究人员在论文中提到的一个非常重要的观点:运行在大规模集群中的各种任务之间,实际上存在着各种各样的关系。这些关系的处理,才是作业编排和管理系统最困难的地方。
Kubernetes 最主要的设计思想是,从更宏观的角度,以统一的方式来定义任务之间的各种关系,并且为将来支持更多种类的关系留有余地。
除了应用与应用之间的关系外,应用运行的形态是影响“如何容器化这个应用”的第二个重要因素。正是基于容器间关系和形态两个维度,Kubernetes 演化出了下面的核心功能:

当我们在使用这些核心功能时 Kubernetes 所推崇的使用方法是:
- 首先,通过一个“编排对象”,比如 Pod、Job、CronJob 等,来描述你试图管理的应用;
- 然后,再为它定义一些“服务对象”,比如 Service、Secret、Horizontal Pod Autoscaler(自动水平扩展器)等。这些对象,会负责具体的平台级功能。
这种使用方法,就是所谓的声明式 API。这种 API 对应的编排对象和服务对象,都是 Kubernetes 项目中的 API 对象(API Object)。
过去很多的集群管理项目(比如 Yarn、Mesos,以及 Swarm)所擅长的,都是把一个容器,按照某种规则,放置在某个最佳节点上运行起来。这种功能,我们称为“调度”。而 Kubernetes 项目所擅长的,是按照用户的意愿和整个系统的规则,完全自动化地处理好容器之间的各种关系。这种功能,就是我们经常听到的一个概念:编排。所以说,Kubernetes 项目的本质,是为用户提供一个具有普遍意义的容器编排工具。
1.2 k8s 架构图

Kubernetes 的架构由 Master 和 Node 两种节点组成,而这两种角色分别对应着控制节点和计算节点。
- 控制节点,即 Master 节点,由三个紧密协作的独立组件组合而成,它们分别是:
- 负责 API 服务的 kube-apiserver
- 负责调度的 kube-scheduler
- 负责容器编排的 kube-controller-manager
- 整个集群的持久化数据,则由 kube-apiserver 处理后保存在 Etcd 中
- 计算节点上最核心的部分,则是一个叫作 kubelet 的组件
- kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。这个交互所依赖的,是一个称作 CRI(Container Runtime Interface) 的远程调用接口,这个接口定义了容器运行时的各项核心操作
- 具体的容器运行时,比如 Docker 项目,则一般通过 OCI 这个容器运行时规范同底层的 Linux 操作系统进行交互,即:把 CRI 请求翻译成对 Linux 操作系统的调用(操作 Linux Namespace 和 Cgroups 等)
- kubelet 还通过 gRPC 协议同一个叫作 Device Plugin 的插件进行交互。这个插件,是 Kubernetes 项目用来管理 GPU 等宿主机物理设备的主要组件,也是基于 Kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能
- kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。这两个插件与 kubelet 进行交互的接口,分别是 CNI(Container Networking Interface) 和 CSI(Container Storage Interface) 。

2. k8s 源码结构
有了架构图,我们再来看看源码结构,看看架构与源码是如何对应起来。个人觉得结合代码的方式来学习 k8s 可以让我们更加结构化的理解 k8s 中的抽象概念,这样理解和记忆会更加深刻。对于 k8s 来说最终的就是源码下的 pkg 和 staging 两个目录。pkg 比较好理解,就是 k8s 的代码库,那 staging 是什么呢?k8s 允许我们做很多自定义开发,比如自定义控制器、webhook,staging 保存的就是为 k8s 做扩展开发时会用到的功能代码。staging 内的代码会被定义同步到其他 repo。pkg 也同样依赖 staging。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
$ ll pkg/
总用量 40
drwxrwxr-x. 12 tao tao 188 3月 4 22:08 api
drwxrwxr-x. 27 tao tao 4096 2月 28 20:32 apis
drwxrwxr-x. 4 tao tao 60 2月 28 20:32 auth
drwxrwxr-x. 2 tao tao 71 2月 28 20:32 capabilities
drwxrwxr-x. 5 tao tao 67 2月 28 20:32 client
drwxrwxr-x. 3 tao tao 68 2月 28 20:32 cloudprovider
drwxrwxr-x. 3 tao tao 19 2月 28 20:32 cluster
drwxrwxr-x. 33 tao tao 4096 2月 28 20:32 controller
drwxrwxr-x. 5 tao tao 4096 2月 28 20:32 controlplane
drwxrwxr-x. 7 tao tao 239 2月 28 20:32 credentialprovider
drwxrwxr-x. 2 tao tao 44 2月 28 20:32 features
drwxrwxr-x. 2 tao tao 65 2月 28 20:32 fieldpath
drwxrwxr-x. 3 tao tao 35 2月 28 20:32 generated
drwxrwxr-x. 6 tao tao 147 2月 28 20:32 kubeapiserver
drwxrwxr-x. 3 tao tao 73 2月 28 20:32 kubectl
drwxrwxr-x. 44 tao tao 4096 2月 28 20:32 kubelet
drwxrwxr-x. 2 tao tao 117 2月 28 20:32 kubemark
-rw-rw-r--. 1 tao tao 366 2月 28 20:32 OWNERS
drwxrwxr-x. 4 tao tao 161 2月 28 20:32 printers
drwxrwxr-x. 6 tao tao 181 2月 28 20:32 probe
drwxrwxr-x. 11 tao tao 4096 2月 28 20:32 proxy
drwxrwxr-x. 3 tao tao 16 2月 28 20:32 quota
drwxrwxr-x. 23 tao tao 4096 2月 28 20:32 registry
drwxrwxr-x. 2 tao tao 140 2月 28 20:32 routes
drwxrwxr-x. 9 tao tao 4096 2月 28 20:32 scheduler
drwxrwxr-x. 3 tao tao 36 2月 28 20:32 security
drwxrwxr-x. 2 tao tao 115 2月 28 20:32 securitycontext
drwxrwxr-x. 2 tao tao 182 2月 28 20:32 serviceaccount
drwxrwxr-x. 29 tao tao 4096 2月 28 20:32 util
drwxrwxr-x. 27 tao tao 4096 2月 28 20:32 volume
drwxrwxr-x. 3 tao tao 21 2月 28 20:32 windows
ll staging/src/k8s.io/
总用量 32
drwxrwxr-x. 28 tao tao 4096 2月 28 20:32 api
drwxrwxr-x. 8 tao tao 252 2月 28 20:32 apiextensions-apiserver
drwxrwxr-x. 5 tao tao 213 2月 28 20:32 apimachinery
drwxrwxr-x. 5 tao tao 236 2月 28 20:32 apiserver
drwxrwxr-x. 24 tao tao 4096 2月 28 20:32 client-go
drwxrwxr-x. 5 tao tao 211 2月 28 20:32 cli-runtime
drwxrwxr-x. 14 tao tao 4096 2月 28 20:32 cloud-provider
drwxrwxr-x. 5 tao tao 208 2月 28 20:32 cluster-bootstrap
drwxrwxr-x. 8 tao tao 4096 2月 28 20:32 code-generator
drwxrwxr-x. 13 tao tao 4096 2月 28 20:32 component-base
drwxrwxr-x. 9 tao tao 272 2月 28 20:32 component-helpers
drwxrwxr-x. 8 tao tao 252 2月 28 20:32 controller-manager
drwxrwxr-x. 4 tao tao 194 2月 28 20:32 cri-api
drwxrwxr-x. 4 tao tao 229 2月 28 20:32 csi-translation-lib
drwxrwxr-x. 7 tao tao 265 2月 28 20:32 dynamic-resource-allocation
drwxrwxr-x. 6 tao tao 222 2月 28 20:32 kms
drwxrwxr-x. 6 tao tao 224 2月 28 20:32 kube-aggregator
drwxrwxr-x. 4 tao tao 197 2月 28 20:32 kube-controller-manager
drwxrwxr-x. 7 tao tao 236 2月 28 20:32 kubectl
drwxrwxr-x. 5 tao tao 208 2月 28 20:32 kubelet
drwxrwxr-x. 4 tao tao 197 2月 28 20:32 kube-proxy
drwxrwxr-x. 5 tao tao 213 2月 28 20:32 kube-scheduler
drwxrwxr-x. 7 tao tao 210 2月 28 20:32 legacy-cloud-providers
drwxrwxr-x. 5 tao tao 206 2月 28 20:32 metrics
drwxrwxr-x. 3 tao tao 4096 2月 28 20:32 mount-utils
drwxrwxr-x. 5 tao tao 212 2月 28 20:32 noderesourcetopology-api
drwxrwxr-x. 10 tao tao 4096 2月 28 20:32 pod-security-admission
drwxrwxr-x. 7 tao tao 236 2月 28 20:32 sample-apiserver
drwxrwxr-x. 5 tao tao 232 2月 28 20:32 sample-cli-plugin
drwxrwxr-x. 7 tao tao 4096 2月 28 20:32 sample-controller
|
2.1 staging
apimachinery