kubebuilder实战之七:webhook,总结到位

return nil

}

// ValidateDelete implements webhook.Validator so a webhook will be registered for the type

func (r *ElasticWeb) ValidateDelete() error {

elasticweblog.Info(“validate delete”, “name”, r.Name)

// TODO(user): fill in your validation logic upon object deletion.

return nil

}

  • 上述代码有两处需要注意,第一处和填写默认值有关,如下图:

在这里插入图片描述

  • 第二处和校验有关,如下图:

在这里插入图片描述

  • 咱们要实现的业务需求就是通过修改上述elasticweb_webhook.go的内容来实现,不过代码稍后再写,先把配置都改好;

开发(配置)

  • 打开文件config/default/kustomization.yaml,下图四个红框中的内容原本都被注释了,现在请将注释符号都删掉,使其生效:

在这里插入图片描述

  • 还是文件config/default/kustomization.yaml,节点vars下面的内容,原本全部被注释了,现在请全部放开,放开后的效果如下图:

在这里插入图片描述

  • 配置已经完成,可以编码了;

开发(编码)

  • 打开文件elasticweb_webhook.go

  • 新增依赖:

apierrors “k8s.io/apimachinery/pkg/api/errors”

  • 找到Default方法,改成如下内容,可见代码很简单,判断TotalQPS是否存在,若不存在就写入默认值,另外还加了两行日志:

func (r *ElasticWeb) Default() {

elasticweblog.Info(“default”, “name”, r.Name)

// TODO(user): fill in your defaulting logic.

// 如果创建的时候没有输入总QPS,就设置个默认值

if r.Spec.TotalQPS == nil {

r.Spec.TotalQPS = new(int32)

*r.Spec.TotalQPS = 1300

elasticweblog.Info(“a. TotalQPS is nil, set default value now”, “TotalQPS”, *r.Spec.TotalQPS)

} else {

elasticweblog.Info(“b. TotalQPS exists”, “TotalQPS”, *r.Spec.TotalQPS)

}

}

  • 接下来开发校验功能,咱们把校验功能封装成一个validateElasticWeb方法,然后在新增和修改的时候各调用一次,如下,可见最终是调用apierrors.NewInvalid生成错误实例的,而此方法接受的是多个错误,因此要为其准备切片做入参,当然了,如果是多个参数校验失败,可以都放入切片中:

func (r *ElasticWeb) validateElasticWeb() error {

var allErrs field.ErrorList

if *r.Spec.SinglePodQPS > 1000 {

elasticweblog.Info(“c. Invalid SinglePodQPS”)

err := field.Invalid(field.NewPath(“spec”).Child(“singlePodQPS”),

*r.Spec.SinglePodQPS,

“d. must be less than 1000”)

allErrs = append(allErrs, err)

return apierrors.NewInvalid(

schema.GroupKind{Group: “elasticweb.com.bolingcavalry”, Kind: “ElasticWeb”},

r.Name,

allErrs)

} else {

elasticweblog.Info(“e. SinglePodQPS is valid”)

return nil

}

}

  • 再找到新增和修改资源对象时被调用的方法,在里面调用validateElasticWeb:

// ValidateCreate implements webhook.Validator so a webhook will be registered for the type

func (r *ElasticWeb) ValidateCreate() error {

elasticweblog.Info(“validate create”, “name”, r.Name)

// TODO(user): fill in your validation logic upon object creation.

return r.validateElasticWeb()

}

// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type

func (r *ElasticWeb) ValidateUpdate(old runtime.Object) error {

elasticweblog.Info(“validate update”, “name”, r.Name)

// TODO(user): fill in your validation logic upon object update.

return r.validateElasticWeb()

}

  • 编码完成,可见非常简单,接下来,咱们把以前实战遗留的东西清理一下,再开始新的部署和验证;

清理工作

  • 如果您是随着《kubebuilder实战》系列一路操作下来,此时系统上应该积攒了之前遗留的内容,可以通过以下步骤完成清理:
  1. 删除elasticweb资源对象:

