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 准入架构中三个核心组件的协作关系:
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路径,接收AdmissionReviewJSON 请求。 - 超时设置:默认超时 10 秒,超时后根据
failurePolicy决定是否放行。
常见故障根因: Webhook Server 的 TLS 证书过期或
caBundle 不匹配,会导致 kube-apiserver 无法建立 HTTPS 连接,表现为 x509: certificate has expired or is not yet valid 错误。建议使用 cert-manager 自动管理证书轮换。
4.6 组件依赖关系与故障排查路径
下图展示了组件间的依赖关系及故障排查的推荐路径:
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 保障服务可用性。