werwerwer
DR 容灾Active / Standby Controller 协同

Active → Standby 资源同步规范

Sync 资源的契约与字段定义

Active → Standby 资源同步规范

面向规则提供方与 Controller 作者:在 Global 集群 + Active/Standby 容灾场景下,怎么决定我的 CRD / Secret / ConfigMap 应该被 etcd-sync 同步过去,还是应该被忽略。

原则

转成判断:

资源是否需要在 Standby 上"立即可见"是否
Standby 是否会基于该资源在本集群再写其他对象同步主对象 + 忽略派生对象同步主对象
—忽略

决策表

资源类型默认建议备注
业务方 CRD 主对象(spec 由 Active 维护)同步Standby 切换为 Active 后能立刻接管
CRD 的 *State / *Status 子对象(由本地 Controller 维护)忽略每集群本地状态,同步过去只会引发循环冲突
本集群派生的密钥 Secret忽略例:etcd-encryption-key-<revision>
根密钥材料 Secret(需要在两侧分别布置)忽略例:etcd-derivation-root,由部署流程在两侧各自创建
集群级运行时配置 ConfigMap(控制本集群行为)忽略例:kube-public/etcd-sync 自身
默认/全局元数据对象(spec 跨 DR 一致)视情况如果两侧都由 chart 渲染、值天然一致,建议忽略;否则同步
节点 / 命名空间级缓存对象忽略这些对象在 Standby 上由本地控制器自然重建
跨集群拓扑对象(Cluster、MachinePool 等)同步见 迁移清单 中 Cluster Lifecycle 一行

与 etcd-sync 字段的对应

落到 ConfigMap 上的实际字段(详见 etcd-sync-dynamic-configmap-migration/provider-spec.md 的"支持的数据键"):

决策推荐 data key何时使用
同步整个资源前缀sync-prefix-file.txt资源以前缀聚合,例如某个 API group 下整批 CRD
同步特定单条sync-equal-file.txt仅一两个对象(例如某个具名 default 实例)
同步并附带删除事件配套 sync-delete-prefix-file.txt + sync-delete-ignore.txtActive 删除一个对象时,Standby 也要级联删除;sync-delete-ignore.txt 用于保留 Global 集群自身托管的同前缀对象
忽略整个前缀ignore-prefix-file.txt状态对象、本地派生 Secret 这类整批忽略
忽略单条ignore-equal.txt单个具名对象,例如 marker ConfigMap
按值过滤ignore-kvs-file.txt只想忽略某些 phase / 某些类型字段值的对象

推荐写法

每个产品维护一个带启用标签的 ConfigMap,把"同步"和"忽略"两类字段都收敛到同一个对象里。这样:

  • 删除时一次操作就能下掉全部规则
  • weight 可以集中调
  • provider-spec.md 中的状态 annotation 直接定位到本产品

骨架示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: <product>-etcd-sync-rules
  namespace: <product>-system
  labels:
    etcd-sync.cpaas.io/enabled: "true"
  annotations:
    etcd-sync.cpaas.io/weight: "10"
data:
  sync-prefix-file.txt: |
    /registry/<your-api-group>/<your-resource>/
  ignore-prefix-file.txt: |
    /registry/<your-api-group>/<your-resource>states/
    /registry/secrets/<your-namespace>/<your-derived-secret-prefix>
  ignore-equal.txt: |
    /registry/configmaps/<your-namespace>/<your-runtime-marker>

weight 默认 0;只有需要压过其他来源时才提高。

参考样板:etcd-encryption-manager

这是本仓内已有的一份完整决策样本:

路径决策
/registry/etcdkeyseedbundles.cluster.alauda.io/同步——Standby 据此派生密钥
/registry/etcdkeyseedbundlestates.cluster.alauda.io/忽略——本地执行状态
/registry/etcdencryptionconfigs.cluster.alauda.io/default忽略——两侧分别由 chart 渲染
/registry/secrets/kube-system/etcd-derivation-root忽略——根密钥由部署在两侧各自分发
/registry/secrets/kube-system/etcd-encryption-key-忽略——本地派生出的 key
/registry/configmaps/kube-public/etcd-sync忽略——本地 etcd-sync 自身的 marker

把这份样板按"同步 / 忽略"二分组展开:

完整背景见 etcd-encryption-deterministic-key/key-derivation-spec.md。

校验

检查方法通过标准
同步前缀确实被覆盖在 Active 创建一条对象,看 Standby 是否出现出现且字段一致
忽略前缀确实没动在 Active 修改一个本应忽略的 Secret,看 Standby 是否变化不变化
状态 annotation 落到产品 ConfigMap 上kubectl get cm -o yaml 看 etcd-sync.cpaas.io/statusaccepted
优先级符合预期etcd-sync.cpaas.io/observed-weight 与设置值一致完全一致

排障路径见 etcd-sync-dynamic-configmap-migration/migration-handbook.md 的"常见问题"章节。

On this page