kubectl delete -f config/samples/elasticweb_v1_elasticweb.yaml

  1. 删除controller

kustomize build config/default | kubectl delete -f -

  1. 删除CRD

make uninstall

  • 现在万事俱备,可以部署webhook了;

部署

  1. 部署CRD

make install

  1. 构建镜像并推送到仓库(我终于受够了hub.docker.com的龟速,改为阿里云镜像仓库):

make docker-build docker-push IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001

  1. 部署集成了webhook功能的controller:

make deploy IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001

  1. 查看pod,确认启动成功:

zhaoqin@zhaoqindeMBP-2 ~ % kubectl get pods --all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE

cert-manager cert-manager-6588898cb4-nvnz8 1/1 Running 1 5d21h

cert-manager cert-manager-cainjector-7bcbdbd99f-q645r 1/1 Running 1 5d21h

cert-manager cert-manager-webhook-5fd9f9dd86-98tm9 1/1 Running 1 5d21h

elasticweb-system elasticweb-controller-manager-7dcbfd4675-898gb 2/2 Running 0 20s

验证Defaulter(添加默认值)

  • 修改文件config/samples/elasticweb_v1_elasticweb.yaml,修改后的内容如下,可见totalQPS字段已经被注释掉了:

apiVersion: v1

kind: Namespace

metadata:

name: dev

labels:

name: dev


apiVersion: elasticweb.com.bolingcavalry/v1

kind: ElasticWeb

metadata:

namespace: dev

name: elasticweb-sample

spec:

Add fields here

image: tomcat:8.0.18-jre8

port: 30003

singlePodQPS: 500

totalQPS: 600

  • 创建一个elasticweb资源对象:

kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml

  • 此时单个pod的QPS是500,如果webhook的代码生效的话,总QPS就是1300,而对应的pod数应该是3个,接下来咱们看看是否符合预期;

  • 先看elasticweb、deployment、pod等资源对象是否正常,如下所示,全部符合预期:

zhaoqin@zhaoqindeMBP-2 ~ % kubectl get elasticweb -n dev

NAME AGE

elasticweb-sample 89s

zhaoqin@zhaoqindeMBP-2 ~ % kubectl get deployments -n dev

NAME READY UP-TO-DATE AVAILABLE AGE

elasticweb-sample 3/3 3 3 98s

zhaoqin@zhaoqindeMBP-2 ~ % kubectl get service -n dev

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

elasticweb-sample NodePort 10.105.125.125 8080:30003/TCP 106s

zhaoqin@zhaoqindeMBP-2 ~ % kubectl get pod -n dev

NAME READY STATUS RESTARTS AGE

elasticweb-sample-56fc5848b7-5tkxw 1/1 Running 0 113s

elasticweb-sample-56fc5848b7-blkzg 1/1 Running 0 113s

elasticweb-sample-56fc5848b7-pd7jg 1/1 Running 0 113s

  • 用kubectl describe命令查看elasticweb资源对象的详情,如下所示,TotalQPS字段被webhook设置为1300,RealQPS也计算正确:

zhaoqin@zhaoqindeMBP-2 ~ % kubectl describe elasticweb elasticweb-sample -n dev

Name: elasticweb-sample

Namespace: dev

Labels:

Annotations:

API Version: elasticweb.com.bolingcavalry/v1

Kind: ElasticWeb

Metadata:

Creation Timestamp: 2021-02-27T16:07:34Z

Generation: 2

Managed Fields:

API Version: elasticweb.com.bolingcavalry/v1

Fields Type: FieldsV1

fieldsV1:

f:metadata:

f:annotations:

.:

f:kubectl.kubernetes.io/last-applied-configuration:

f:spec:

.:

f:image:

f:port:

f:singlePodQPS:

Manager: kubectl-client-side-apply

Operation: Update

Time: 2021-02-27T16:07:34Z

API Version: elasticweb.com.bolingcavalry/v1

