4. Velero 备份资源范围:从全集群到标签过滤

在云原生灾备准入策略评审中,备份资源范围是定义灾备边界的第一道防线。Velero 提供了四个层级的资源选择能力,从最粗粒度的全集群备份,到最细粒度的标签选择器过滤。理解每一层级的语义、适用场景与安全约束,是构建合规灾备策略的基础。

核心原则:备份范围越窄,恢复速度越快、存储成本越低、跨集群迁移的兼容性风险越小。准入策略应强制要求生产环境使用命名空间或标签过滤,禁止无限制的全集群备份。

4.1 四种备份范围对比

备份范围 Velero 参数 包含资源 典型场景 安全风险等级
全集群 --include-cluster-resources=true 所有命名空间 + 集群作用域资源(Node、PV、CRD、ClusterRole 等) 集群迁移、灾难恢复演练 高(可能泄露敏感 RBAC 或存储类)
指定命名空间 --include-namespaces 所选命名空间内的所有资源(Deployment、ConfigMap、Secret 等) 应用级灾备、多租户隔离 中(需配合命名空间白名单)
指定资源类型 --include-resources 仅备份指定的 API 资源类型(如 deployments、configmaps) 仅备份无状态应用、排除 PV 数据 低(范围明确)
标签选择器 --selector 匹配标签的资源(跨命名空间、跨资源类型) 按业务域、环境标签备份 最低(精确控制)

4.2 全集群备份:谨慎使用的“核选项”

全集群备份会捕获集群中所有 Kubernetes 资源,包括集群作用域对象。在准入策略评审中,应将其视为高风险操作。

# 全集群备份命令示例
velero backup create full-cluster-backup \
  --include-cluster-resources=true \
  --ttl 72h
安全警告:全集群备份会包含 ClusterRole、ClusterRoleBinding、PersistentVolume 等敏感对象。如果备份存储未加密或访问控制不严,可能导致集群权限模型泄露。建议仅在隔离的 DR 集群上执行,且必须启用 Velero 的 --use-volume-snapshots=false 以避免存储类扩散。

4.3 指定命名空间:多租户灾备的基石

指定命名空间是最常用的备份范围,适合微服务架构下的应用级灾备。Velero 支持同时指定多个命名空间,用逗号分隔。

# 备份 production 和 staging 两个命名空间
velero backup create ns-backup \
  --include-namespaces production,staging \
  --ttl 168h

在准入策略中,应强制要求备份命令必须包含 --include-namespaces 参数,并配合命名空间白名单机制,防止备份到未授权的命名空间(如 kube-system、velero 自身)。

4.4 指定资源类型:精细控制备份内容

当只需要备份特定类型的资源时(例如只备份 Deployment 和 ConfigMap,排除 Secret 和 PVC),使用 --include-resources 参数。

# 仅备份 deployments 和 configmaps
velero backup create resource-filter-backup \
  --include-namespaces production \
  --include-resources deployments,configmaps \
  --ttl 72h

此模式常与 --exclude-resources 配合使用,实现“排除式”过滤。例如,备份命名空间内所有资源,但排除 secrets 和 events。

# 排除敏感资源
velero backup create exclude-sensitive-backup \
  --include-namespaces production \
  --exclude-resources secrets,events \
  --ttl 72h

4.5 标签选择器:最灵活的过滤方式

标签选择器允许基于 Kubernetes 标签进行跨命名空间、跨资源类型的精确过滤。这是实现“按业务域备份”的最佳实践。

# 备份所有带有 app=nginx 标签的资源
velero backup create label-backup \
  --selector app=nginx \
  --ttl 72h

标签选择器支持 =(等于)、!=(不等于)、in(属于集合)、notin(不属于集合)等操作符,语法与 Kubernetes 标签选择器完全一致。

# 复杂标签选择:环境为 production 且 tier 不为 database
velero backup create complex-label-backup \
  --selector 'environment=production,tier notin (database)' \
  --ttl 72h
最佳实践:在 CI/CD 流水线中,建议为每个微服务打上 backup=true 标签。Velero 备份任务使用 --selector backup=true 自动发现所有需要备份的服务,无需手动维护命名空间列表。

4.6 备份范围组合与优先级

Velero 允许将上述范围组合使用,但存在明确的优先级规则:

  • 命名空间 + 资源类型:先按命名空间过滤,再按资源类型过滤。
  • 命名空间 + 标签选择器:先按命名空间过滤,再按标签选择器过滤(标签选择器仅在已选命名空间内生效)。
  • 资源类型 + 标签选择器:先按资源类型过滤,再按标签选择器过滤。
  • 全集群 + 标签选择器:全集群范围内按标签选择器过滤(最灵活但性能最差)。

以下 SVG 图展示了四种备份范围的关系与组合逻辑:

Velero 备份资源范围层级图 Velero 备份资源范围层级与组合逻辑 全集群备份 指定命名空间 指定资源类型 标签选择器 组合过滤(命名空间 + 资源类型 + 标签) 说明: • 全集群备份包含所有命名空间和集群作用域资源,风险最高。 • 组合过滤时,先按命名空间过滤,再按资源类型或标签进一步缩小范围。

4.7 准入策略评审清单

在灾备准入策略评审中,针对备份资源范围,应检查以下要点:

检查项 合规要求 违规示例
全集群备份审批 必须经过安全团队审批,且备份存储必须加密 未审批直接执行全集群备份
命名空间白名单 备份命令必须包含 --include-namespaces,且命名空间在白名单内 备份了 kube-system 或 velero 自身
敏感资源排除 必须显式排除 secrets 或使用加密备份 备份中包含明文 Secret
标签选择器验证 标签选择器必须匹配预期的资源集合 标签选择器过于宽泛(如 app=*)
备份范围审计 每次备份任务必须记录其资源范围参数 未记录 --include-namespaces 或 --selector 参数

4.8 审计日志中的资源范围记录

Velero 的审计日志会记录每次备份任务的资源范围参数。以下是一个典型的审计日志条目(JSON 格式):

{
  "timestamp": "2025-03-15T10:30:00Z",
  "action": "backup.create",
  "user": "system:serviceaccount:velero:velero-server",
  "backup_name": "production-app-backup",
  "parameters": {
    "include_namespaces": ["production", "staging"],
    "include_resources": ["deployments", "configmaps", "services"],
    "exclude_resources": ["secrets", "events"],
    "selector": "app=nginx,environment=production",
    "include_cluster_resources": false,
    "ttl": "168h"
  },
  "result": "success"
}

在准入策略评审中,应定期审计备份任务的 parameters 字段,确保资源范围符合组织安全基线。例如,检查是否存在 include_cluster_resources: true 且未经过审批的备份任务。

审计自动化建议:使用 velero backup describe <backup-name> --json 命令获取备份的完整参数,并通过 OPA(Open Policy Agent)或 Kyverno 策略引擎自动校验资源范围是否合规。