4. Velero 准入架构核心组件:MutatingWebhookConfiguration、ValidatingWebhookConfiguration、Webhook Server

在 Velero 的灾备准入场景中,Kubernetes 的动态准入控制(Dynamic Admission Control)是拦截和修改资源请求的核心机制。Velero 通过部署 Webhook Server,并注册 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 两种资源,实现对备份/恢复操作的策略注入与合法性校验。

4.1 核心组件概览

下表对比了三种核心组件的职责与生命周期关系:

组件名称 API 版本 核心职责 调用时机
MutatingWebhookConfiguration admissionregistration.k8s.io/v1 拦截资源创建/更新请求,注入 Velero 默认标签、注解或 Sidecar 配置 Admission 链中先于验证阶段执行
ValidatingWebhookConfiguration admissionregistration.k8s.io/v1 校验备份/恢复策略的合法性,拒绝不符合规则的请求 Mutation 完成后、对象持久化前执行
Webhook Server Deployment + Service 运行 HTTPS 服务,接收 kube-apiserver 的 AdmissionReview 请求并返回响应 由 kube-apiserver 根据配置触发
故障排查要点: 当 Velero 准入功能失效时,优先检查 Webhook Server 的 Pod 状态、TLS 证书有效性,以及 WebhookConfiguration 中的 clientConfig 是否指向正确的 Service 端点。

4.2 组件交互流程与架构

下图展示了 Velero 准入架构中三个核心组件的协作关系:

Velero 准入架构核心组件交互图 Velero 准入架构核心组件交互图 Kubernetes API Server 准入控制链 kube-apiserver MutatingWebhookConfiguration 注入标签/注解/Sidecar ValidatingWebhookConfiguration 校验策略/拒绝非法请求 Webhook Server (Deployment) HTTPS /admission 端点 Service (ClusterIP) 1. 拦截请求 2. 拦截请求 AdmissionReview AdmissionReview 说明:kube-apiserver 根据 WebhookConfiguration 中的 rules 匹配资源,将 AdmissionReview 请求发送至 Webhook Server 的 Service 端点。

4.3 MutatingWebhookConfiguration 详解

MutatingWebhookConfiguration 负责在资源持久化之前修改对象。Velero 利用它实现以下功能:

  • 自动注入备份标签:为符合条件的 Namespace 或资源添加 velero.io/backup-name 标签。
  • 注入 Sidecar 代理:在 Pod 创建时注入 Velero 数据移动代理容器。
  • 默认注解填充:为备份/恢复任务添加默认的 TTL、存储位置等注解。

典型故障场景: MutatingWebhookConfiguration 中的 failurePolicy 设置为 Fail 时,如果 Webhook Server 不可用,会导致整个集群的资源创建/更新被阻塞。排查时检查 kubectl get mutatingwebhookconfiguration 的 failurePolicy 字段。

4.4 ValidatingWebhookConfiguration 详解

ValidatingWebhookConfiguration 在 Mutation 完成后执行,用于拒绝不符合 Velero 策略的请求:

  • 备份策略校验:检查备份名称是否重复、存储位置是否存在、资源选择器是否合法。
  • 恢复策略校验:验证恢复目标 Namespace 是否存在、是否允许跨集群恢复、是否违反资源配额。
  • 安全约束:拒绝包含危险注解(如 velero.io/skip-validation=true)的请求。
校验类型 校验规则示例 拒绝条件
备份名称唯一性 检查 Backup 资源名称是否已存在 名称冲突时拒绝
存储位置有效性 验证 StorageLocation 是否存在且可用 位置不存在或状态异常时拒绝
资源选择器合法性 校验 LabelSelector 语法 语法错误或匹配空集时拒绝
跨集群恢复限制 检查集群 UUID 是否匹配 UUID 不匹配且未设置强制标志时拒绝

4.5 Webhook Server 实现细节

Webhook Server 是实际处理 AdmissionReview 请求的后端服务,其核心要素包括:

  • 部署形态:以 Deployment 运行,通常包含 2 个副本以保证高可用。
  • TLS 证书:必须配置由 Kubernetes CA 签发的证书,kube-apiserver 通过 clientConfig.caBundle 验证服务端身份。
  • 端点路径:默认监听 /admission 路径,接收 AdmissionReview JSON 请求。
  • 超时设置:默认超时 10 秒,超时后根据 failurePolicy 决定是否放行。
常见故障根因: Webhook Server 的 TLS 证书过期或 caBundle 不匹配,会导致 kube-apiserver 无法建立 HTTPS 连接,表现为 x509: certificate has expired or is not yet valid 错误。建议使用 cert-manager 自动管理证书轮换。

4.6 组件依赖关系与故障排查路径

下图展示了组件间的依赖关系及故障排查的推荐路径:

Velero 准入组件依赖与故障排查路径 组件依赖关系与故障排查路径 kube-apiserver WebhookConfiguration Service 端点 Webhook Server Pod TLS 证书 (Secret) 引用 路由 触发 负载均衡 挂载 排查路径:检查 WebhookConfiguration → 验证 Service 端点可达性 → 检查 Pod 日志 → 确认 TLS 证书有效性

4.7 关键配置示例

以下是一个典型的 Velero MutatingWebhookConfiguration 配置片段:

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: velero-mutating-webhook
webhooks:
- name: mutation.velero.io
  clientConfig:
    service:
      name: velero-webhook-service
      namespace: velero
      path: /admission
    caBundle: <base64-encoded-ca-cert>
  rules:
  - operations: ["CREATE", "UPDATE"]
    apiGroups: ["*"]
    apiVersions: ["*"]
    resources: ["pods", "namespaces"]
  failurePolicy: Fail
  sideEffects: None
  admissionReviewVersions: ["v1"]
生产建议: 将 failurePolicy 设置为 Fail 可以保证准入策略的强制生效,但会增加 Webhook Server 故障时的集群风险。建议在 Webhook Server 部署稳定后,再切换为 Fail 模式,并配合 PodDisruptionBudget 保障服务可用性。