中山制作企业网站,帝国cms使用教程,企业网站设计要点,网页视频怎么下载到手机本地视频背景
这半年一直做k8s相关的工作#xff0c;一直接触client-go controller-runtime kubebuilder#xff0c;但是很少有文章将这三个的区别说明白#xff0c;直接用框架是简单#xff0c;但是出了问题就是黑盒#xff0c;这不符合我的理念#xff0c;所以这篇文章从头说起…背景
这半年一直做k8s相关的工作一直接触client-go controller-runtime kubebuilder但是很少有文章将这三个的区别说明白直接用框架是简单但是出了问题就是黑盒这不符合我的理念所以这篇文章从头说起 。
sample-controller
官方的sample-controller就是最简单controller这个项目就用了client-go来实现controller 这是一张在网上被玩烂的图特别的好分为上下两部分上面就是client-go的informer机制informer机制网上一大堆我就不说了一句话总结所谓的 Informer就是一个自带缓存和索引机制可以触发 Handler 的客户端库下面就是实现controller的思路。我主要说下半部分6调度event handler就是调用AddFunction、UpdateFunction、DeleteFunction这几个方法做了什么事呢7就是将对象的key放到了workqueue工作队列中8就是不断的从工作队列读取key9就是根据key从indexer中取对象然后做处理。所以说如果自己写controller就要去实现下半部分。
controller-runtime controller-runtime我的理解就是方便用户去写custom controller的让用户的关注点只关心写处理逻辑也就是reconciler在看一下之前的那一张图678都是固定的套路只有handle object这一步才是处理逻辑所以controller干的事就是帮用户处理了678。congtroller中引入了几个新的概念 Manager需要管理器来创建和启动控制器可以有多个控制器与管理器关联sample-controller中需要自己controller : NewController和controller.Run现在manager帮你干了你只需要写run里面的东西
Reconciler用户需要关心的地方也就上图handle object那部分。上图9部分
Cache之前你的代码需要操作informer现在不需要了直接操作cache就可以前面我也说过Informer就是一个自带缓存和索引机制可以触发 Handler 的客户端库
Controller 一方面向 Informer 注册 eventHandler另一方面从队列中获取数据。controller 将从队列中获取数据并执行用户自定义的 Reconciler 功能。上图678部分
我把上图用大白话说一下controller向informer注册event handlerAddFunction、UpdateFunction、DeleteFunction这些handler就是将对象的key写到工作队列中cache负责把informer启动起来让informer list、watch k8s当有对象发生变化了informer调用之前注册进来的event handler将对象的key放到work queue工作队列中controller不断的从work queue工作队列中获取对象的key然后调用用户自己写的Reconciler程序。Reconciler的逻辑就是拿着key从cache中获取到对象然后将对象协调成期望的状态。 上面这张图总结了哪部分是client-go哪部分是controller-runtime哪部分是需要用户自己写代码的地方可以看出来只需要关心绿色的部分其实也就是之前handle object那部分剩下的controller-runtime都帮你干了看着图细想一下首先是manager的client和cache你写的哪个控制器都是在和k8s的api进行交互所以一个是和k8s连接的客户端一个是k8s对象的缓存数据controller 负责注册event handler并且从workqueue中读取对象最后负责调用用户自己写的reconciler。
kubebuilder
kubebuilder是对controller的进一层封装我们用代码说话
下面是controller-runtime的main
func main() {mgr, err : ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{})// in a real controller, wed create a new scheme for thiserr api.AddToScheme(mgr.GetScheme())if err ! nil {setupLog.Error(err, unable to add scheme)os.Exit(1)}err ctrl.NewControllerManagedBy(mgr).For(api.ChaosPod{}).Owns(corev1.Pod{}).Complete(reconciler{Client: mgr.GetClient(),scheme: mgr.GetScheme(),})if err : mgr.Start(ctrl.SetupSignalHandler()); err ! nil {setupLog.Error(err, problem running manager)os.Exit(1)}
}
下面是kubebuilder的main
func main() {mgr, err : ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme,})if err (controller.abcReconciler{Client: mgr.GetClient(),Scheme: mgr.GetScheme(),}).SetupWithManager(mgr); err ! nil {setupLog.Error(err, unable to create controller, controller, abcCluster)os.Exit(1)}setupLog.Info(starting manager)if err : mgr.Start(ctrl.SetupSignalHandler()); err ! nil {setupLog.Error(err, problem running manager)os.Exit(1)}
}有没有感觉非常的像貌似多了一个SetupWithManager点进去看一下
func (r *abcReconciler) SetupWithManager(mgr ctrl.Manager) error {return ctrl.NewControllerManagedBy(mgr).For(infrastructurev1alpha1.Abc{}).Complete(r)
}仔细对比一下是不是发现就是controller runtime里面的NewControllerManagedBy我没有再仔细看下去但是我觉得就是又对controller封装了一下提供给了开发者更简单的使用方式。
总结
具体的可以边用边看但是思路一定要理清不然上来就用kubebuilder出了问题真的不知道发生了什么。