Flux CD Flux CD

控制同步行为:间隔、Prune、漂移修正与回滚

决定 Flux 何时应用变更、删除什么、如何暂停它,以及如何撤销一次有问题的部署。

12 min 中级

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。

热门指南