3. 准入控制基础:什么是准入控制(Admission Control)、Admission Webhook的工作原理、Mutating与Validating的区别
3.1 什么是准入控制(Admission Control)
准入控制是 Kubernetes API Server 请求处理链中的一个关键安全与策略执行阶段。它位于身份认证(Authentication)和授权(Authorization)之后,在对象被持久化到 etcd 之前执行。准入控制器会拦截所有对 API Server 的请求(创建、更新、删除操作),并根据预定义的逻辑决定是否允许该请求通过。
核心定位:准入控制是 API 请求到达 etcd 前的最后一道防线,用于执行策略、修改资源或拒绝非法请求。
Kubernetes 内置了多种准入控制器(如 NamespaceLifecycle、LimitRanger、ResourceQuota、PodSecurity 等),同时也支持通过 Admission Webhook 扩展自定义逻辑。
3.2 Admission Webhook 的工作原理
Admission Webhook 是一种动态扩展机制,允许集群管理员注册外部 HTTP 回调服务来处理准入请求。其工作流程分为以下步骤:
- 请求到达 API Server:用户或控制器发起对 API Server 的请求(如
kubectl apply -f pod.yaml)。 - 认证与授权:API Server 验证请求者身份和权限。
- 内置准入控制器执行:按配置顺序执行内置准入控制器。
- Webhook 配置匹配:API Server 检查
MutatingWebhookConfiguration和ValidatingWebhookConfiguration资源,判断当前请求是否匹配某个 Webhook 的规则(如资源类型、操作、命名空间等)。 - 发送 AdmissionReview 请求:API Server 构造
AdmissionReview对象(包含请求的原始对象和用户信息),通过 HTTPS 发送到 Webhook 服务。 - Webhook 处理并响应:Webhook 服务解析请求,执行自定义逻辑,返回
AdmissionReview响应(包含允许/拒绝决策,以及可选的 Patch 操作)。 - API Server 执行决策:如果 Webhook 返回允许,则继续处理;如果返回拒绝,则终止请求并返回错误。
- 对象持久化:通过所有准入控制后,对象被写入 etcd。
性能要点:Webhook 的超时时间默认为 30 秒,超时或不可用会导致请求失败。在生产环境中,建议将 Webhook 服务的超时设置为 5-10 秒,并配置
failurePolicy: Fail 或 failurePolicy: Ignore 以控制故障行为。
3.3 Mutating 与 Validating 的区别
Admission Webhook 分为两种类型:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。它们在执行时机、功能和用途上有本质区别。
| 对比维度 | Mutating Webhook | Validating Webhook |
|---|---|---|
| 执行顺序 | 先执行(在 Validating 之前) | 后执行(在 Mutating 之后) |
| 核心功能 | 修改(Patch)请求对象 | 验证(Validate)请求对象 |
| 响应类型 | 返回 JSON Patch 或允许/拒绝 | 仅返回允许/拒绝 |
| 典型用途 | 注入 Sidecar、设置默认值、修改资源字段 | 校验资源合规性、执行自定义策略 |
| 副作用 | 可能改变对象内容,影响后续验证 | 不修改对象,仅做检查 |
| 配置资源 | MutatingWebhookConfiguration |
ValidatingWebhookConfiguration |
性能陷阱:Mutating Webhook 如果执行时间过长,会阻塞整个 API 请求链。建议将 Mutating 逻辑设计为轻量级操作,避免在 Webhook 中执行外部 API 调用或复杂计算。对于 Pod 密度优化场景,Mutating Webhook 常用于注入资源限制或亲和性规则,需确保其响应时间在 5ms 以内。
3.4 执行顺序与交互关系
在 API Server 的准入控制链中,Mutating 和 Validating Webhook 的执行顺序遵循以下规则:
- 所有 Mutating Webhook 串行执行(按配置中的
rules匹配顺序)。 - 所有 Validating Webhook 串行执行(同样按匹配顺序)。
- 如果某个 Mutating Webhook 修改了对象,后续的 Mutating 和 Validating Webhook 将看到修改后的版本。
- 如果任意一个 Webhook 返回拒绝,整个请求立即终止,不再执行后续 Webhook。
3.5 配置示例
以下是一个 MutatingWebhookConfiguration 的配置示例,用于为 Pod 注入 Sidecar 容器:
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: sidecar-injector.example.com
webhooks:
- name: sidecar-injector.example.com
clientConfig:
service:
name: sidecar-injector
namespace: kube-system
path: /mutate
caBundle: <base64-encoded-ca-cert>
rules:
- operations: ["CREATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
admissionReviewVersions: ["v1"]
sideEffects: None
timeoutSeconds: 5
failurePolicy: Fail
namespaceSelector:
matchLabels:
sidecar-injector: enabled
性能调优建议:在 Pod 密度优化场景中,建议将
timeoutSeconds 设置为 3-5 秒,避免 Webhook 超时导致 Pod 创建延迟。同时,使用 namespaceSelector 和 objectSelector 缩小 Webhook 的匹配范围,减少不必要的准入检查开销。