kubebuilder(6)webhook

news2024/11/24 19:58:53

operator中的webhook也是很重要的一块功能。也是相对比较独立的模块,所以放在后面讲。

webhook是一个callback,注册到k8s的api-server上。当某个特定的时间发生时,api server就会查询注册的webhook,并根据一些逻辑确认转发消息给某个webhook

在k8s中,有3类webhook,admission webhook, authorization webhook 和 CRD conversion webhook.

在kubebuilder的底层controller-runtime框架里,支持admission webhooks and CRD conversion webhooks。

这篇笔记讲的是admission webhook。(以下的webhook就是指admission webhook)。CRD conversion webhooks用于多版本api转换时,目前入门阶段先不讨论这个话题。

admission  webhook又可以分成2类。

一种是校验类的webhook,只读取信息,做校验判断,不会改变消息,称为validating类型。这里的校验就可以写复杂的业务了,前面的代码里我们也配置过简单的validation校验。

// +kubebuilder:validation:Required
Image string `json:"image,omitempty"`

另一种就是可修改对象的webhook,比如设置默认值功能,称为mutating类型。

执行顺序

先执行mutating webhook,后执行validating webhook

就是说先设置,后校验。不需要担心,校验完了之后,另一个webhook又修改了值。

工作流

fdf6dddb37185f648d8e470ab47ed173.jpeg


  1. 用户创建一个CRD的实例
  2. k8s api-server将这个请求转发给对应的webhook
  3. webhook完成默认的参数配置操作,并进行一些参数校验操作。成功之后将cr返回给api-server。api-server进行落库
  4. 我们编写的controller的在后台监控cr,拉取cr内容,并执行我们编写的逻辑
  5. cr的执行结果同步回api-server

创建webhook

和创建api一样,webhook也由kubebuilder创建脚手架代码。

我们在之前的代码框架上继续操作。

kubebuilder create webhook --group tutorial --version v1 --kind Demo --defaulting --programmatic-validation

--defaulting 是会创建配置默认值的webhook

--programmatic-validation 创建有校验功能的webhook

kubebuilder的参数

Flags:
--conversion if set, scaffold the conversion webhook
--defaulting if set, scaffold the defaulting webhook
--force attempt to create resource even if it already exists
--group string resource Group
-h, --help help for webhook
--kind string resource Kind
--plural string resource irregular plural form
--programmatic-validation if set, scaffold the validating webhook
--version string resource Version

--conversion 就是创建CRD conversion webhooks。用于多版本api转换时,现在先不用管。

执行完之后,看看生成的代码

80f35abda06a0dc11392ad7dea008016.jpeg

image-20240318145925949

查看main.go

dc4f9d843d7132bcf78776cc6694b725.jpeg

image-20240318151327123

作用就是在manager中注册了我们的webhook

业务代码

更重要的文件是生成的这个webhook文件,我们的业务代码是写在这里的

b2d6648040cec92d00fcbd3d17cc4fa3.jpeg

image-20240318152519441

a1b3f2bdabd9b416756f7ca6d0d30bcc.jpeg

image-20240318154234686

我们的Demo实现了webhook.Defaulter接口。即拥有了配置crd的默认值的能力。

稍后我们在这个Default()方法里编写配置默认值的操作。

f7d17305555e308bdcf35360d88a18c2.jpeg

image-20240318154438377

我们的Demo实现了webhook.Validator接口,在crd进行增删改时可以进行验证操作

简单实现几个方法

func (r *Demo) Default() {
demolog.Info("default", "name", r.Name)

// TODO(user): fill in your defaulting logic.
if r.Spec.Replicas == nil {
r.Spec.Replicas = new(int32)
*r.Spec.Replicas = 1
demolog.Info("配置默认值", "replicas", *r.Spec.Replicas)
}
}
// 创建和更新调一下validate方法
func (r *Demo) ValidateCreate() error {
demolog.Info("validate create", "name", r.Name)

// TODO(user): fill in your validation logic upon object creation.
// 调用 r.validate() 方法,来验证对象的合法性。
return r.validate()
}

func (r *Demo) validate() error {
var allErrs field.ErrorList
if *r.Spec.Replicas > 10 {
err := field.Invalid(field.NewPath("spec").Child("replicas"),
*r.Spec.Replicas,
"副本数不能大于10")

allErrs = append(allErrs, err)
}

if len(allErrs) == 0 {
demolog.Info("参数合法")
return nil
}

return apierrors.NewInvalid(schema.GroupKind{
Group: "tutorial",
Kind: "Demo"},
r.Name, allErrs)
}

