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 回调服务,并接收一个准入响应,具体流程如下:

image

整体的步骤如下所示:

  • 检查集群中是否启用了 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 集群中,然后分别创建 MutatingWebhookConfigurationValidatingWebhookConfiguration 类型的资源清单即可。

实现方式可以参考项目:

https://github.com/cnych/admission-webhook-example


这种方式对于运维来说门槛偏高,就不做过多说明。但是为了解决这类问题,可以使用 Kubernetes 提供的一些策略管理引擎,在不需要编写代码的情况也可以实现这些需求,比如 KyvernoGatekeeper 等,后续再进行详细说明。

posted @ 2022-10-24 17:07  不知名换皮工程师  阅读(136)  评论(0编辑  收藏  举报