Operator 开发实践 四 (WebHook)

这篇具有很好参考价值的文章主要介绍了Operator 开发实践 四 (WebHook)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. WebHook介绍

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

当一个访问请求发送到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文章来源地址https://www.toymoban.com/news/detail-723907.html

到了这里,关于Operator 开发实践 四 (WebHook)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 构建 Kubernetes Operator 的原则是什么?

    Kubernetes(简称K8s)上数据服务的自动化越来越受欢迎。在K8s上运行有状态的工作负载意味着使用Operator。然而,它发展演化到今天已经变得非常复杂,像Operator这样的应用模式和扩展方式对于开发者与运维者而言愈发受到欢迎。 但工程师们经常对编写K8s Operator的复杂性感到吃

    2024年02月03日
    浏览(33)
  • 【大数据】-- 本地部署 Flink kubernetes operator

    目录 1.说明 1.1 版本 1.2 kubernetes 环境 1.3 参考 2.安装步骤 2.1 安装本地 kubernetes 环境

    2024年02月13日
    浏览(31)
  • 【flink进阶】-- Flink kubernetes operator 版本升级

    目录 1、检查当前 flink kubernetes operator 版本  2、停止生产上正在运行的 flink job 3、升级 CRD

    2024年02月07日
    浏览(36)
  • 【Flink进阶】-- 本地部署 Flink kubernetes operator

    目录 1.说明 1.1 版本 1.2 kubernetes 环境 1.3 参考 2.安装步骤 2.1 安装本地 kubernetes 环境

    2024年02月10日
    浏览(32)
  • kubernetes基于helm部署gitlab-operator

    这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-operator。 先决条件 已运行的 Kubernetes 集群 负载均衡器,为ingress-nginx控制器提供EXTERNAL-IP,本示例使用metallb 默认存储类,为gitlab pods提供持久化存储,本示例使用openebs cert-manager,为gitlab提供自签名证书 项目地址:https://gitl

    2024年02月14日
    浏览(35)
  • Kubernetes operator(一)client-go篇【更新中】

    云原生学习路线导航页(持续更新中) 本文是 Kubernetes operator学习 系列第一篇,主要对client-go进行学习,从源码阅读角度,学习client-go各个组件的实现原理、如何协同工作等 参考视频:Bilibili 2022年最新k8s编程operator篇,UP主:白丁云原生 本文参考资料 https://pan.baidu.com/s/1Bi

    2024年01月24日
    浏览(33)
  • Flink on Kubernetes (flink-operator) 部署Flink

    https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.1/docs/try-flink-kubernetes-operator/quick-start/ 我的部署脚本和官网不一样,有些地方官网不够详细 注意,按照默认配置至少有两台worker https://helm.sh/zh/docs/intro/install/ 安装完成后,资源如下 此时k8s集群就可以支持我们按照fli

    2024年04月14日
    浏览(41)
  • k8s operator从0到1实践

    推荐使用docker-desktop,本地单机集群 这里推荐使用脚手架工具kubebuilder 使用脚手架工具,能生成项目模板,开发人员只需要关注核心逻辑和方法即可 mac安装 生成的项目结构目录如下: 完整代码参考: webapp-operator 对象结构(api)、控制器(controller)修改完毕后,需要更新

    2024年02月01日
    浏览(40)
  • airflow 自定义 operator 开发

    airflow DAG 任务执行的核心就是 operator,airflow 2.6 将很多 operator 从自身的项目中剥离出来,作为外部 provider 提供,比如说我们想要在 DAG 中使用 http operator 就需要先导入第三方包。 Documentation 这样就保证了 airflow 本身作为任务编排调度系统的功能内聚性,单一性,其实上边的第

    2024年02月09日
    浏览(48)
  • KT-Connect在Kubernetes环境下开发的实践探讨

    摘要:随着容器技术的快速发展,Kubernetes已经成为企业级容器编排的事实标准。然而,在Kubernetes环境下进行开发,开发者面临着诸多挑战,如网络隔离、服务发现等问题。本文将介绍一款名为KT-Connect的工具,帮助开发者解决在Kubernetes环境下开发的痛点,提高开发效率。 K

    2024年03月18日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包