Kubebuilder
kubebuilder的基础:controller
过程包含8个步骤:
- Reflector通过ListAndWatch方法去监听指定的Object;
func (r *Reflector) Run(stopCh <-chan struct{}) {
klog.V(3).Infof("Starting reflector %v (%s) from %s", r.expectedTypeName, r.resyncPeriod, r.name)
wait.Until(func() {
if err := r.ListAndWatch(stopCh); err != nil {
utilruntime.HandleError(err)
}
}, r.period, stopCh)
}
- Reflector会将所监听到的event,包括对object的Add,Update,Delete的操作push到DeltaFIFO这个queue中;
- Informer首先会解析event中的action和object;
- Informer将解析的object更新到local store,也就是本地cache中的数据更新;
- 然后Informer会执行Controller在初始化Infromer时注册的ResourceEventHandler(这些callback是可以自己修改的);
- ResourceEventHandler中注册的callback会将对应变化的object的key存入其初始化的一个workQueue;
- 最终controller会循环进行reconcile,就是从workQueue不停地pop key,然后去local store中取到对应的object,然后进行处理,最终多数情况会再通过client去更新这个object。
kubebuilder的封装
kubebuilder实际上是提供了对client-go进行封装的library(准确来说是runtime-controller),更加便利我们来开发k8s的operator。
kubebuilder还帮我们做了以下的额外工作:
- kubebuilder引入了manager这个概念,一个manager可以管理多个controller,而这些controller会共享manager的client;
- 如果manager挂掉或者停止了,所有的controller也会随之停止;
- kubebuilder使用一个map[GroupVersionKind]informer来管理这些controller,所以每个controller还是拥有其独立的workQueue,deltaFIFO,并且kubebuilder也已经帮我们实现了这部分代码;
- 我们主要需要做的开发,就是写Reconcile中的逻辑。
开发
git项目: https://github.com/kubernetes-sigs/kubebuilder
安装
# 到github release下载对应版本
curl -L -o kubebuilder "https://github.com/kubernetes-sigs/kubebuilder/releases/download/v3.6.0/kubebuilder_darwin_amd64"
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
开始一个项目
# create a project directory, and then run the init command.
mkdir project
cd project
# we'll use a domain of tutorial.kubebuilder.io,
# so all API groups will be <group>.tutorial.kubebuilder.io.
kubebuilder init --domain tutorial.kubebuilder.io --repo tutorial.kubebuilder.io/project