一氧化碳中毒

注册

 

发新话题 回复该主题

8kubebuilder进阶we [复制链接]

1#
北京的白癜风哪个比较好 http://pf.39.net/bdfyy/bjzkbdfyy/

在前面的文章当中我们已经完成了NodePoolOperator的基本功能开发与测试,但是有时候我们会有这种需求,例如创建或者删除资源的时候需要对资源进行一些检查的操作,如果校验不成功就不通过。或者是需要在完成实际的创建之前做一些其他操作,例如我创建一个pod之前对pod的资源做一些调整等。这些都可以通过准入控制的WebHook来实现。

准入控制存在两种WebHook,变更准入控制MutatingAdmissionWebhook,和验证准入控制ValidatingAdmissionWebhook,执行的顺序是先执行MutatingAdmissionWebhook再执行ValidatingAdmissionWebhook。

创建webhook

我们通过命令创建相关的脚手架代码和api

kubebuildercreatewebhook--groupnodes--versionv1--kindNodePool--defaulting--programmatic-validation

执行之后可以看到多了一些webhook相关的文件和配置

├──api│└──v1│├──groupversion_info.go│├──nodepool_types.go+│├──nodepool_webhook.go#在这里实现webhook的相关接口+│├──webhook_suite_test.go#webhook测试│└──zz_generated.deepcopy.go├──bin├──config+│├──certmanager#用于部署│├──crd││├──bases│││└──nodes.lailin.xyz_nodepools.yaml││├──kustomization.yaml││├──kustomizeconfig.yaml││└──patches││├──cainjection_in_nodepools.yaml+││└──webhook_in_nodepools.yaml│├──default││├──kustomization.yaml││├──manager_auth_proxy_patch.yaml││├──manager_config_patch.yaml+││├──manager_webhook_patch.yaml+││└──webhookcainjection_patch.yaml│├──manager│├──prometheus│├──rbac│├──samples││└──nodes_v1_nodepool.yaml+│└──webhook#webhook部署配置├──controllers├──main.go实现逻辑实现MutatingAdmissionWebhook接口

这个只需要实现Default方法就行

//Defaultimplementswebhook.Defaultersoawebhookwillberegisteredforthetypefunc(r*NodePool)Default(){nodepoollog.Info("default","name",r.Name)//如果labels为空,我们就给labels加一个默认值iflen(r.Labels)==0{r.Labels["node-pool.lailin.xyz"]=r.Name}}实现ValidatingAdmissionWebhook接口

实现ValidatingAdmissionWebhook也是一样只需要实现对应的方法就行了,默认是注册了Create和Update事件的校验,我们这里主要是限制Labels和Taints的key只能是满足正则^node-pool.lailin.xyz/*[a-zA-z0-9]*的固定格式

//TODO(user):changeverbsto"verbs=create;update;delete"ifyouwanttoenabledeletionvalidation.//+kubebuilder:webhook:path=/validate-nodes-lailin-xyz-v1-nodepool,mutating=false,failurePolicy=fail,sideEffects=None,groups=nodes.lailin.xyz,resources=nodepools,verbs=create;update,versions=v1,name=vnodepool.kb.io,admissionReviewVersions={v1,v1beta1}var_webhook.Validator=NodePool{}//ValidateCreateimplementswebhook.Validatorsoawebhookwillberegisteredforthetypefunc(r*NodePool)ValidateCreate()error{nodePoolLog.Info("validatecreate","name",r.Name)returnr.validate()}//ValidateUpdateimplementswebhook.Validatorsoawebhookwillberegisteredforthetypefunc(r*NodePool)ValidateUpdate(oldruntime.Object)error{nodePoolLog.Info("validateupdate","name",r.Name)returnr.validate()}//ValidateDeleteimplementswebhook.Validatorsoawebhookwillberegisteredforthetypefunc(r*NodePool)ValidateDelete()error{nodePoolLog.Info("validatedelete","name",r.Name)//TODO(user)illinyourvalidationlogicuponobjectdeletion.returnnil}//validate验证func(r*NodePool)validate()error{err:=errors.Errorf("taintorlabelkeymustvalidatedyby%s",keyReg.String())fork:=ranger.Spec.Labels{if!keyReg.MatchString(k){returnerrors.WithMessagef(err,"labelkey:%s",k)}}for_,taint:=ranger.Spec.Taints{if!keyReg.MatchString(taint.Key){returnerrors.WithMessagef(err,"taintkey:%s",taint.Key)}}returnnil}部署

实现了之后直接在makerun是跑不起来的,因为webhook注册的地址不对,我们这里先看一下如何进行部署运行,然后再来看如何对WebHook进行本地调试。

WebHook的运行需要校验证书,kubebuilder官方建议我们使用cert-manager简化对证书的管理,所以我们先部署一下cert-manager的服务

kubectlapply-f

分享 转发
TOP
发新话题 回复该主题