Operator 开发实践 四 (WebHook)

1. WebHook介绍

我们知道访问Kubernetes API有好几种方式,比如使用kubectl命令、使用client-go之类的开发库、直接通过REST请求等。不管是一个使用kubectl的真人用户,还是一个Service Account,都可以通过API访问认证,这个过程官网有一张图描述得很直观
请添加图片描述

当一个访问请求发送到API Server的时候,会依次经过认证、鉴权、准入控制三个主要的过程。Admission Webhook就是这里提到的“准入控制”的范畴.
准入控制(Admission Control) 模块能够实现更改一个请求的内容或者决定是否拒绝一个请求的功能。准入控制主要是在一个对象发生变更时生效,变更包括创建、更新、删除等动作,也就是不包含查询动作。如果配置了多个准入控制模块,那么这些模块是按顺序工作的。
关于拒绝请求这个能力,一个请求在多个准入控制模块中有一个模块拒绝,这个请求就会被拒绝,这和认证或者鉴权模块明显不一样.而更改一个请求内容的能力,主要用于给一些请求字段设置默认值。准入控制器基本都是在kube-apiserver中实现的,所以它们的启用也是通过在kube-apiserver的启动参数上添加相应配置,比如:

kude-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...

可以在 https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do看到目前有哪些准入控制器以及它们的作用。这里的多数准入控制器只能决定它们的启用或者禁用,除了这类在kube-apiserver内部实现的准入控制器外,我们可以看到有两个特殊的准入控制器:ValidatingAdmissionWebhook 和 MutatingAdmissionWebhook。这是Kubernetes提供的一种拓展机制,使我们能够通过Webhook的方式独立于kube-apiserver运行自己的准入控制逻辑。

顾名思义,Admission Webhook是一个HTTP回调钩子,可以用来接收“准入请求”,然后对这个请求做相应的逻辑处理。
Admission Webhook有两种:
ValidatingAdmissionWebhook
MutatingAdmissionWebhook

先执行的是MutatingAdmissionWebhook,这个准入控制器可以修改请求对象,主要用来注入自定义字段;当这个对象被API Server校验时,就会回调ValidatingAdmissionWebhook,然后相应的自定义校验策略就会被执行,以决定这个请求能否被通过

2. WebHook的实现

我们可以通过operator的create webhook命令来生成实现Admission Webhook的代码脚手架:

operator-sdk create webhook --group apps --version v1 --kind Atom --defaulting --programmatic-validation

这个命令执行完成后,可以看到项目内多了文件。打开api/v1/atom_webhook.go源文件,可以看到里面有一个Default()方法。在Default()方法中就可以完成MutatingAdmissionWebhook的相关逻辑。

实现MutatingAdmissionWebhook

以Replicas默认值注入为例,比如用户提交的Atom配置中没有给出Replicas的大小,那么就注入一个默认值3,代码如下:

func (r *Atom) Default() {atomlog.Info("default", "name", r.Name)// 如果没有设置副本数,则默认为3if r.Spec.Deployment.Replicas == nil {r.Spec.Deployment.Replicas = new(int32)*r.Spec.Deployment.Replicas = 3}
}
实现ValidatingAdmissionWebhook

在atom_webhook.go源文件中继续往后看,可以发现有3个Validatexxx()方法,分 别 是 ValidateCreate、ValidateUpdate 和ValidateDelete。顾名思义,这几个Validate方法的触发条件分别是相应对象在创建、更新、删除的时候。删除时不需要做什么校验逻辑,而创建和更新的校验逻辑几乎是样的,所以我们将创建和更新时所需的校验逻辑封装一下,编写一个validateAtom()方法:

// ValidateAtom validates the Atom
func (r *Atom) ValidateAtom() error {if *r.Spec.Deployment.Replicas > 10 {return fmt.Errorf("replicas too many error")}return nil
}

这里简单地校验Replicas是不是设置得过大了,其他业务逻辑也是类似的校验方法,如果觉得条件不满足,就返回一个error,反之返回nil就行。然后就在几个 Validate xxx方法中调用这个ValidateAtom()方法:

// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
func (r *Atom) ValidateCreate() error {atomlog.Info("validate create", "name", r.Name)return r.ValidateAtom()
}// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
func (r *Atom) ValidateUpdate(old runtime.Object) error {atomlog.Info("validate update", "name", r.Name)return r.ValidateAtom()
}// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
func (r *Atom) ValidateDelete() error {atomlog.Info("validate delete", "name", r.Name)return nil
}

