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
--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
backup=true 标签。Velero 备份任务使用 --selector backup=true 自动发现所有需要备份的服务,无需手动维护命名空间列表。
4.6 备份范围组合与优先级
Velero 允许将上述范围组合使用,但存在明确的优先级规则:
- 命名空间 + 资源类型:先按命名空间过滤,再按资源类型过滤。
- 命名空间 + 标签选择器:先按命名空间过滤,再按标签选择器过滤(标签选择器仅在已选命名空间内生效)。
- 资源类型 + 标签选择器:先按资源类型过滤,再按标签选择器过滤。
- 全集群 + 标签选择器:全集群范围内按标签选择器过滤(最灵活但性能最差)。
以下 SVG 图展示了四种备份范围的关系与组合逻辑:
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 策略引擎自动校验资源范围是否合规。