Operator 开发实践 四 (WebHook)

news2024/10/6 12:20:11

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)
	// 如果没有设置副本数,则默认为3
	if 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-manager

NAMESPACE      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 CR
  objref:
    kind: Certificate
    group: cert-manager.io
    version: v1
    name: serving-cert # this name should match the one in certificate.yaml
  fieldref:
    fieldpath: metadata.namespace
- name: CERTIFICATE_NAME
  objref:
    kind: Certificate
    group: cert-manager.io
    version: v1
    name: serving-cert # this name should match the one in certificate.yaml
- name: SERVICE_NAMESPACE # namespace of the service
  objref:
    kind: Service
    version: v1
    name: webhook-service
  fieldref:
    fieldpath: metadata.namespace
- name: SERVICE_NAME
  objref:
    kind: Service
    version: v1
    name: webhook-service

修改config/crd/kustomization.yaml文件

resources:
- bases/apps.atom.com_atoms.yaml
#+kubebuilder:scaffold:crdkustomizeresource

patchesStrategicMerge:
- patches/webhook_in_atoms.yaml
#+kubebuilder:scaffold:crdkustomizewebhookpatch

- patches/cainjection_in_atoms.yaml
#+kubebuilder:scaffold:crdkustomizecainjectionpatch

configurations:
- kustomizeconfig.yaml

4. 部署控制器
make deploy  IMG=atom-operator:v0.1

5. WebHook测试

编写CRD文件

apiVersion: apps.atom.com/v1
kind: Atom
metadata:
  name: nginx-sample
  namespace: default
  labels:
    app: nginx
spec:
  deployment:
    replicas: 12
    selector:
      matchLabels:
        app: nginx
    template:
      spec:
        containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
          - containerPort: 80
  service:
    type: NodePort
    ports:
      - name: nginx-http
        port: 80
        targetPort: 80
        nodePort: 30080

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

# kubectl apply -f apps_v1_atom.yaml

Joxz 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.coloradmin.cn/o/1106805.html

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

相关文章

AI机器视觉多场景应用迸发检测活力,引领食品及包装行业新发展

随着食品安全意识的广泛传播,人们对食品质量和安全的要求越来越高,众多食品包装厂商加速产线数智化转型,迫切需要高效、准确且智能化的检测技术。 在现代食品及包装行业的自动化生产中,涉及到各种各样的识别、检测、测量等环节&a…

LabVIEW中管理大型数据

LabVIEW中管理大数据 LabVIEW的最大优势之一是自动内存管理。这种内存管理允许用户轻松创建字符串、数组和集群,而无需C/C用户经常担心。但是,这种内存管理设计为绝对安全,因此数据被非常频繁地复制。这通常不会造成任何问题,但是…

Linux下使用openssl制作证书

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证…

Go语言和Python语言哪个比较好?

目录 1、性能 2、开发效率和易用性 3、社区支持 4、语法 5、其他因素 总结 Go语言和Python语言都是非常优秀的编程语言,它们各自具有不同的优势和适用场景。在选择哪种语言更适合您的项目时,需要考虑多个方面,包括性能、开发效率、可读…

软文为什么成为企业降本增效的营销利器?

如今企业营销面临的重大课题之一就是如何降低成本,增强宣传效果,传统营销模式集中于线下,不仅要花费大量的时间、金钱成本,还需要花费大量的人力成本。而网络技术的发展,使企业营销的方式更加多样化,其中软…

python tk展示图片

from tkinter import * from PIL import ImageTk, Imageroot Tk() root.title("展示图片")# 打开图片 image Image.open("DSC_2040.jpg") # 调整图片大小 image image.resize((300, 300), Image.ANTIALIAS) # 创建图像对象 img ImageTk.PhotoImage(ima…

P2181 对角线

#include<bits/stdc.h> using namespace std; unsigned long long n,ans; int main() {scanf("%lld",&n);ansn * (n-1) / 2 * (n-2) / 3 * (n-3) / 4;printf("%lld\n",ans);return 0; }

UE 插件模块引用

如Plugons中的模块A想要引用模块B&#xff1a; 1、模块A中的.uplugin文件加入↓ 2、模块A中的.Build.cs文件加入↓ 3、在模块A需要用到模块B的地方直接include 4、重新generate Project 5、重新编译 注意两个模块之间不能循环引用

AutoSAR入门:软硬件开发环境搭建概览

