同期動作を制御する:自動同期、prune、セルフヒール、ロールバック
Argo CD がいつ変更を適用するか、何を削除するか、失敗したデプロイをどう元に戻すかを決めます。
Argo CD のデフォルトは保守的です。差分は検出しますが、自分からクラスターを変更することはありません。完全に自動化する動作は、それぞれ明示的にオプトインする必要があり、環境ごとに異なる自動化レベルを選べます。このガイドでは、前のガイドの webapp-dev アプリケーションを使って、各スイッチを順に説明します。
手動同期と自動同期
syncPolicy.automated ブロックを持たない Application は手動です。Argo CD は Git とクラスターを比較し、両者が異なると OutOfSync と表示しますが、UI で Sync をクリックするか argocd app sync を実行するまで、何も適用されません。
多くのチームは、開発環境とテスト環境には自動同期を使い、本番は手動のままにします。パイプラインを信頼できるようになるまで、人が本番へのロールアウトを毎回承認します。
自動同期を有効にする
アプリケーションの syncPolicy に automated ブロックを追加します。
spec:
syncPolicy:
automated: {}
これにより、望ましい状態を変更する新しい commit は、クリックなしで適用されます。タイミングについて 2 つの詳細があります。
- Argo CD は、デフォルトで 3 分ごとにリポジトリをポーリングして新しい commit を検出します。これは同期ポリシーとは無関係です。ポリシーが決めるのは、検出された差分を適用するかどうかだけです。
- すぐに反応させるには、Git ホストから Argo CD の
/api/webhookエンドポイントへの webhook を設定するか、テスト中に UI で Refresh を押します。
prune を追加する
デフォルトでは、自動同期はリソースの作成と更新は行いますが、何も削除しません。Git でマニフェストの名前を変更したり削除したりすると、古いオブジェクトはクラスターに残り、その残骸のためにアプリケーションは OutOfSync と表示されます。削除を有効にします。
spec:
syncPolicy:
automated:
prune: true
試すには、dev/deployment.yaml の Deployment 名を webapp から webapp-v2 に変更して commit します。Argo CD は新しい Deployment を作成し、古いものを削除します。手動同期では、argocd app sync webapp-dev --prune で一度だけ prune するか、同期ダイアログで Prune にチェックを入れます。prune は実際のオブジェクトを削除するため、意図的に有効にし、状態を保持するリソースには注意してください。
セルフヒールを追加する
自動同期は Git の変更に反応します。セルフヒールは、クラスター側の変更にも反応します。
spec:
syncPolicy:
automated:
prune: true
selfHeal: true
Git が知らない手動の変更を加えて試します。
kubectl scale deployment webapp-v2 -n webapp --replicas=5
kubectl get pods -n webapp -w
追加の Pod が起動しますが、その後 Argo CD が Deployment を Git で宣言された 2 レプリカに戻します。これが目的です。Git が唯一の信頼できる情報源であり続けます。手動変更が自動的に元に戻されることにチームがまだ慣れていない場合は、selfHeal をオフのままにしてください。その場合でも Argo CD はアプリケーションを OutOfSync と表示するので、ドリフトは見えたままです。通知してほしい場合は、通知を追加します。
安全にロールバックする
以前にデプロイされた状態に戻すには、アプリケーションの History and Rollback ビューを開き、以前のリビジョンを選んでロールバックします。CLI での同等の操作は次のとおりです。
argocd app history webapp-dev
argocd app rollback webapp-dev <ID>
ロールバックには、自動同期がオフであることが必要です。そうでないと、Argo CD はすぐにアプリケーションを最新の commit に再同期し、ロールバックを打ち消してしまいます。先に argocd app set webapp-dev --sync-policy none で無効にしてください。ロールバック後は、Git が稼働中のものより進んでいるため、アプリケーションは OutOfSync になります。ロールバックは根本的な修正ではなく、緊急用のレバーとして扱ってください。恒久的な修正は、問題のある commit を git revert して push し、その後に自動同期を再び有効にして、Git とクラスターを一致させることです。