同期動作を制御する:間隔、prune、ドリフトの修正、ロールバック
Flux がいつ変更を適用するか、何を削除するか、どう一時停止するか、失敗したデプロイをどう元に戻すかを決めます。
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を使います。
人気のガイド
-
Push と Pull:Flux が Kubernetes にデリバリーする仕組み Git 主導の pull 型デリバリーが、デプロイ、セキュリティ、復旧の方法をどう変えるか。 -
GitRepository と Kustomization で最初のアプリケーションをデプロイする Kustomization リソースを使って Flux を Git のマニフェストに向け、同期の様子を確認します。 -
Flux Image Automation でイメージの更新を自動化する 新しいコンテナイメージのタグを Flux に検出させ、Git に commit させます。 -
Flux でマルチクラスターを構成する 共有インフラとクラスターごとの違いを持たせて、1 つのリポジトリから複数のクラスターを管理します。 -
Flux CD と Argo CD:GitOps ツールの選び方 アーキテクチャ、UI、Helm、シークレット、テナンシー、イメージの自動化を比較して、適切なツールを選びます。