补充好基础知识后,上手实践才是最快的学习方法,所以先写一个validateadmission练练手。模拟一个生产需求,假设生产环境所有的deployment不允许单点,即副本数量不能少于2,如果少于2则不允许创建,且多个Kubernetes集群都有类似需求,那么这个场景用webhook实现就非常简单。

先上一下自己写的demo地址webhook demo,可以对照查看

思路

之前有提过webhook的调用逻辑,结合当前场景,大致上是以下几个步骤:

  • 创建一个tls 的webserver, 做好路由,路由绑定handler
  • handler 用于接收api-server发来的admission review
  • 创建一个ValidatingWebhookConfiguration,用于注册web server的url 以及 绑定证书。
  • web server 解析admission review ,根据信息做判断
  • 对结果进行处理,然后回调api-server
  • 创建完成

大致的流程就是以上几个步骤,其实非常简单,主要搞清楚几个结构体就可以了,下面开始操作:

// 启动HTTP服务mux := http.New()handle.InitHandle(mux)srv := &go_http.Server{Handler:      mux.GetRouter(),Addr:         fmt.Sprintf(":%d", port),TLSConfig: &tls.Config{Certificates: []tls.Certificate{cert},},WriteTimeout: 15 * time.Hour,ReadTimeout:  15 * time.Hour,}go srv.ListenAndServeTLS("", "")

入口就是一个简单的webserver, 指定好证书路径,以及加载mux路由即可。

func valiDateAdmission(res http.ResponseWriter, req *http.Request) {// 解析收到的报文reqContent, err := ioutil.ReadAll(req.Body)defer req.Body.Close()if err != nil {klog.Errorf("[webhook] 请求报文解析失败")common.ReqBodyInvalid(res)return}// 定义resp的报文var admissionResponse *admissionv1.AdmissionResponserequestedAdmissionReview := admissionv1.AdmissionReview{}// 对api-server传过来的报文做解析_, _, err = deserializer.Decode(reqContent, nil, &requestedAdmissionReview)if err != nil {klog.Errorf("[webhook] 请求报文解析失败: %v", err)admissionResponse = &admissionv1.AdmissionResponse{Result: &metav1.Status{Code:    http.StatusInternalServerError,Message: err.Error(),},}// 解析成功,进行具体的拦截} else {admissionResponse = controller.Validate(&requestedAdmissionReview)}// 构造返回的 AdmissionReview 这个结构体responseAdmissionReview := admissionv1.AdmissionReview{}// admission/v1responseAdmissionReview.APIVersion = requestedAdmissionReview.APIVersionresponseAdmissionReview.Kind = requestedAdmissionReview.Kindif admissionResponse != nil {responseAdmissionReview.Response = admissionResponseif requestedAdmissionReview.Request != nil { // 返回相同的 UIDresponseAdmissionReview.Response.UID = requestedAdmissionReview.Request.UID}}klog.Infof("[webhook] 回调api-server, 发送报文: %v",responseAdmissionReview.Response)// send responserespBytes, err := json.Marshal(responseAdmissionReview)if err != nil {klog.Errorf("[webhook] 无法解析回调报文: %v", err)http.Error(res, fmt.Sprintf("Can't write reponse: %v", err), http.StatusBadRequest)return}klog.Info("[webhook] 准备发送回包")if _, err := res.Write(respBytes); err != nil {klog.Errorf("[webhook] 无法发送回调报文: %v", err)http.Error(res, fmt.Sprintf("Can't write reponse: %v", err), http.StatusBadRequest)}
}

其中**admissionResponse=controller.Validate(&requestedAdmissionReview)**才是具体的拦截逻辑,前面的处理可以独立出来作为一个单独的装饰函数,因为都是用来解析admission review的

