16. Kubernetes - Admission
准入控制器
准入控制器(Admission Controller)位于 API Server 中,在 对象被持久化
之前,准入控制器会拦截对 API Server 的请求,一般用来做身份验证和授权。主要包含两个特殊的控制器,分别用作配置的变更和验证。
MutatingAdmissionWebhook
:修改请求对象ValidatingAdmissionWebhook
:验证请求对象
准入控制器是在 API Server 的启动参数中配置的。一个准入控制器可能属于以上两者中的一种,也可能两者都属于。当请求到达 API Server 的时候首先执行变更准入控制(Mutating),然后再执行验证准入控制(Validating)。
在部署 Kubernetes 集群的时候都会默认开启一系列准入控制器,如果没有设置说明你的 Kubernetes 集群就是在裸奔。
可以通过 kube-apiserver 命令可以查看内置支持的控制器:
# 查看内置支持的控制器
kube-apiserver --help | grep enable-admission-plugins
# 查看是否启用了准入注册 API,返回 admissionregistration.k8s.io/v1 则表示开启
kubectl api-versions | grep admission
除此之外,用户也可以通过 Admission webhooks
的动态配置自己编写控制器。
Admission webhook
准入控制器的两个控制器会将发送的准入请求转发到外部的 HTTP 回调服务,并接收一个准入响应,具体流程如下:
整体的步骤如下所示:
- 检查集群中是否启用了 admission webhook 控制器,并根据需要进行配置。
- 编写处理准入请求的 HTTP 回调,回调可以是一个部署在集群中的简单 HTTP 服务,甚至也可以是一个 serverless 函数。
- 通过 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 资源配置 admission webhook。
这两种类型的 admission webhook 之间的区别是非常明显的:
validating webhook
可以拒绝请求,但是却不能修改准入请求中获取的对象。mutating webhook
可以在返回准入响应之前通过创建补丁来修改对象,也可以拒绝请求,阻止请求继续往下进行。
所以,mutating webhook 在功能上优点包含 validating webhook。
现在非常火热的 Service Mesh 应用 istio
就是通过 mutating webhooks 来自动将 Envoy
这个 sidecar 容器注入到 Pod 中去的。
如果想要编写一个 webhook 服务,有编程经验的可以自己实现:其实就是实现一个 HTTP 服务,提供一个 /validate
和一个 /mutate
接口。在接口的 handler 里面对拿到的数据进行判断和处理,最终返回响应。Kubernetes 针对不同的编程语言也提供了相应的包,封装了相关的一些方法,可以直接使用。服务编写完成后,可以使用 deployment 将其运行在 Kubernetes 集群中,然后分别创建 MutatingWebhookConfiguration
和 ValidatingWebhookConfiguration
类型的资源清单即可。
实现方式可以参考项目:
这种方式对于运维来说门槛偏高,就不做过多说明。但是为了解决这类问题,可以使用 Kubernetes 提供的一些策略管理引擎,在不需要编写代码的情况也可以实现这些需求,比如 Kyverno
、Gatekeeper
等,后续再进行详细说明。