4. 自动同步(Auto-Sync)机制详解
自动同步是 Argo CD 实现 GitOps 持续交付的核心能力。当启用自动同步后,Argo CD 会持续监控目标集群中 Application 的实际状态与 Git 仓库中声明的期望状态是否一致,一旦检测到偏差,便会自动触发同步操作,将集群状态拉回期望状态。理解自动同步的触发条件、Prune(清理)策略和 Self-Heal(自愈)策略,是配置节点池一致性巡检的基础。
核心原则:自动同步并非“定时轮询”,而是基于事件驱动的状态比对机制。默认每 3 分钟进行一次状态轮询,但 Webhook 事件可以立即触发同步。
4.1 自动同步触发条件
Argo CD 的自动同步触发机制分为两种模式:轮询模式和Webhook 模式。两种模式可以同时启用,互不冲突。
| 触发模式 | 触发条件 | 延迟时间 | 适用场景 |
|---|---|---|---|
| 轮询模式 | Argo CD 每隔 --status-processors 配置的间隔(默认 3 分钟)对比 Git 仓库与集群状态 |
最长 3 分钟 | 基础保障,适用于所有 Application |
| Webhook 模式 | Git 仓库收到 Push / Merge 事件后,通过 Webhook 通知 Argo CD 刷新 Application | 秒级 | 需要快速响应的生产环境 |
| 手动刷新 | 用户通过 CLI 或 UI 执行 argocd app sync 或点击 Refresh 按钮 |
即时 | 调试、紧急修复 |
巡检建议:在节点池场景中,建议为每个节点池 Application 配置 Webhook 触发。当节点池的配置清单(如
kubelet-extra-args、taints、labels)发生变更时,Webhook 能确保所有节点立即开始同步,缩短配置漂移的暴露窗口。
4.2 Prune 策略
Prune 策略决定了当 Git 仓库中删除了某个资源定义时,Argo CD 是否自动删除集群中对应的实际资源。这是自动同步中最需要谨慎配置的选项,因为误删资源可能导致服务中断。
| Prune 策略 | 行为描述 | 风险等级 | 节点池巡检建议 |
|---|---|---|---|
| Prune = false | Git 中删除的资源,集群中保留不动,仅标记为 OutOfSync | 低 | 适用于节点池初始配置阶段,避免误删节点级资源 |
| Prune = true | Git 中删除的资源,Argo CD 自动从集群中删除 | 高 | 仅在生产环境经过充分验证后启用,需配合资源保护策略 |
| Prune Propagation Policy | 控制删除时的级联策略:foreground、background、orphan |
中 | 节点池资源建议使用 background,避免级联删除阻塞 |
⚠️ 节点池巡检关键警告:切勿在节点池 Application 中同时启用
Prune=true 和 Self-Heal=true 且未配置资源排除规则。如果 Git 仓库中节点池的 MachineSet 或 Node 资源被误删除,Argo CD 会自动清理集群中的对应节点,造成大规模节点丢失。
4.3 Self-Heal 策略
Self-Heal(自愈)策略决定了当集群中的资源被手动修改(配置漂移)时,Argo CD 是否自动将其恢复为 Git 仓库中定义的期望状态。这是 GitOps 模型“集群状态不可手动修改”原则的强制保障。
| Self-Heal 策略 | 行为描述 | 适用场景 | 节点池巡检影响 |
|---|---|---|---|
| Self-Heal = false | 集群状态被手动修改后,Argo CD 仅标记为 OutOfSync,不自动恢复 | 调试、临时变更、灰度验证 | 巡检时需人工判断漂移是否可接受 |
| Self-Heal = true | 集群状态被手动修改后,Argo CD 立即自动同步恢复为 Git 状态 | 生产环境、合规要求严格的场景 | 巡检时需确保 Git 仓库为唯一真实来源 |
最佳实践:在节点池场景中,建议为
MachineSet、Machine、Node 等核心资源启用 Self-Heal,防止运维人员通过 kubectl edit 直接修改节点标签或污点导致配置漂移。但对于 ConfigMap 或 Secret 等非关键资源,可暂时关闭 Self-Heal 以便调试。
4.4 自动同步策略组合矩阵
不同的 Prune 和 Self-Heal 组合会产生不同的行为模式。理解这些组合是配置节点池自动同步策略的前提。
| Prune | Self-Heal | 行为模式 | 节点池巡检风险 |
|---|---|---|---|
| false | false | 仅检测漂移,不自动修复,不自动删除 | 低风险,适合巡检告警模式 |
| false | true | 自动恢复手动修改,但不删除已废弃资源 | 中风险,需定期清理废弃资源 |
| true | false | 自动删除废弃资源,但不恢复手动修改 | 中风险,手动修改可能被保留 |
| true | true | 完全自动同步:恢复手动修改 + 删除废弃资源 | 高风险,需严格管控 Git 仓库权限 |
4.5 节点池自动同步配置示例
以下是一个适用于节点池场景的自动同步配置 YAML 示例。该配置启用了 Self-Heal 但关闭了 Prune,适合巡检阶段的保守策略。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: node-pool-production
namespace: argocd
spec:
destination:
namespace: openshift-machine-api
server: https://kubernetes.default.svc
project: node-pool-management
source:
path: clusters/production/node-pools
repoURL: https://git.company.com/infrastructure/node-pool-config.git
targetRevision: main
syncPolicy:
automated:
prune: false # 不自动删除废弃资源
selfHeal: true # 自动恢复手动修改
allowEmpty: false # 不允许空同步
syncOptions:
- Validate=true
- CreateNamespace=false
- PrunePropagationPolicy=background
- PruneLast=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
巡检检查点:在节点池一致性巡检脚本中,应重点检查以下字段:
1.
2.
3.
1.
syncPolicy.automated.prune 是否为 false(除非有明确需求)。2.
syncPolicy.automated.selfHeal 是否为 true(防止配置漂移)。3.
syncPolicy.retry 是否配置了合理的重试策略(避免网络抖动导致同步失败)。