在部署webhook前,还需要修改下配置

在config/default/kustomization.yaml中

144d794deb38348edb2045b00332515c.jpeg

image-20240318173558821

注释全都放开

在config/crd/kustomization.yaml中

f09ada5ef30ecfdb65fee2872ea1e873.jpeg

image-20240318173642764

注释放开

部署前准备

安装cert-manager

因为api-server是通过https调用webhook,所以需要部署cert-manager来自动管理证书。

这也是kubebuilder官方建议的方案

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.3/cert-manager.yaml

918e27e391e8bddd91b240d899ee2bbd.jpeg

image-20240320171742770

因为我的测试环境是1.18的k8s,所以选择1.7版本的cert manager。

232a3f2d167dbdff187f17821a43b596.jpeg

image-20240320171848151

清理环境

先把之前测试的资源全部删除

删除测试demo

kubectl delete -f config/samples/tutorial_v1_demo.yaml

删除operator

kubectl delete -f demo-operator.yaml

删除crd

make uninstall

部署

make install
make docker-build docker-push IMG=harbor-test.xxx.net/paas/demo-operator:2.0
make deploy IMG=harbor-test.xxx.net/paas/demo-operator:2.0

15cb38c8ee2a9c078c0f903f5cec7951.jpeg

image-20240320173017108

测试

测试默认值功能

修改一下之前的yaml,去掉replicas字段

apiVersion: tutorial.demo.com/v1
kind: Demo
metadata:
namespace: demo
name: demo-sample
spec:
image: nginx:1.22
svcName: demo-ng

查看manager的日志

a376abaa274fd298f8ed06ea43046b39.jpeg

image-20240320173733830

调用了配置默认值的代码

测试参数校验功能

将yaml中的replicas字段设置为15,超过我们的最大值

[root@paas-m-k8s-master-1 demo-operator]# kubectl apply -f config/samples/tutorial_v1_demo.yaml
The Demo "demo-sample" is invalid: spec.replicas: Invalid value: 15: 副本数不能大于10

直接报错

查看日志

16dedf6e0c89ce767e8eee80cf68af62.jpeg

image-20240320174235546

进行了校验


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1652765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音小店是什么?它和直播带货有什么区别和联系?一篇详解!

大家好,我是电商糖果 在网上大家都说抖音的流量大,在抖音做电商比较赚钱。 可是有很多人对抖音电商并不了解。 甚至搞不懂抖音小店是什么?它和直播带货的区别和联系也不清楚。 下面,糖果就来给大家好好解答一下这个问题。 抖音…

Educational Codeforces Round 165 (Div. 2) A~E

A.Two Friends (思维) 题意: 小 A A A想开一个派对。他有 n n n个朋友,他希望至少有 2 2 2个朋友参加他的派对。 i i i 这个朋友最好的朋友是 p i p_i pi​ 。所有的 p i p_i pi​ 都是不同的,对于每一个 i ∈ [ 1 , n ] i \in [1, n] …

HTTP深度指南:协议结构、请求方法与状态码

