带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析(十)-阿里云开发者社区

开发者社区> 人民邮电出版社> 正文

带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析(十)

简介: 带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析
+关注继续查看

3.3.6       WebHook

1. WebHook是什么

 

WebHook与过滤器的作用类似,任何对 CRD进行变更的操作都会交由 WebHook提前处理,处理完后,才会转给 Controller 继续处理,WebHook流程如图 3-6所示。

image.png

图 3—6WebHook 流程


 

根据 Kubernetes官方博客的介绍,WebHook 具有以下两个功能。

(1)  修改(Mutating):对CRD 进行修改,如为资源自动打标签等。

(2)  验证(Validating):对 CRD进行验证,如判断该字段的设定是否在取值范围内。引用 Kubernetes 官方博客的一张图来说明 Mutating及Validating 操作所在的位置,如

3-7所示。

 

 

 

 

 

 

 

 


 

具体说明如下。

image.png


图 3—7    Mutatng及 Vaidatng 严作所在的位置


(1)APIServer接收到 API请求。

(2)请求经过认证、鉴权。

(3)  执行 MutatingAdmission的 WebHookList。

(4)  对请求对象的 Schema进行校验。

(5)  执行 ValidatingAdmission的 WebHookList。

(6)  最后写入 ETCD。

 

2. Controller-runtime中的 WebHook框架

 

Controller-runtime为用户提供了一个简单快捷的WebHook框架,可通过该框架,快速创建 WebHook,并将处理函数注入 WebHookServer中,通过 WebHook 的处理函数,即可实现 CRD的修改和验证操作。

(1) Server的创建

通过Controller-runtime提供的WebHookServer包,可快速地构建出一个HTTPServer该 Server用于接收来自 Kube-APIServer的请求,并将请求转发到对应的 Handler进行处理。

WebHookServer主要用于保存注册的WebHook(见代码清单3-46)。

typeServerstruct{

...

//下⾯的webhooks会跟踪所有已注册的webhooks,以便进⾏依赖注⼊,并在重复的Webhook

注册时提供更好的告警

webhooksmap[string]http.Handler

...


}

 

开发者可通过 WebHook包中的 func(s*Server)Register(pathstring, hookhttp.Handler){},将开发好的 WebHook注册到 Server中,WebHook其实就是一个 HTTP请求的处理函数。

(2) Handler 的实现

开发者在实现 Handler的时候,只需要实现 WebHook包定义好的 Interface即可(见代码清单3-47)。

//HandlerFunc函数⽤来实现 Handler接⼝

typeHandlerFuncfunc(context.Context,Request)Response

 

在此基础上,WebHook包提供了 Handler 函数返回体的各种封装,开发者可基于这些封装实现自定义的业务逻辑。

对于 Admission的 WebHook,定义了两种最基本的返回体封装函数。

(1)  允许:该封装函数表明对CRD的某种操作是允许的(见代码清单3-48

funcAllowed(reasonstring)Response{returnValidationResponse(true,reason)


}

 

(2)   拒绝:该封装函数表明对CRD的某种操作是拒绝的(见代码清单3-49)。

funcDenied(reasonstring)Response{returnValidationResponse(false,reason) 

}

 

 

3. WebHook示例

 基于前面的介绍,本节将给出一个WebHook的简单示例(见代码清单3-50)。

//创建Manager

mgr,err:=ctrl.NewManager(ctrl.GetConfigOrDie(),ctrl.Options{})

iferr!=nil{

panic(err)

}

 

//创建 WebHook ServerhookServer:= &Server{

Port:8443,

}

if err:=mgr.Add(hookServer);err!=nil{panic(err)

}

 

//创建 WebHook的处理函数

validatingHook:=&Admission{

Handler:admission.HandlerFunc(func(ctxcontext.Context,req

AdmissionRequest)AdmissionResponse{

returnDenied("noneshallpass!")

}),

}

 

//Handler注册到WebHookServer

hookServer.Register("/validating",validatingHook)

 

//启动Manager,启动 WebHookServer

err=mgr.Start(ctrl.SetupSignalHandler())iferr!=nil{

panic(err)

}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android开发中StackOverflowError
<div class="edit_area" id="330486" style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> <div style="margin:17pt 0cm 16.5pt"><strong><span style="font-size:32px">Andro
1089 0
iOS开发中 关于阿里云服务器的使用与安全策略 韩俊强的博客
使用背景:         云服务已经很多年了,早期没能加入使用云大军中的一员,后来后悔莫及。2015年记得当时没办法租用的虚拟主机三天两天挂了,导致我认认真真的考虑了一次,觉得还是要使用云服务器! 从免费的主机屋学习版到各种虚拟机的实验,再到之前是用300元左右买的别人的虚拟主机,空间有几G,感觉还行,正好又值他们搞活动,买两年送一年!预存还有返还!心动了,就没有任何考虑就预存了一千块! 开始的几个月感觉还行,速度什么的还过得去,就没去管网站的事了。
1268 0
iOS开发笔记 6、View Controllers【MVC】
了解和熟悉这个对后续的开发很重要。   关于这个的参考资料 ■ View Controller Programming Guide for iOS For information about structuring and managing your application’s user interface http://developer.
861 0
IOS开发之----UIScrollView滚动条视图的使用
<p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; border:0px; list-style:none; word-wrap:normal; word-break:normal; color:rgb(73,73,73); font-size:13px; font-family
1162 0
C# WinForm多线程开发(二) ThreadPool 与 Timer
原文地址:点击打开链接 [摘要]本文介绍C# WinForm多线程开发之ThreadPool 与 Timer,并提供详细的示例代码供参考。 本文接上文,继续探讨WinForm中的多线程问题,再次主要探讨threadpool 和timer。 一 、ThreadPool 线程池(ThreadPool)是一种相对较简单的方法,它适应于一些需要多个线程而又较短任务(如一些常
1332 0
iOS开发笔记 5、开发工具Xcode,Inteface Builder
开发工具使用Mac的安装盘或从apple站点下载 Xcode 开发代码使用 扩展名的分类 application delegate 需要处理的内容 ƒAt launch time, it must create an application’s windows and display them to the user.
589 0
安卓开发之ScrollView
当界面不足以将所有的内容显示出来的时候便导致下面的部分内容无法显示出来 所有加上ScrollView 来讲要显示的内容放入之中便可以实现上下滚动界面内容 但是当要显示多个控件的时候会出错  原因是ScrollView只能有一个子控件  解决方法就是 用一个LinearLayout(或者别的布局)...
545 0
472
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载