有两种类型的准入控制器,validating admission controller和mutating admission controller,前面一种对于请求只执行验证而不发生修改,后面一种会修改请求。
validating admission controller
它对于请求执行验证操作,验证是否满足条件需求。典型的如namespaceExists
在创建对应资源的时候,它会验证对应命名空间是否存在,若不存在,则不会进行创建;
这种起到验证作用的控制器,就称为验证准入控制器。
mutating admission controller
这种类型的控制器,会修改请求内容,如:defaultStorageClass,默认是启用的。
当你在提交了一个PVC请求的时候,会被该控制器拦截,并添加默认的storageClass
因此当你查看自己所创建的PVC的时候,能够看到一个storageClass,尽管在创建的时候,你并没有指定它
像defaultStorageClass这种控制器,我们称为mutating admission controller,它能够在资源对象被创建之前,对其执行修改或转换操作。
mutating admission controller在validating admission controller,前者能够请求,后者能够验证请求,允许或决绝。然而还有很多种其他类型的控制器,能够同时完成验证和修改操作,并不只是单一完成验证和修改。
通常而言,mutating admission controller在validating admission controller之前执行,这就使得前者控制器所发生的修改,在后者控制器中能够被验证。
上述描述的控制器,都是内置的它们是kubernetes源码的一部分,被编译构建到kubernetes。如果我们想要实现自己的准入控制器,完成验证和修改功能。你应该使用external admission controllers。
有两种特殊的准入控制器可供我们选择,MutatingAdmissionWebhook和ValidatingAdmissionWebhook。
mutating admission webhook
我们能够配置这些webhook控制器,指向集群内或集群外的webhook server。我们的webhook server运行着我们自己的admission webhook服务。
当请求到达我们配置的webhook控制器时,将会调用admission webhook server,通过传入一个json形式的admission review object发起请求,该object具有所有关于请求的细节,如:发出请求的用户和用户所要执行的操作类型,以及关于请求自身的一些信息;
在收到请求后,the admission webhook server将以admission review object回应请求方,显示请求是否被允许。如果相应字段的allowed为true,则请求被允许通过,否则请求被拒绝。
我们如何设置这些呢?
首先,我们需要部署admission webhook server,它具有我们定义的逻辑信息
然后,我们在kubernetes上通过创建webhook configuration object,来配置webhook。
deploy webhook server
首先是部署webhook server。这可以是api-server,也可以自定义的,仅有的要求是它能够实现修改和验证操作,并且返回一个JSON对象
下面是一些使用python实现的伪代码
上面有两段调用。/validate调用和/mutate调用。/validate接收validation webhook请求,比较对象名,谁发送了该请求,拒绝用户名不符的请求。/mutate中在label中,patch了一个用户名;patch对象是一组patch操作,每个操作可以是add、remove、replace、move、copy or test,path中指定了生效的地方,value中指定了需要add的user_name。因此我们从请求中获取用户名,并设置到特定的标签中。
这些将会以base64编码的形式,成为响应的一部分。
因此,一旦我们开发完成自己的webhook server,接下来就是部署它了。我们可以在其他地方部署它、或者容器化它,然后通过deployment将它部署在kubernetes集群内,然后配置一个service,是的请求能够访问到它,所以我们有一个名为webhook-serverice的service
接着,我们我们配置service,使得请求能够到达,达到验证和修改请求的目的。
为此,我们需要创建VlidateWebhokConfiguration对象
ClientConfig指定我们的Admission Webhook Server的位置,如果它部署在外部,我们可以填写一个url。
如果我们的Admission Webhook Server以deployment的形式部署在集群内部,同时配置了service。
此时我们可以在ClientConfig中指定Service名称和所属的命名空间
当然,Admission Webhook Server和api-server之间的通信,也是基于TLS的,因此应该配置caBundle,该server被配置了证书对,然后将证书传入该字段中。
接着我们必须要指定何时调用Webhook Server。我们可以精确地指定一组规则,何时我们的Webhook Server能被调用,我们可以指定是在创建POD、删除POD或创建Deploy等情形下调用。下面我们指定了当我们在创建POD时调用
一旦VlidatingWebhookConfiguration被创建,每次我们创建POD时,都会请求Webhook Service,依赖于响应,决定请求是否被通过。
标签:控制器,请求,Admission,webhook,server,Controllers,Validating,controller,admission From: https://www.cnblogs.com/cosmos-wong/p/16868748.html