Webhook是一种API概念,用于实现反向API,即由后端进行推送,而不是由前端发送请求。它可以用于朋友圈/微博的推送、安全场景、支付成功后的通知等场景。在Kubernetes中,Admission Webhook是一种机制,用于验证、修改或拒绝Kubernetes API对象的请求,以确保这些对象符合应用程序的需求和策略。Admission Webhook通常用于实现安全、合规性和自动化等功能。其中,Validating和Mutating Admission是两种常见的Admission Controller,用于验证请求是否符合规范并对其进行修改。使用Admission Webhook需要确保Kubernetes集群版本至少为v1.16或v1.9,并启用MutatingAdmissionWebhook和ValidatingAdmissionWebhook准入控制器。
Webhook
定义
钩子, 回调URL
Webhook是一个API概念--> 反向API,前端不发送请求,而是由后端进行推送。这是对传统的 client -->server的一种逆转,一种新的交互方式。
场景
朋友圈/微博的推送;
安全场景;
支付成功之后后端主动推送,不再需要前端轮询,通知支付状态;
代码构建成功通知。
K8s的 Admission Webhook
定义
Kubernetes 中的 Admission Webhook 是一种机制,可用于对 Kubernetes API 对象进行验证、修改或拒绝请求,以确保这些对象符合其应用程序的需求和策略。Admission Webhook 通常用于实现安全、合规性和自动化等功能。

接收HTTP请求 --> 认证 --> 授权 --> 准入
为什么需要准入控制器 Admission Controller
从两个角度来理解为什么我们需要准入控制器:
-
从安全的角度
-
我们需要明确在 Kubernetes 集群中部署的镜像来源是否可信,以免遭受攻击;
-
一般情况下,在 Pod 内尽量不使用 root 用户,或者尽量不开启特权容器等;
-
-
从治理的角度
-
比如通过 label 对业务/服务进行区分,那么可以通过 admission controller 校验服务是否已经有对应的 label 存在之类的;
-
比如添加资源配额限制 ,以免出现资源超卖之类的情况;
-
为什么 Validating /Mutating Admission (动态准入控制器)?
其实有很多种准入控制器 Admission Controller ,
以下是几种常见的 Admission Controller:
-
Namespace Lifecycle:该 Admission Controller 可以确保命名空间的生命周期符合规范。例如,它可以防止用户创建不符合命名空间命名约定的命名空间或删除正在使用的命名空间。
-
Resource Quota:该 Admission Controller 可以确保 Kubernetes 集群中的资源使用量不会超过预定义的限制。例如,它可以防止用户创建过多的 Pod、Deployment 或 Service 对象,从而导致资源耗尽。
-
Limit Range:该 Admission Controller 可以确保 Kubernetes 集群中的容器资源使用量在预定义的限制范围内。例如,它可以限制容器的 CPU 使用量和内存使用量,从而防止容器使用过多的资源。
-
PodSecurityPolicy:该 Admission Controller 可以确保 Pod 对象符合安全策略。例如,它可以防止用户创建特权容器或使用不安全的容器镜像,从而提高集群的安全性。
-
MutatingWebhook:该 Admission Controller 可以在创建或更新对象之前修改对象规范。例如,它可以自动为 Pod 添加 sidecar 容器、自动为 Deployment 添加标签,从而简化应用程序部署和管理。
Validating /Mutating 只是其中两种,而这两种是
kube-apiserver 提供了一种可扩展的方式, 用户可以通过配置
MutatingAdmissionWebhook
和 ValidatingAdmissionWebhook
来使用自构建的服务, 而且这种方式是无需对 kube-spiserver 执行编译或者重启,完全是动态的,非常的方便使用条件
确保 Kubernetes 集群版本至少为 v1.16(以便使用
admissionregistration.k8s.io/v1
API) 或者 v1.9 (以便使用 admissionregistration.k8s.io/v1beta1
API);确保已经启用
MutatingAdmissionWebhook
和 ValidatingAdmissionWebhook
准入控制器;确保启用了
admissionregistration.k8s.io/v1beta1
或者 admissionregistration.k8s.io/v1
API;实现方式
两种动态准入介绍
-
Validating Admission Webhook:在创建、更新或删除 Kubernetes API 对象之前验证其规范性。在这种方式下,当 Kubernetes API Server 接收到一个请求时,它将发送一个验证请求到 Admission Webhook,Admission Webhook 将通过校验逻辑验证该请求是否符合规范,如果请求不符合规范,Admission Webhook 将返回一个错误响应并拒绝该请求。
-
Mutating Admission Webhook:可以在创建、更新或删除 Kubernetes API 对象之前对其进行修改。在这种方式下,当 Kubernetes API Server 接收到一个请求时,它将发送一个修改请求到 Admission Webhook,Admission Webhook 将通过修改逻辑对该请求进行修改,并返回一个修改后的请求,Kubernetes API Server 将使用修改后的请求来创建、更新或删除 Kubernetes API 对象。