1、学习方向 AutoSAR技术是实践性的&#xff0c;光读文档是不行的。一边学习理论知识一边进行实际操作&#xff0c;可能最容易理解AutoSAR技术。 2、S32K144 AUTOSAR工具包&#xff1a;SIP包 AutoSAR软件工具包 SIP包&#xff1a; 1&#xff09;S32K14x的SIP包 软件包含&…

外包公司干了不到3个月,我离职了...

外包公司干了不到3个月&#xff0c;我离职了…当项目快要做完的时候&#xff0c;我就担心自己是不是要被“释放了”&#xff0c;直到外包HR&#xff0c;wx找我聊项目&#xff0c;我就不担心了&#xff0c;结果确实是要被“释放”。 从杭州到深圳&#xff0c;来的也突然&#x…

如何有效跟踪项目进展以取得成功?

据项目管理协会报告&#xff0c;大约有 15%的项目被认为是彻底失败的。而那些成功的项目中&#xff0c;近一半未能按时完成&#xff0c;43%的项目超出预算&#xff0c;32%的项目在产品交付的某些方面存在不足。 时间、资金和产品是项目管理中最常见的三个绊脚石&#xff0c;那…

腾讯云优惠券是什么?最新优惠券如何领取?

腾讯云作为国内领先的云服务提供商&#xff0c;为了回馈用户&#xff0c;经常推出各种优惠券活动&#xff0c;让用户在购买云产品和服务时享受更多的折扣和优惠。本文将为大家介绍腾讯云优惠券是什么&#xff0c;以及如何领取最新的优惠券。 一、腾讯云优惠券是什么&#xff1f…

kibana操作elasticsearch(增删改查)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

异步线程池

1、初始化线程的 4 种方式 1&#xff09;继承 Thread package com.search.thread;import java.util.concurrent.*;public class ThreadTest {public static void main(String[] args) throws ExecutionException, InterruptedException {System.out.println("main......…

怎样做好接口自动化测试?

今天介绍一下在接口自动化测试相关实践中总结到的一些经验。 接口自动化测试的目的 自动化测试的主要目的是用来回归测试的&#xff0c;当代码有变化时&#xff0c;有可能影响不应该变化的逻辑&#xff0c;这个时候为了确认这种情况&#xff0c;就需要进行回归测试。有时候回…

关于W5500网卡使用过程的部分问题记录

某个项目中用到了W5500这种自带网络协议栈的网卡芯片&#xff0c;由于该项目开发时间很紧&#xff0c;就临时网上买了一些模块拼凑到了一套系统&#xff0c;经过验证果真这种拼积木的方法只能用在学生实验开发中&#xff0c;真不能拿来做工程应用&#xff0c;硬件太不稳定很容易…

VMware添加Ubuntu虚拟机-Ubuntu系统的安装-物联网开发

一、前言 在物联网开发中&#xff0c;我们需要使用Linux系统或Ubuntu系统&#xff0c;最近我将会分享一些关于Ubuntu系统的知识和指令&#xff0c;并归纳到我的Ubuntu系统开发与维护专题&#xff0c;希望能给大家在物联网开发中提供帮助。 本文我们讲述使用VMware 16 Pro添加Ub…

给cmd控制台程序 套壳 美化

给cmd控制台程序套壳美化&#xff0c;可以获取程序的标准输出和报错信息。 # _*_ coding: utf-8 _*_ """ 控制台程序启动器&#xff0c;杜绝黑窗口。 Time: 2023/10/18 15:28 Author: Jyun Version: V 0.1 File: main.py Blog: https://ctrlcv.…

计算机缺失pasmutility.dll怎么办,三步解决pasmutility.dll缺失

pasmutility.dll文件是windows系统中重要的dll文件&#xff0c;电脑一旦缺失dll文件就会导致电脑无法正常运行&#xff0c;同时还会唐初电脑缺失pasmutility.dll文件的提示窗口&#xff0c;非常影响电脑运行&#xff0c;那么出现计算机缺失pasmutility.dll该怎么办呢&#xff1…

为什么引入SVG文件,给它定义属性不生效原理分析

背景&#xff1a; 我使用antd 的Icon组件引入SVG图片&#xff0c;但给svg图片定义styles样式时&#xff0c;不生效&#xff0c;为什么呢&#xff1f; 我们平时用antd组件库的 < ArrowRightOutlined style{{color: red }}>时为什么会生效呢&#xff0c;但我图一这样定义就…