3、准入控制框架原理:Admission Controller工作流程、Mutating与Validating Webhook、准入链与资源校验
准入控制(Admission Control)是 Kubernetes API Server 请求处理链中的关键安全与策略执行环节。当请求通过认证(Authentication)与授权(Authorization)后,在对象被持久化到 etcd 之前,准入控制器会拦截请求并执行校验、修改或拒绝操作。本章深入剖析准入控制框架的核心原理,包括工作流程、Webhook 机制、准入链编排以及资源校验策略。
3.1 准入控制工作流程
Kubernetes API Server 的请求处理遵循严格的流水线架构。准入控制器位于认证与授权之后、etcd 存储之前,是请求进入集群前的最后一道防线。其完整工作流程如下:
- 认证(Authentication):验证请求发起者的身份(如 TLS 证书、、用户名/密码)。
- 授权(Authorization):基于 RBAC、ABAC 或 Webhook 策略,判断请求者是否有权限执行操作。
- 准入控制(Admission Control):分为两个阶段——变更(Mutating)阶段与验证(Validating)阶段。
- 持久化(etcd Storage):通过准入校验的对象被写入 etcd 数据库。
3.2 Mutating 与 Validating Webhook
Kubernetes 提供了两种内置的准入控制器扩展机制:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。它们允许集群管理员通过外部 HTTP 回调(Webhook)实现自定义的准入逻辑,而无需修改 API Server 代码。
| 特性 | Mutating Webhook | Validating Webhook |
|---|---|---|
| 执行阶段 | 先执行(变更阶段) | 后执行(验证阶段) |
| 主要功能 | 修改请求对象(如注入默认值、添加标签/注解) | 校验请求对象是否满足策略(如资源限制、安全上下文) |
| 返回结果 | 允许(Allow)或补丁(Patch) | 允许(Allow)或拒绝(Deny) |
| 典型场景 | Istio Sidecar 注入、Pod 资源预留默认值设置 | Pod 安全策略校验、资源配额检查、命名空间隔离 |
| 配置资源 | MutatingWebhookConfiguration | ValidatingWebhookConfiguration |
3.3 准入链与资源校验
Kubernetes 的准入控制器以链式(Chain)方式组织,每个控制器按顺序执行。内置控制器(如 ResourceQuota、PodSecurity)与 Webhook 控制器共同组成准入链。资源校验是准入链的核心职责之一,确保集群资源的合理分配与安全使用。
3.3.1 准入链执行顺序
准入链的执行顺序由 API Server 启动参数 --enable-admission-plugins 和 --admission-control-config-file 控制。典型的准入链顺序如下:
- NamespaceLifecycle:确保命名空间存在且未被删除。
- MutatingAdmissionWebhook:执行外部变更 Webhook。
- PodNodeSelector:注入节点选择器。
- PodTolerationRestriction:注入容忍度。
- ResourceQuota:校验资源配额。
- PodSecurity:校验 Pod 安全上下文。
- ValidatingAdmissionWebhook:执行外部验证 Webhook。
3.4 资源校验策略与实现
在资源画像驱动的 Pod 资源预留场景中,资源校验策略通常包含以下维度:
| 校验维度 | 策略示例 | 校验逻辑 |
|---|---|---|
| CPU 预留比例 | 预留比例 ≥ 10% 且 ≤ 30% | 计算 (requests - limits) / requests 的百分比 |
| 内存预留比例 | 预留比例 ≥ 5% 且 ≤ 25% | 计算 (requests - limits) / requests 的百分比 |
| 资源请求下限 | CPU requests ≥ 100m,Memory requests ≥ 128Mi | 比较 requests 与阈值 |
| 资源限制上限 | CPU limits ≤ 4 核,Memory limits ≤ 8Gi | 比较 limits 与阈值 |
| 预留一致性 | 所有容器必须设置相同的预留比例 | 遍历容器列表,检查预留比例一致性 |
// 伪代码:Validating Webhook 资源预留校验
func validatePodReservation(pod *corev1.Pod) (bool, string) {
for _, container := range pod.Spec.Containers {
cpuRequest := container.Resources.Requests.Cpu().MilliValue()
cpuLimit := container.Resources.Limits.Cpu().MilliValue()
if cpuLimit > 0 {
reservationRatio := float64(cpuLimit-cpuRequest) / float64(cpuLimit) * 100
if reservationRatio < 10.0 || reservationRatio > 30.0 {
return false, fmt.Sprintf("Container %s CPU reservation ratio %.2f%% out of range [10%%, 30%%]", container.Name, reservationRatio)
}
}
}
return true, ""
}
3.5 准入控制框架与资源画像的集成
在《准入控制框架下资源画像驱动的Pod资源预留方法》课程中,准入控制框架是资源画像策略落地的核心载体。通过 Mutating Webhook 注入资源预留默认值,通过 Validating Webhook 校验预留策略,资源画像数据(如历史负载统计、节点资源利用率)被动态转化为准入规则,实现智能化的资源预留管理。