一个Controller至少跟踪一种Kubernetes中的资源类型。这些资源对象必须有一个spec字段,表示对象的目标状态, Controller负责把把对象的当前状态变为(接近)目标状态。Controller 经常需要通过API server发消息达到自己的目的。


Kubernetes自带一些内置的Controller,这些Controller运行在 kube-controller-manager 里面。 这些Controller提供了重要的核心能力:


Deployment controller 和 Job controller 是Kubernetes的内置controller, 这些controller保证了我们通过kubectl命令行部署,改变了Deployment,Job以后, 这些资源能够按照我们的命令转变成期望的状态。


Controller可以运行在 control plane意外,以扩展kubernetes。 我们也可以写自己的kubernetes。 我们自己实现的controller一般是一组pods,但也有可能是kubernetes 集群外部的服务,这完全取决于controller的目的和功能。


controller要监听一个队列里面的事件, 有两种类型的事件可以监听, 核心事件,客户定义事件。 核心事件是kubernetes自带的资源事件(例如pods)。


如果要监听客户自定义的资源,首先要写代码自定义资源(CRD), 然后在写相应的controller handler。


image1








https://trstringer.com/extending-k8s-custom-controllers/