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.rhkb.cn/news/162968.html

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

相关文章

【Java学习之道】JDBC API介绍与使用方法

引言 对于初学者来说,数据库编程可能听起来有些复杂,但实际上,只要你掌握了JDBC(Java Database Connectivity)API,就可以轻松地连接和操作数据库。本章将为你详细介绍JDBC API的概念、使用方法以及一些实际…

zabbix触发器与动作

一、触发器(Trigger) 1、概念: 在 Zabbix 中,触发器用于监测 Zabbix 监控系统中的各种指标和条件,并在特定条件满足时触发警报。(触发器用于定义监控项的报警阈值) 2、触发器对象&#xff1a…

chatglm配置

推荐看这个链接,有些问题解决出处https://zhuanlan.zhihu.com/p/643824521 以及这个https://blog.csdn.net/weixin_40547993/article/details/131775275 1.需要pytorch2.0,所以CUDA推荐11.8 ChatGLM2-6B版本要装PYTORCH2.0,而且要2.0.1 &a…

檀香香料经营商城小程序的作用是什么

檀香香料有安神、驱蚊、清香等作用,办公室或家庭打坐等场景,都有较高的使用频率,不同香料也有不同效果,高品质香料檀香也一直受不少消费者欢迎。 线下流量匮乏,又难以实现全消费路径完善,线上是商家增长必…

Python|Pyppeteer获取去哪儿酒店数据(20)

前言 本文是该专栏的第20篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 本文以去哪儿为例,笔者将详细介绍使用pyppeteer获取去哪儿的酒店数据。如果对pyppeteer的使用以及知识点不太熟悉的同学,可往前查看本专栏前面介绍的pyppeteer知识点。 接下来,我们言…

web前端基础CSS------美化页面“footer”部分

一&#xff0c;实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>关于我们</title><style type"text/css">#footer{margin: 10px 0px;background: #f5f5f5;border: top 1px solid #eee ;}#f…

Electron webview 内网页 与 preload、 渲染进程、主进程的常规通信 以及企业级开发终极简化通信方式汇总

Electron 嵌入的页面中注入的是 preload.js 通过在标签中给 prelaod赋值&#xff0c;这里提到了 file://前缀&#xff0c;以及静态目录 static 怎么获取 实际代码&#xff0c;其中__static就是我们存放静态文件的地方&#xff0c;这个 static 是 electron 源代码根目录下的文件…

Linux开发工具:vim的介绍和用法及其简单配置

前言 Vim 简介. 编辑. Vim是从 vi 发展出来的一个文本编辑器。. 代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用&#xff0c;和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。. [1] vim的设计理念是命令的组合。. 用户学习了各种各样的…

《深入理解java虚拟机 第三版》学习笔记一

第 2 章 Java 内存区域与内存溢出异常 2.2 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些…

解决Github Markdown图片显示残缺的问题

title: 解决Github Markdown图片显示残缺的问题 tags: 个人成长 categories:杂谈 在Github存放Markdown文档&#xff0c;如果图片没有存放在Github服务器上&#xff0c;github会尝试生成Github图片缓存&#xff0c;使用Github图片缓存&#xff0c;进行实际的展示。但比较蛋疼的…

PHP 智能物业管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 智能物业管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP小区物业管理系统1 代码 https://download.csdn.net/download/qq_41221322/88444…

Git——解决 TortoiseGit 提示 No supported authentication methods available 错误

快速导航 问题描述解决方案步骤1 打开Git 的 Settings窗口步骤2 选择Network步骤3 选择安装目录usr\bin 下的 ssh.exe 文件 问题描述 git 推送&#xff08;push&#xff09;后提示No supported authentication methods available 错误 解决方案 步骤1 打开Git 的 Settings窗…

MySQL——七、MySQL备份恢复

MySQL 一、MySQL日志管理1、MySQL日志类型2、错误日志3、通用查询日志4、慢查询日志5、二进制日志5.1 开启日志5.2 二进制日志的管理5.3 日志查看5.4 二进制日志还原数据 二、MySQL备份1、备份类型逻辑备份优缺点 2、备份内容3、备份工具3.1 MySQL自带的备份工具3.2 文件系统备…

数据分析入门

B站&#xff1a;01第一课 数据分析岗位职责和数据分析师_哔哩哔哩_bilibili 一、岗位&#xff1a;数据分析师 Q1 数据分析师在公司做什么工作&#xff1f; 数据来源于公司核心业务&#xff0c;通过监测业务健康度来确定业务的健康状况&#xff1b; 通过对用户精细化分析&am…

Java面试题总结(二):Java多线程

文章目录 1.进程和线程的区别&#xff0c;进程间如何通信2. 什么是线程上下文切换3.什么是死锁4.死锁的必要条件5.Synchronized和lock的区别6.什么是AQS锁?7.为什么AQS使用的双向链表&#xff1f;8.有哪些常见的AQS锁9.sleep()和wait()的区别10.yield()和join()区别11.线程池七…

【API篇】三、Flink转换算子API

文章目录 0、demo数据1、基本转换算子&#xff1a;映射map2、基本转换算子&#xff1a;过滤filter3、基本转换算子&#xff1a;扁平映射flatMap4、聚合算子&#xff1a;按键分区keyBy5、聚合算子&#xff1a;简单聚合sum/min/max/minBy/maxBy6、聚合算子&#xff1a;归约聚合re…

wsl使用vscode连接,远程安装C/C++ 拓展时,报错

报错内容&#xff1a; EACCES: permission denied, rename /home/wen/.vscode-server/extensions/.b61b1c7c-f703-4dfd-bdc5-d9a00681c4b7 -> /home/wen/.vscode-server/extensions/ms-vscode.cpptools-1.17.5-linux-x64 解决办法&#xff1a; 升级wsl到wsl2就好了。 &a…

GitLab使用webhook触发Jenkins自动构建

1、jenkins安装gitlab插件 在插件管理中&#xff0c;搜索gitlab安装这个插件。 2、job中配置webhook地址和密钥 进入job设置&#xff0c;构建触发器中就可以看到gitlab的webhook配置&#xff0c;复制URL地址和随机令牌至gitlab中 勾选后&#xff0c;就可以展开设置&#xff…

G.711语音编解码器详解

语音编解码利用人听觉上的冗余对语音信息进行压缩从而达到节省带宽的目的。值得注意的是,本文说的是语音编解码器,也就Speech codec,而常用的还有另一种编解码器称作音频编解码器,英文是Audio codec,它们的区别如下。 以前在学校的时候研究了很多VoIP的编解码器从G.723到A…

神经网络硬件加速器-DPU分析

一 DPU概述 DPU是专为卷积神经网络优化的可编程引擎&#xff0c;其使用专用指令集&#xff0c;支持诸多卷积神经网络的有效实现。 1、关键模块 卷积引擎&#xff1a;常规CONV等ALU&#xff1a;DepthwiseConvScheduler&#xff1a;指令调度分发Buffer Group&#xff1a;片上数据…