func Validate(ar *admissionv1.AdmissionReview) *admissionv1.AdmissionResponse {req := ar.Requestvar (allowed = truecode    = http.StatusOKmessage = "")

admission的具体结构可以看之前的文章,之前也有提到,拦截是否允许主要就是看allowed这个字段,之前的需求是判断副本数量,所以需要对admission进行解析

 var dep appsv1.Deploymentif err := json.Unmarshal(req.Object.Raw, &dep); err != nil {klog.Errorf("[webhook] 无法解析AdmissionReview object raw: %v", err)allowed = falsecode = http.StatusBadRequestreturn &admissionv1.AdmissionResponse{Allowed: allowed,Result: &metav1.Status{Code:    int32(code),Message: err.Error(),},}}

因为处理的是deployment, 所以需要对以appsv1.Deployment对结构体进行解析,然后进行判断

 // 处理真正的业务逻辑replicas := *dep.Spec.Replicasif replicas < 3 {klog.Infof("[webhook] deployment不满足最低副本数量,无法创建")allowed = falsecode = http.StatusForbiddenmessage = "need 3 replicas at least, create deployment failed"}

然后打包成docker镜像,以deployment 部署在kubernetes 集群内,然后进行部署一个service, 用于api-server的调用,之后部署ValidatingWebhookConfiguration

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:name: admission-registry
webhooks:
- name: zyx.test.admission-registryrules:- apiGroups:   ["apps"]apiVersions: ["v1"]operations:  ["CREATE"]#resources:   ["pods","deployments"]resources:   ["deployments"]clientConfig:service:namespace: defaultname: admission-registrypath: "/v1/api/validate"caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuakNDQW9hZ0F3SUJBZ0lVT2RVeWVCenVVcFdIenFvMGczOE5XeE1SNm9jd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1p6RUxNQWtHQTFVRUJoTUNRMDR4RVRBUEJnTlZCQWdUQ0ZOb1lXNW5hR0ZwTVJFd0R3WURWUVFIRXdoVAphR0Z1WjJoaGFURU1NQW9HQTFVRUNoTURhemh6TVE4d0RRWURWUVFMRXdaVGVYTjBaVzB4RXpBUkJnTlZCQU1UCkNtdDFZbVZ5Ym1WMFpYTXdIaGNOTWpFd05USTBNRGMwT1RBd1doY05Nall3TlRJek1EYzBPVEF3V2pCbk1Rc3cKQ1FZRFZRUUdFd0pEVGpFUk1BOEdBMVVFQ0JNSVUyaGhibWRvWVdreEVUQVBCZ05WQkFjVENGTm9ZVzVuYUdGcApNUXd3Q2dZRFZRUUtFd05yT0hNeER6QU5CZ05WQkFzVEJsTjVjM1JsYlRFVE1CRUdBMVVFQXhNS2EzVmlaWEp1ClpYUmxjekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTWJLT0Q5WGMzMDhlWlQKK0J2MGYzR3QxTGtzWk1jUXNUUG5rQXpWeVRQSDdFSkpORkVoVzI0UE8yNzgvaTNWcEdPNU12MVZCcW1rcGwrSgorZ1dwZW5TSDNIbTdsOTZmckt4TmRGWG94Y3VLaWNPOHhvVUVxWCt0cVIvR0toUGYrcjBCWXFUR1o1aVVCZGdVCjU0STJIQjREc1Exc0lCY1JBUms5WVJ5ZjRLYXRZVVEzdGRuNFRyNmFhUXg5OE9Gd1hUNXpiNktINVQ2MTNKdk8KUExpV0JNWUxUZG5WZ256ZzVXeDUreDkvV0FtaTJSK0JjTllLUjY0RWgzeWJZam5NeGtGL1JEMTZPSTlFOTJNRApEaVB6U09oemplQ3RIY1NRcStpTllIQzhzSUJlRFlxL256bTFDR0hTL1NpMDdZVFBjZTBXeE5RelRpMlM2dlZXCkdrWGVPaWNDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcKSFFZRFZSME9CQllFRlB0S2U2TXFoTjlLaEJ5S3Ntdy9sR3pZd25iL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQgpBUUFqNnVyVTVhS0I5MWZuQTF2dE1DVjZRVHFmenMrd1dFcHZVbElXOHdZYXVydDZPWUc1YkxFSHoyRUJJRXplCjMvcGM4ZUkvamJSU0JNZDJGbk9Sa0pVTmh5MDBBZE05MTRFUFo5Y0FIOFpGUVI1UTZCUmw1Qnl6Mk5jOHN3dGMKMmtraW0vWUJ4TkFFYnFLQjBhTmw0TW5LbTc3TzgzSXpwREN2SzBWdlRCVXJVYnlzd1l6d0lCaEZxSTl5ZUo2Zgo1U1JpemdrUHVYRG1qSlZiN092dzNTNkxRT1o4VmdJRS9wZGJvRTBsTHpmZ2pROWVDVFM0ZmRXSE9oNGp1TXJMCklqeG1pMHhOVVVkTXdPeFNvQlJKa3J3eU1Fa1FoN2swYmZROFdsRkFNenVST29RVmVraU1BNkhLeDdQOFd1UmUKYzhKRkVOVmk5VEVMTXkwWHpJNWhoOVlwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KadmissionReviewVersions: ["v1"]sideEffects: None

其中rules 就是对资源的限制条件,path是之前webserver的url, caBundle 是客户端的ca证书,cat **.pem | bare64即可。

个人公众号, 分享一些日常开发,运维工作中的日常以及一些学习感悟,欢迎大家互相学习,交流

Kubernetes开发(5)-validateadmission练手相关推荐

  1. Kubernetes开发(6)-MutatingAdmissionWebhook练手

    之前写了一个简单的webhook 的tls server,并且写了一个简单的validate的api 用于实现资源的拦截.之前有提到webhook有两类,第二类就是mutatingadmissionw ...

  2. 开发H5游戏练手, 黑暗堡垒-炼狱传奇H5 (一) 登陆界面开发

    项目介绍 使用JS lufylegend框架编写RPG游戏练手项目,首先展示几项目的效果图: 项目地址 https://github.com/mangenotwork/HABL-H5 介绍 lufyl ...

  3. 开发H5游戏练手, 黑暗堡垒-炼狱传奇H5 (三) 玩家信息,背包,商店,技能,任务,玩家菜单,游戏菜单,NPC对话与攻击怪物

    项目地址 https://github.com/mangenotwork/HABL-H5 基于 lufylegend 开发 lufylegend 框架官网 : http://www.lufylegen ...

  4. 开发H5游戏练手, 黑暗堡垒-炼狱传奇H5 (二) 游戏界面-地图与角色

    项目地址 https://github.com/mangenotwork/HABL-H5 基于 lufylegend 开发 lufylegend 框架官网 : http://www.lufylegen ...

  5. 水墨风格小程序/小程序云开发/小程序练手

    下拉刷新后的水墨风背景 其他页面: 诗集, 收藏夹. 小程序二维码 非常糟糕的源码: https://github.com/Gode-nice/–

  6. Android练手小项目---仿凤凰新闻app

    kanfang_demo 仿凤凰新闻app-GitHub:https://github.com/RealMoMo/FengHuangNews 最重要的事情放前面说,请用wifi测试,最好下载凤凰新闻a ...

  7. java技术分享主题_Java开发入门:适合新手练手的Java项目(附源码下载)

    Java作为一门古老的语言,已有20年左右的历史,这在发展日新月异的技术圈可以说是一个神话.虽然不少人曾抱怨Java语言就像老太太的裹脚布,又臭又长,有时写了500行都不能表达程序员的意图. 但从市场 ...

  8. Django个人博客开发练手demo笔记

    目录 序言 一.环境搭建.项目结构 二.设计阶段 三.创建数据库模型 四.使用后台管理系统 五.创建视图类 六.网站成型 七.问题修复 八.完整项目效果 九.其他 序言 Django是一个的pytho ...

  9. python开发小工具项目_给中级Python开发者的13个练手项目,适合你不?

    选自realpython 作者:Habeeb Shopeju 机器之心编译 参与:高璇 学习 Python 的基础知识是一种美妙的体验.但对于中级 Python 开发人员来说,很多项目要么过难,要么过 ...

最新文章

  1. Coggle加速计划:解决数据下载烦恼!
  2. 子程序与中断程序的异同_【干货】plc怎样理解中断功能,其作用是什么?
  3. 欧几里得距离网络_使用Tensorflow对象检测模型和OpenCV的社交距离和遮罩检测器...
  4. Docker-Compose 基础与实战,看这一篇就够了 | 原力计划
  5. 当前用户更改运行方式出现错误的解决办法
  6. 技嘉GA7PESH3主板,官网驱动下载,官方使用说明
  7. 机器学习会成为2017年大数据​分析的瓦解者吗?
  8. 设计Instagram
  9. Flutter:视频全屏切换
  10. html如何根据颜色排序,Excel技巧:按颜色排序或筛选
  11. 一文看不懂方差和标准差
  12. c语言 大小写 islower,C 库函数 islower() 使用方法及示例
  13. 大三学生HTML期末作业,网页制作作业——HTML+CSS+JavaScript饮品饮料茶(7页)
  14. 合同节水服务认证国内怎么申请?
  15. 计算机考试工作表怎么做表格步骤,计算机考试Excel表格中换行的方法
  16. 企业能源管控平台在工业能效提升行动中的作用
  17. PDF怎么编辑修改内容?分享两种编辑修改方法
  18. Final阶段基于spec评论作品
  19. 不可不学的摄影技巧之三(摄影小窍门)
  20. 【非参数统计】2.1广义符号检验(R语言)

热门文章

  1. Maya2013安装失败:Installing Microsoft Visual C++ 2005
  2. 周鸿祎:互联网公司未来的发展方向
  3. 太空乱游等待服务器响应,《太空乱游》游戏配置要求一览
  4. 基础shell脚本练习
  5. 空调控制面板工作原理?如何控制暖风和冷风?
  6. 【RocketMQ】RocketMQ快速入门
  7. 这道愚人节逻辑题足矣验证你是否拥有程序员的大脑!
  8. 一个公司亏损 20 年,却估值超 2 万亿,为什么?
  9. dreamweaver的php框架,Dreamweaver设计网页框架集
  10. python 表情包下载器,轻松下载上万个表情包、斗图不用愁