Flux CD Flux CD

同期動作を制御する:間隔、prune、ドリフトの修正、ロールバック

Flux がいつ変更を適用するか、何を削除するか、どう一時停止するか、失敗したデプロイをどう元に戻すかを決めます。

12 min learn.level.中級

Flux のデフォルトは、手動の同期を待つツールとは異なります。Flux の Kustomization はスケジュールに従って適用し、実行のたびにドリフトを修正します。制御できるのは、どのくらいの頻度か、何が削除されるか、いつヘルスを待つか、いつ一時停止するかです。このガイドでは、前のガイドの webapp の Kustomization を使って、各スイッチを順に説明します。

間隔:Flux がいつ確認し、適用するか

2 つの間隔がタイミングを制御しており、互いに独立しています。

  • GitRepository の間隔は、新しい commit のために Git をポーリングする頻度を決めます。
  • Kustomization の interval は、Git が変更されていなくても、マニフェストを再適用してドリフトを修正する頻度を決めます。
spec:
  interval: 10m
  retryInterval: 2m

retryInterval は、調整が失敗した後、再試行するまでの待ち時間です。待たずに即座に反応させるには、テスト中は手動で調整をトリガーします。

flux reconcile kustomization webapp --with-source

--with-source は、まず Git のソースを更新してから適用します。本番では、頻繁なポーリングなしに、Git の push が調整をトリガーするように、webhook を設定してください(通知のガイドを参照)。

prune を追加する

デフォルトでは、Flux はリソースの作成と更新は行いますが、何も削除しません。Git でマニフェストの名前を変更したり削除したりすると、古いオブジェクトはクラスターに残ります。削除を有効にします。

spec:
  prune: true

試すには、apps/webapp/deployment.yaml の Deployment 名を webapp から webapp-v2 に変更し、commit して調整します。Flux は新しい Deployment を作成し、古いものを削除します。Flux は、インベントリを通じて適用したオブジェクトを追跡するため、自分が作成したものだけを削除します。prune は実際のオブジェクトを削除するため、意図的に有効にし、状態を保持するリソースには注意してください。

1 つのオブジェクトを 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 で宣言された 2 レプリカに戻します。切り替えるべき別個の「セルフヒール」スイッチはありません。その動作がデフォルトであり、Git を唯一の信頼できる情報源に保つものです。

たとえばデバッグ中など、一時的に手動で変更する必要がある場合は、先に Flux を一時停止します(次のセクション)。1 つのオブジェクトを 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

この Kustomization が調整を開始する前に、依存先が Ready である必要があります。

一時停止と再開

何も削除せずに調整を一時停止するには:

flux suspend kustomization webapp
# 手動で変更したり、デバッグしたりして、その後:
flux resume kustomization webapp

一時停止中、Flux はそのオブジェクトを無視し、手動の変更はそのまま残ります。再開すると、クラスターを Git に合わせて戻す調整がトリガーされるため、再開を忘れないでください。一時停止は、Flux における、環境の自動化をオフにすることに相当します。

安全にロールバックする

Git が履歴であるため、Flux には Kustomization に対する rollback コマンドがありません。失敗した変更を元に戻すには:

git revert <bad-commit>
git push
flux reconcile kustomization webapp --with-source

Flux は、クラスターを revert された状態に収束させ、Git は何が起きたかの正直な記録を保ちます。まずクラスターの動きを止めたい緊急時には、Kustomization を一時停止し、問題を修正し、revert を push してから、再開します。

Helm リリースは異なります。helm-controller は失敗したアップグレードを自動的にロールバックでき、これは Helm のガイドで説明します。

本番を意図的に保つ

自動化がデフォルトで有効になっているため、本番のゲート制御は、「手動同期」ボタンではなく、Git で行われます。一般的なパターンは次のとおりです。

  • 本番ブランチを保護し、プルリクエストの承認を必須にします。
  • 本番の GitRepository を、タグまたは semver の範囲(ref.tag または ref.semver)に向けて、リリースを切ったときだけ本番が変わるようにします。
  • 変更凍結の期間中は、flux suspend を使います。

人気のガイド