0%

深入剖析K8s筆記(Controller模型)

0x00 前言

Q:何为Controller?

A:把K8s想象成大吊臂,Container是一个个集装箱,Pod是对Container的吊环。Controller就是大吊臂的各种工作逻辑。例如:

1
2
3
4
5
6
7
8
9
它们都归kube-controller-manager管

$ cd kubernetes/pkg/controller/
$ ls -d */
deployment/ job/ podautoscaler/
cloud/ disruption/ namespace/
replicaset/ serviceaccount/ volume/
cronjob/ garbagecollector/ nodelifecycle/ replication/ statefulset/ daemon/
...

0x01 Controller工作原理

1
2
3
4
5
6
7
8
for {
实际状态 := 获取集群中对象X的实际状态(Actual State) <---kubelet汇报 / etcd / Controller自己收集
期望状态 := 获取集群中对象X的期望状态(Desired State)<---Yaml文件的定义 /
if 实际状态 == 期望状态{
什么都不做
} else {
执行编排动作,将实际状态调整为期望状态
}
  • Control loop: 整个Controller的工作过程其实分为三步。用Deployment举例
    • 获取实际状态,读etcd然后统计其个数。
    • 获取期望状态,关注Replicas字段。
    • 调谐(Reconcile),循环(Reconcile Loop / Sync Loop)确定编排动作(创建 / 删除)。

上述过程,充分体现“声明式”,“面向API对象编程”。

0x02 Controller的对象

Controller自身是个对象,但是对象也有对象。

画个楚河汉界。一图胜千言。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1                   
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 ^^^ Controller的定义(期望状态
----------------------------自制分割线用于界限-----------------------------
template: vvv Controller的对象(被控制对象模版PodTemplate
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

0x03 总结

简单介绍了Controller,它的概念,工作原理,还有它的对象。

Welcome to my other publishing channels