检查一下atom_types.go中Atom结构体的注解, 需要是下面这样

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status
//+kubebuilder:resource:path=atoms,singular=atom,scope=Namespaced,shortName=at// Atom is the Schema for the atoms API
type Atom struct {metav1.TypeMeta   `json:",inline"`metav1.ObjectMeta `json:"metadata,omitempty"`Spec   AtomSpec   `json:"spec,omitempty"`Status AtomStatus `json:"status,omitempty"`
}

3. cert-manager

在部署Webhook之前需要先安装cert-manager,用来实现证书签发功能。关于cert-manager的详细介绍大家可以参考官方文档:https://cert-manager.io/docs/,现在只介绍怎么部署cert-manager。cert-manager提供了helm Chart包方式部署:

helm repo add jetstack https://charts.jetstack.io
helm search repo jetstack
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.12.3 --set installCRDs=true

出现以下内容代表部署成功

# kgpo -n cert-managerNAMESPACE      NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager   cert-manager-875c7579b-qnskb               1/1     Running   0          3m4s
cert-manager   cert-manager-cainjector-7bb6786867-vp8b7   1/1     Running   0          3m4s
cert-manager   cert-manager-webhook-89dc55877-tx8xj       1/1     Running   0          3m4s

4. WebHook部署运行

现在已经准备好了Webhook代码,接着就部署到环境中来看一下运行结果。

1.构建并推送镜像

执行以下两行命令来构建镜像,并把镜像加载到kind集群中:

make docker-build IMG=atom-operator:v0.1
kind load docker-image atom-operator:v0.1 --name dev
2. 部署CRD
make install
3. 配置相关证书

前面部署了cert-manager,但要使用cert-manager还需要做些配置。首先config/default/kustomization.yaml文件需要做一些调整,打开几行注释内容:

namespace: atom-operator-system
namePrefix: atom-operator-
bases:
- ../crd
- ../rbac
- ../manager
- ../webhook
- ../certmanager
patchesStrategicMerge:
- manager_auth_proxy_patch.yaml
- manager_webhook_patch.yaml
- webhookcainjection_patch.yaml
vars:
- name: CERTIFICATE_NAMESPACE # namespace of the certificate CRobjref:kind: Certificategroup: cert-manager.ioversion: v1name: serving-cert # this name should match the one in certificate.yamlfieldref:fieldpath: metadata.namespace
- name: CERTIFICATE_NAMEobjref:kind: Certificategroup: cert-manager.ioversion: v1name: serving-cert # this name should match the one in certificate.yaml
- name: SERVICE_NAMESPACE # namespace of the serviceobjref:kind: Serviceversion: v1name: webhook-servicefieldref:fieldpath: metadata.namespace
- name: SERVICE_NAMEobjref:kind: Serviceversion: v1name: webhook-service

修改config/crd/kustomization.yaml文件

resources:
- bases/apps.atom.com_atoms.yaml
#+kubebuilder:scaffold:crdkustomizeresourcepatchesStrategicMerge:
- patches/webhook_in_atoms.yaml
#+kubebuilder:scaffold:crdkustomizewebhookpatch- patches/cainjection_in_atoms.yaml
#+kubebuilder:scaffold:crdkustomizecainjectionpatchconfigurations:
- kustomizeconfig.yaml
4. 部署控制器
make deploy  IMG=atom-operator:v0.1

5. WebHook测试

编写CRD文件

apiVersion: apps.atom.com/v1
kind: Atom
metadata:name: nginx-samplenamespace: defaultlabels:app: nginx
spec:deployment:replicas: 12selector:matchLabels:app: nginxtemplate:spec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80service:type: NodePortports:- name: nginx-httpport: 80targetPort: 80nodePort: 30080

注意:我们这里给出的replicas为12,然后部署CRD看看Validate是否生效

