0、前置概念

WX20201224-152152@2x.png
WX20201224-152204@2x.png

1、控制器理念

  1. 现在有一种待编排的对象 X,它有一个对应的控制器。那么,我就可以用一段 Go 语言风格的伪代码,为你描述这个控制循环:
  1. for {
  2. 实际状态 := 获取集群中对象X的实际状态(Actual State
  3. 期望状态 := 获取集群中对象X的期望状态(Desired State
  4. if 实际状态 == 期望状态{
  5. 什么都不做
  6. } else {
  7. 执行编排动作,将实际状态调整为期望状态
  8. }
  9. }

在具体实现中,实际状态往往来自于 Kubernetes 集群本身
比如,kubelet 通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,或者控制器主动收集的它自己感兴趣的信息,这些都是常见的实际状态的来源。

而期望状态,一般来自于用户提交的 YAML 文件。
比如,Deployment 对象中 Replicas 字段的值。很明显,这些信息往往都保存在 Etcd 中。接下来,以 Deployment 为例,我和你简单描述一下它对控制器模型的实现:

  1. _ 1Deployment 控制器从 Etcd 中获取到所有携带了“app: nginx”标签的 Pod,然后统计它们的数量,这就是实际状态_<br />_ 2Deployment 对象的 Replicas 字段的值就是期望状态_<br />_ 3Deployment 控制器将两个状态做比较,然后根据比较结果,确定是创建 Pod,还是删除已有的 Pod_<br />_<br /> 可以看到,一个 Kubernetes 对象的主要编排逻辑,实际上是在第三步的“对比”阶段完成的。这个操作,通常被叫作调谐(_**Reconcile**_)。这个调谐的过程,则被称作“Reconcile Loop”(调谐循环)或者“Sync Loop”(同步循环)。
  2. 所以,如果你以后在文档或者社区中碰到这些词,都不要担心,它们其实指的都是同一个东西:控制循环。而调谐的最终结果,往往都是对被控制对象的某种写操作。比如,增加 Pod,删除已有的 Pod,或者更新 Pod 的某个字段。这也是 Kubernetes 项目“面向 API 对象编程”的一个直观体现。
  3. 其实,像 Deployment 这种控制器的设计原理,就是我们前面提到过的,“用一种对象管理另一种对象”的“艺术”。其中,这个控制器对象本身,负责定义被管理对象的期望状态。比如Deployment 里的 replicas=2 这个字段。
  4. 而被控制对象的定义,则来自于一个“模板”。比如,Deployment 里的 template 字段。
  5. 可以看到,Deployment 这个 template 字段里的内容,跟一个标准的 Pod 对象的 API 定义,丝毫不差。而所有被这个 Deployment 管理的 Pod 实例,其实都是根据这个 template 字段的内容创建出来的。
  6. Deployment 定义的 template 字段,在 Kubernetes 项目中有一个专有的名字,叫作 PodTemplatePod 模板)。<br /> <br /> 这个概念非常重要,因为后面我要讲解到的大多数控制器,都会使用 PodTemplate 来统一定义它所要管理的 Pod。更有意思的是,我们还会看到其他类型的对象模板,比如 Volume 的模板。至此,我们就可以对 Deployment 以及其他类似的控制器,做一个简单总结了:<br />_![72cc68d82237071898a1d149c8354b26.png](https://cdn.nlark.com/yuque/0/2020/png/1647962/1608789699477-b6c7d6a8-cdc1-4985-852d-3fc6e86ace3e.png#align=left&display=inline&height=1080&margin=%5Bobject%20Object%5D&name=72cc68d82237071898a1d149c8354b26.png&originHeight=1080&originWidth=1920&size=94198&status=done&style=none&width=1920)_<br /> 如上图所示,类似 Deployment 这样的一个控制器,实际上都是由上半部分的控制器定义(包括期望状态),加上下半部分的被控制对象的模板组成的。

2、如何开发自定义控制器

1、基于**k8s原生的code-generation
https://blog.csdn.net/boling_cavalry/article/details/88917818
2、基于kubebuilder开发**crd
https://cloudnative.to/kubebuilder/
https://blog.upweto.top/gitbooks/kubebuilder/
3、基于**operator-sdk开发**crd
https://jimmysong.io/kubernetes-handbook/develop/operator-sdk.html

3、一些优秀的控制器

1、openkruise(对k8s原生资源进行了功能增强)
https://github.com/openkruise/kruise
2、kubevela(基于oam模型设计的一套面向rd友好crd)
https://github.com/oam-dev/kubevela
3、pipeline(云原生pipeline)
https://github.com/tektoncd/pipeline
4、keda(微软开源弹性伸缩控制器)
https://github.com/kedacore/keda
5、operator集合
https://github.com/operator-framework/awesome-operators