详解HTTP HTTP教程HTTP消息结构HTTP状态码HTTP和HTTPS HTTP教程 HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于分布式、协作式、超媒体信息系统的应用层协议。* HTTP是一个基于TCP/IP通信协议来传递数据的(HTML文…

【源码】[完美接单]亲测双端获取通讯录、相册、短信定位源码

源码介绍 无hb源码,需要反编译。 此款修复了逻辑,现在全部能获取。包括华为鸿蒙。 安卓可获取:短信定位相册通讯录 IOS可获取:定位相册通讯录 源码截图 CD:获取方式联系小编 微信:uucodes 公众号&…

7天精通Web APIs——-Bom操作(理论+实战)(第五天)

一、window对象 1.1 window对象和bom的关系 首先理解dom和bom之间的关系 显然bom的范围比较大 bom的全称为浏览器对象模型 window是bom的核心对象,window里面有很多属性和方法,用于实现浏览器与 JavaScript 代码之间的交互。作为 JavaScript 的全局对…

Vue中使用$t(‘xxx‘)实现中英文切换;

(原文链接) 介绍 {{$t(key)}} :是VueI18n插件提供的函数,主要用于根据当前语言环境返回对应的翻译文本,以便在页面上显示多语言内容。 key:作为参数传递给函数$t()的字符串,用于指定需要翻译的…

快速入门 Postman Mock Server 的使用

Postman 作为一个功能强大的 API 开发工具,凭借 Mock Servers 功能,使得开发者能够轻松而高效地模拟服务器环境,加快开发与测试进程。 启动 Mock Servers 服务 当你在 Postman 中创建一个新的项目时,系统默认并不会显示 Mock Se…

Python爬虫之selenium,有验证码模拟登录

一. 前言 在学习Selenium之前,通过request.get()或者.post(),很难获取网站所加载的动态数据,通过Selenium强大的自动化功能、多浏览器支持、跨平台支持等优点,让我轻松获取一些之前很难获取的数据,这次的案例也是结合之前的所学知…

Window server 2012搭建FTP

禁止废话,直接上图 !!! 注意:如果点击角色添加保存: Server Manager Error - Server Manager is collecting inventory data. Wizard will be available after data collection finishes 解决方案&#x…

Baidu Comate——让软件研发更高效、更智能

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:给自己一个梦想,给世界一个惊喜。 🎅**学习目标: 坚持每一次的学习打卡 文章目录 一、Baidu Co…

JAVA链表相关习题2

1.反转一个单链表。 . - 力扣(LeetCode) //2在1前面 //1在3前面 //ListNode curhead.next //head.nextnull(翻转后头节点变为最后一个节点) // while(cur ! null) { //记录 当前需要翻转节点的下一个节点 ListNode curNext cu…

9、String类型和基本数据类型转换(Java)

String类型和基本数据类型转换 1、基本数据类型转String类型2、String类型转基本数据类型⭐ 1、基本数据类型转String类型 Java中String类型是字符串类型,是用 “ ” 双引号括起来的内容,所以基本数据类型转String类型直接+“ ”即可。&…

损失一件外套?

2024/05/07,晴 碎碎念一波! 早上洗漱完要出门时,发现自己昨天穿的外套不见了!!!外套上身效果很不错,买了1年多穿的频率非常高,现在丢了还真挺可惜。 衣服口袋有一个耳机&#xff0…

stm32单片机遇到的问题(持续更新)

flymcu下载问题一直显示连接,实际是连接不上 参考,软件一键下载电路等 使用flymcu下载程序过程中,检测两个地方**,第一,两个boot引脚在下载和硬件运行不同的连接方式** BOOT1x,BOOT00:最常用的模…

六西格玛备考攻略:无从下手?一文让你豁然开朗

当你决定备考六西格玛时,可能会感到有些无从下手。毕竟,这是一个涉及多个领域和方面的综合性考试,需要掌握的知识点和技能也非常广泛。但是,只要你有一个清晰的学习计划和一些有效的备考方法,就能够顺利地通过考试。以…

hadoop学习---基于Hive的教育平台数据仓库分析案例(三)

衔接第一部分,第一部分请点击:基于Hive的教育平台数据仓库分析案例(一) 衔接第二部分,第二部分请点击:基于Hive的教育平台数据仓库分析案例(二) 学生出勤模块(全量分析)&#xff1a…

Offer必备算法36_贪心算法三_七道力扣题详解(由易到难)

目录 ①力扣455. 分发饼干 解析代码 ②力扣553. 最优除法 解析代码 ③力扣45. 跳跃游戏 II 解析代码1_动态规划 解析代码2_贪心 ④力扣55. 跳跃游戏 解析代码 ⑤力扣134. 加油站 解析代码 ⑥力扣738. 单调递增的数字 解析代码 ⑦力扣991. 坏了的计算器 解析代码…

Adnroid 异常开机半屏重启代码分析

K1/K2包括家教机H9/H10,异常重启的时候都会开机动画都会出现半屏现象: 为了造这个现象,用eclipse把system_process stop掉就可以看到现象了: 由于开机动画是由SurfaceFlinger服务启动,出现异常会调用SurfaceFling…

特斯拉CEO马斯克访华,或加速FSD技术在中国的落地

特斯拉首席执行官埃隆马斯克于4月底进行了中国之旅,这一访问被业内人士认为可能加速特斯拉FSD(Full Self-Drive,完全自动驾驶)技术在中国的应用。业内专家指出,马斯克的此番到访可能会对中国自动驾驶市场产生深远影响&…

视频转GIF动图:一键批量操作技巧,轻松实现动态图像转换

在数字媒体时代,GIF动图因其小巧、循环播放的特性,在网络传播中占据了重要地位。而将视频转换为GIF动图,不仅可以快速捕捉视频中的精彩瞬间,还能为社交媒体、网站和博客等内容创作增添生动与活力。本文将介绍如何通过一键批量操作…