ArgoCD 与 Stakater Reloader 冲突
使用 Stakater Reloader 更新 StatefulSet 时,可能会遇到只更新一个 Pod,后续 Pod 不再继续更新的情况。
Reloader 默认使用 env-vars 策略。ConfigMap 或 Secret 变化后,它会在容器中更新一个辅助环境变量,从而改变 Pod Template,并触发滚动更新。
如果 StatefulSet 同时由 Argo CD 管理,这次环境变量修改可能被当成配置差异并恢复。StatefulSet 的目标 revision 随之改变,滚动更新就可能中途停止或回退。
可以把 Reloader 改成注解策略:
reloader:
reloadStrategy: annotations
修改后,Reloader 不再更新容器环境变量,而是在 Pod Template 上动态维护以下注解:
reloader.stakater.com/last-reloaded-from
注解变化同样会改变 .spec.template,因此仍能触发 StatefulSet 滚动更新。这个注解通常不在 Git 生成的初始清单中,而是由 Reloader 在运行时添加和更新。
Reloader 官方也建议在 Argo CD、Flux 等 GitOps 环境中使用 annotations 策略。
改成该策略后,StatefulSet 可以正常完成滚动更新,Argo CD 也一直保持 Synced。