Fields Type: FieldsV1

fieldsV1:

f:status:

f:realQPS:

Manager: manager

Operation: Update

Time: 2021-02-27T16:07:34Z

Resource Version: 687628

UID: 703de111-d859-4cd2-b3c4-1d201fb7bd7d

Spec:

Image: tomcat:8.0.18-jre8

Port: 30003

Single Pod QPS: 500

Total QPS: 1300

Status:

Real QPS: 1500

Events:

  • 再来看看controller的日志,其中的webhook部分是否符合预期,如下图红框所示,发现TotalQPS字段为空,就将设置为默认值,并且在检测的时候SinglePodQPS的值也没有超过1000:

在这里插入图片描述

  • 最后别忘了用浏览器验证web服务是否正常,我这里的完整地址是:http://192.168.50.75:30003/

  • 至此,咱们完成了webhook的Defaulter验证,接下来验证Validator

验证Validator

  • 接下来该验证webhook的参数校验功能了,先验证修改时的逻辑;

  • 编辑文件config/samples/update_single_pod_qps.yaml,值如下:

spec:

singlePodQPS: 1100

  • 用patch命令使之生效:

kubectl patch elasticweb elasticweb-sample \

-n dev \

–type merge \

–patch “$(cat config/samples/update_single_pod_qps.yaml)”

  • 此时,控制台会输出错误信息:

Error from server (ElasticWeb.elasticweb.com.bolingcavalry “elasticweb-sample” is invalid: spec.singlePodQPS: Invalid value: 1100: d. must be less than 1000): admission webhook “velasticweb.kb.io” denied the request: ElasticWeb.elasticweb.com.bolingcavalry “elasticweb-sample” is invalid: spec.singlePodQPS: Invalid value: 1100: d. must be less than 1000

  • 再用kubectl describe命令查看elasticweb资源对象的详情,如下图红框,依然是500,可见webhook已经生效,阻止了错误的发生:

在这里插入图片描述

  • 再去看controller日志,如下图红框所示,和代码对应上了:

在这里插入图片描述

  • 接下来再试试webhook在新增时候的校验功能;

  • 清理前面创建的elastic资源对象,执行命令:

kubectl delete -f config/samples/elasticweb_v1_elasticweb.yaml

  • 修改文件,如下图红框所示,咱们将singlePodQPS的值改为超过1000,看看webhook是否能检查到这个错误,并阻止资源对象的创建:

在这里插入图片描述

  • 执行以下命令开始创建elasticweb资源对象:

kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml

  • 控制台提示以下信息,包含了咱们代码中写入的错误描述,证明elasticweb资源对象创建失败,证明webhook的Validator功能已经生效:

namespace/dev created

Error from server (ElasticWeb.elasticweb.com.bolingcavalry “elasticweb-sample” is invalid: spec.singlePodQPS: Invalid value: 1500: d. must be less than 1000): error when creating “config/samples/elasticweb_v1_elasticweb.yaml”: admission webhook “velasticweb.kb.io” denied the request: ElasticWeb.elasticweb.com.bolingcavalry “elasticweb-sample” is invalid: spec.singlePodQPS: Invalid value: 1500: d. must be less than 1000

  • 不放心的话执行kubectl get命令检查一下,发现空空如也:

zhaoqin@zhaoqindeMBP-2 elasticweb % kubectl get elasticweb -n dev

No resources found in dev namespace.

zhaoqin@zhaoqindeMBP-2 elasticweb % kubectl get deployments -n dev

No resources found in dev namespace.

zhaoqin@zhaoqindeMBP-2 elasticweb % kubectl get service -n dev

No resources found in dev namespace.

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后:

总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。

面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。

点击这里领取Web前端开发经典面试题

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-L454z6RU-1712167987746)]

[外链图片转存中…(img-hIVqJ1m8-1712167987746)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-U9ahwPvp-1712167987746)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后:

总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。

面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。

点击这里领取Web前端开发经典面试题

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值