控制同步行为:间隔、Prune、漂移修正与回滚
决定 Flux 何时应用变更、删除什么、如何暂停它,以及如何撤销一次有问题的部署。
Flux 的默认行为与那些等待手动同步的工具不同。Flux 的 Kustomization 按计划应用,并且每次运行时都会修正漂移。你能控制的是频率、删除什么、何时等待健康状态,以及何时暂停。本指南使用上一篇指南中的 webapp Kustomization,逐一讲解每个开关。
间隔:Flux 多久查看并应用一次
两个间隔控制着时序,并且它们彼此独立:
GitRepository的 interval 决定多久轮询一次 Git 以获取新提交。- Kustomization 的
interval决定多久重新应用一次清单并修正漂移,即使 Git 没有变化。
spec:
interval: 10m
retryInterval: 2m
retryInterval 是协调失败后重试前的等待时间。若想立即响应而不是等待,可以在测试时手动触发一次协调:
flux reconcile kustomization webapp --with-source
--with-source 会先刷新 Git source,再应用它。对于生产环境,请配置 webhook,让 Git 推送无需频繁轮询就能触发协调(参见通知指南)。
添加 prune(修剪)
默认情况下,Flux 会创建和更新资源,但不会删除任何东西。如果你在 Git 中重命名或删除了某个清单,旧对象会留在集群中。要选择开启删除:
spec:
prune: true
要试一试,把 apps/webapp/deployment.yaml 中的 Deployment 从 webapp 重命名为 webapp-v2,提交并协调。Flux 会创建新的 Deployment 并移除旧的。Flux 通过一份清单(inventory)跟踪它所应用的对象,因此它只会删除它自己创建的东西。Prune 会删除真实的对象,所以请有意识地开启,并对持有状态的资源保持谨慎。
要保护某个对象不被修剪,请在清单中为它添加注解:
metadata:
annotations:
kustomize.toolkit.fluxcd.io/prune: disabled
漂移修正
每次 Kustomization 协调时,它都会再次应用 Git 中的期望状态,因此手动修改会被还原。测试一下:
kubectl scale deployment webapp-v2 -n webapp --replicas=5
flux reconcile kustomization webapp
kubectl get pods -n webapp
Flux 会把 Deployment 还原为 Git 中声明的两个副本。这里没有需要单独开启的”self-heal”开关。这个行为就是默认行为,也是它让 Git 保持为唯一事实来源的原因。
如果你需要手动做一次临时修改,比如调试时,请先暂停 Flux(见下一节)。如果某个对象应当在 Flux 之外管理,请在 Git 中为它添加注解:
metadata:
annotations:
kustomize.toolkit.fluxcd.io/reconcile: disabled
较新的 Flux 版本(2.9)还增加了 server-side apply 的字段忽略规则,让你可以告诉 Flux 不去动特定字段,例如由自动扩缩器管理的副本数。具体语法请参见你所用版本的 Kustomization 参考文档。
等待健康状态并为部署排序
默认情况下,Flux 在 API 服务器接受清单之后就报告成功。设置 wait: true 会让它等到资源就绪,timeout 则限定等待的时长:
spec:
wait: true
timeout: 2m
使用 dependsOn 让一个 Kustomization 等待另一个,例如在需要它的应用之前先安装 ingress 控制器:
spec:
dependsOn:
- name: infrastructure
依赖项必须处于 Ready 状态,这个 Kustomization 才会开始协调。
暂停与恢复
要在不删除任何东西的情况下暂停协调:
flux suspend kustomization webapp
# make manual changes, debug, then:
flux resume kustomization webapp
暂停期间,Flux 会忽略该对象,手动修改会保持原样。恢复会触发一次协调,使集群回到与 Git 一致的状态,所以别忘了恢复。暂停相当于 Flux 中为某个环境关闭自动化。
安全地回滚
Flux 没有针对 Kustomization 的 rollback 命令,因为 Git 就是历史。要撤销一次有问题的变更:
git revert <bad-commit>
git push
flux reconcile kustomization webapp --with-source
Flux 会使集群收敛到被回退后的状态,而 Git 保留一份如实的记录。对于需要先让集群停止变化的紧急情况,请先暂停 Kustomization,修复问题,推送回退,然后恢复。
Helm release 则不同:helm-controller 可以在升级失败时自动回滚,Helm 指南会介绍这一点。
让生产环境保持审慎
由于自动化默认开启,生产环境的把关发生在 Git 中,而不是一个”手动同步”按钮上。常见模式:
- 保护生产分支,并要求拉取请求审批。
- 让生产环境的
GitRepository指向某个标签或 semver 范围(ref.tag或ref.semver),这样生产环境只在你发布版本时才会变化。 - 在变更冻结期间使用
flux suspend。
热门指南
-
推送与拉取:Flux 如何向 Kubernetes 交付 为什么基于拉取、由 Git 驱动的交付会改变你部署、保障安全和恢复集群的方式。 -
使用 GitRepository 与 Kustomization 部署你的第一个应用 通过 Kustomization 资源将 Flux 指向 Git 中的清单,并观察同步。 -
使用 Flux 镜像自动化实现镜像更新自动化 让 Flux 检测新的容器镜像标签,并将其提交回 Git。 -
使用 Flux 配置多集群 从一个仓库管理多个集群,包含共享基础设施和每个集群各自的差异。 -
Flux CD 与 Argo CD:如何选择 GitOps 工具 比较架构、UI、Helm、密钥、租户和镜像自动化,以选出合适的工具。