# kubectl apply -f apps_v1_atom.yamlJoxz nuew o07 seoTTdaI :1sanbaxaut patuep ,ot'qx'uorqeofTddeA, yoouqem uotsstupe : Twe/ uorteotTdde TA sdde. :oJn7Tnejep. :eoedsaweN .eTdues-xuTbu.. :eueN.uotteoTTddy-puTxTA/uo*nuTetuep'sdde.:putyuotsza dnoig suotqeotTdde-aoinosad "TA/uo'nutatuep'sdde,;aoinosay
:07
(([108: 7a0d73bxet.'08:7zod, 08008:7zodapou)l: sizodl:otatas '{{[([[08: qx0ajeutequoo,)]  sqxod "xutbu  eweu"2"hi'T;xutbu,  abewt]:.sTauTe7u0O.l:.oads.( ( ,xutbu, ' dde, l: sTaqeT. l: eqepezow ):o7eTdwe7.TT:,seoTdax, ):,quewkordep); oads,"(u{ll \zodepon\ edk\[108:7a0d7ebxe'08:zod "080088\qzodepou,\)lsqzod \) eotazas[{{[{[(08\qz0azauteuoo\)]sqzod "xutbu  oweu,\"\2'hT'T:xutbu\ abewT)l sxaurequoo \):\oads\[xutbu,\, dde,\):,sTogeT\): eepetou \) aeTduet,'(,xutbu  dde \)\sTegeruogew,); aogoatas,'tt seottdex\) quewhoTdep,\); oads,l tTnejapaoedsawpu," ardues-xutbu  aweu,',xutbu,  dde\): staqeT'();\suofte7ouue\):\eqepeqew"uorqeoTTddy\purx\\TA/uo*nu[oruep'sdde uorsjanTde,\)iuorteinbrjuoo-paridde-7seT/0r*seqauxaqny Tqoaqny,)isuorqeqouue,) eqepeqew):yoqed buthTdde uaum joxa :(joi uew 007 seotTdaa) jaazas woj Joxzg

符合预期,得到了一个replicas too many error错误。

接着将Replicas删除,使用同样的方式可以验证Defaulter能不能正常工作。结果是在不设置Replicas的情况下,Replicas默认值会变3

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5+非肿瘤分析,分型+WGCNA+机器学习筛选相关基因

今天给同学们分享一篇非肿瘤分型机器学习WGCNA实验的生信文章“Identification of diagnostic markers related to oxidative stress and inflammatory response in diabetic kidney disease by machine learning algorithms: Evidence from human transcriptomic data and mou…

竞赛选题 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…

缺失找不到msvcr71.dll无法执行代码,应用程序无法启动的解决方法

最近我在使用电脑时遇到了一个问题,提示我缺少 msvcr71.dll 这个文件。这个文件是系统中的一个动态链接库文件,常用于支持一些运行在 Windows 系统上的程序。 当我发现这个问题时,我感到有点困惑和焦虑。因为我需要使用的软件要求系统中必须…

一键式AI智能剪辑,轻松处理视频,释放无限创意!“

想象一下,您可以在几秒钟内完成一个复杂的视频剪辑,而无需投入大量的时间和精力。现在,这个梦想已经成为现实!我们的新一代AI智能剪辑技术,将使视频处理变得轻松无压力。 第一步:首先进入好简单批量智剪主…

漫谈下一代防火墙与Web应用防火墙的区别

如今,Web应用程序变得越来越复杂,更是黑客非常感兴趣的目标。在谈到网络安全的话题时,我们总会讨论下一代防火墙与Web应用防火墙的区别。当已经拥有下一代防火墙(NGFW)时,为什么需要Web应用程序防火墙&…

YOLOv5-理论部分

YOLOv5 作者: Ultralytics 论文源码: https://github.com/ultralytics/yolov5 Ultralytics:“超视觉技术” / “超视觉系统” 0. 引言 “YOLOv5 🚀 是世界上备受喜爱的视觉人工智能,代表了 Ultralytics 对未来视觉人工智能方法的开源研究&a…

k8s-20 hpa控制器

hpa可通过metrics-server所提供pod的cpu 或者内存的负载情况,从而动态拉伸控制器的副本数,从而达到后端的自动弹缩 官网:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ 上传镜像 压测 po…

【广州华锐互动】VR建筑安全培训体验为建筑行业人才培养提供有力支持

随着建筑行业的快速发展,建筑施工安全问题日益受到广泛关注。然而,传统的安全培训方式往往缺乏实践性和真实性,难以让员工真正掌握安全操作技能。近年来,虚拟现实(VR)技术的广泛应用为建筑施工安全培训提供了新的机遇。 虚拟现实技…

山西电力市场日前价格预测【2023-10-19】

日前价格预测 预测说明: 如上图所示,预测明日(2023-10-19)山西电力市场全天平均日前电价为210.83元/MWh。其中,最高日前电价为337.00元/MWh,预计出现在18: 30。最低日前电价为0.00元/MWh,预计出…

【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析

1 YOLO时间线 这里简单列下yolo的发展时间线,对每个版本的提出有个时间概念。 2 yolov8 的简介 工程链接:https://github.com/ultralytics/ultralytics 2.1 yolov8的特点 采用了anchor free方式,去除了先验设置可能不佳带来的影响借鉴Genera…

uni-app小程序使用DCloud(插件市场)流程

一、DCloud(插件市场) DCloud 是uni-app官方插件市场,里面有官方、团队、个人发布的众多插件,包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考,但一些团队或个人发布的小型插件没有文档&#xf…

Tuxera2023 NTFS for Mac下载,安装与百度网盘激活教程

百度网盘-链接不存在【Tuxera2023简介】 当您获得一台新 Mac 时,它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac,您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 是一款易于使用的软件,…