ドリフトを作り、見て、戻す
目標
ドリフトを自分で作り、その差を計算してファイルに残し、宣言した状態に戻すという一巡を、手で回します。続いてsync waveとPreSyncフックのマニフェストを作成し、クラスターを調べてpruneの対象を判別します。
なぜ重要なのか
Argo CDの調整ループは魔法ではなく、このラボで行うことをデフォルトで180秒ごとに繰り返しているだけです。再レンダリングし、liveを読み、比較し、ポリシーが許せば適用します。このループを手で一度回してみると、refreshとsyncがなぜ別の動作なのか、selfHealを有効にするということが運用にどんな規律を求めるのかが、体で理解できます。pruneの判別も同じです。エージェントはクラスターのすべてのリソースを消すのではなく、自分が作ったと印を付けておいたもののうち、Gitから消えたものだけを消します。この境界を知らないと、「なぜあれは消えないのか」と「なぜあれが消えたのか」の両方を説明できません。このラボ環境にはArgo CDのCRDがないので、ウェーブとフックはファイルとして作成し、採点もファイルを読んで行います。
ステップ
/root/cgoa-drift/desired/orders.yamlにDeploymentordersを作成してください(ネームスペースcgoa-drift、spec.replicas: 2、セレクターとPodラベルはapp: orders、コンテナ名app、イメージnginx:1.27-alpine)。ネームスペースcgoa-driftを作成し、このファイルをkubectl apply -fで適用してください。- ファイルはそのままにして、クラスターの
ordersのreplicasだけを5に変え、ドリフトを作ってください。そして変わったliveの値をkubectl get ... -o jsonpathで読み取り、/root/cgoa-drift/live-replicas.txtに保存してください(あとで元に戻したあとも、証拠として残します)。 kubectl diff -f /root/cgoa-drift/desired/orders.yamlの出力を/root/cgoa-drift/drift.txtに保存してください。ファイルにはreplicasの差が見えている必要があります。- 元のマニフェストをもう一度適用して、replicasを
2に戻してください。 /root/cgoa-drift/wave/に3つのファイルを作成してください。namespace.yamlはNamespacecgoa-waveで、アノテーションはargocd.argoproj.io/sync-wave: "-2"です。config.yamlはConfigMaporders-wave-config(ネームスペースcgoa-wave、dataに任意のキーを1つ)で、アノテーションはargocd.argoproj.io/sync-wave: "-1"です。app.yamlはDeploymentorders-wave(ネームスペースcgoa-wave)で、アノテーションはargocd.argoproj.io/sync-wave: "1"です。/root/cgoa-drift/hooks/db-migrate.yamlにJobdb-migrateを作成してください(ネームスペースcgoa-drift、アノテーションargocd.argoproj.io/hook: PreSync、argocd.argoproj.io/hook-delete-policy: BeforeHookCreation、argocd.argoproj.io/sync-wave: "-1"、spec.backoffLimit: 1、PodのrestartPolicy: Never、コンテナ名migrate)。- pruneの対象を判別してください。まず
/root/cgoa-drift/desired/config.yamlにConfigMaporders-config(ネームスペースcgoa-drift、dataに任意のキーを1つ)を宣言して適用してください。次に、legacy-configというConfigMapをcgoa-driftネームスペースに、ファイルを使わずに命令型で作成してください。最後に/root/cgoa-drift/prune-candidates.txtに、cgoa-driftネームスペースのConfigMapのうち、desired/ディレクトリのどこにも宣言されていないものの名前を、1行に1つずつ書いてください。(Kubernetesが自動的に作るkube-root-ca.crtは管理対象ではないので、除外します。)
参考
kubectl diff -f <파일> > out.txtは、差があると終了コードが1です(プレースホルダーはファイル名です)。|| trueを付けてください。- ウェーブの番号は、必ず引用符で囲んだ文字列です。
sync-wave: -2のように書くと、YAMLが数値として読み、アノテーションの値の型が食い違います。 - フックのアノテーションのキー2つは、
argocd.argoproj.io/hookとargocd.argoproj.io/hook-delete-policyで、互いに異なります。 - よくある間違い: ステップ3で
kubectl get -o yamlの結果を保存することです。それはlive状態にすぎず、差ではありません。必ずdiffを保存してください。
望ましい状態の宣言と適用
/root/cgoa-drift/desired/orders.yamlにDeployment ordersを作成してください(ネームスペースcgoa-drift、spec.replicas: 2、セレクターとPodラベルはapp: orders、コンテナ名app、イメージnginx:1.27-alpine)。ネームスペースcgoa-driftを作成し、このファイルをkubectl apply -fで適用してください。
宣言型で適用すると、オブジェクトに最後に適用した設定がアノテーションとして残ります。命令型で作るとそのアノテーションがありません。採点はその違いを見ます。
手で書き換えてドリフトを作る
ファイルはそのままにして、クラスターのordersのreplicasだけを5に変え、ドリフトを作ってください。そして変わったliveの値をkubectl get ... -o jsonpathで読み取り、/root/cgoa-drift/live-replicas.txtに保存してください(あとで元に戻したあとも、証拠として残します)。
ファイルはそのままにして、クラスターだけを変える必要があります。スケールを変える命令型のサブコマンドがあります。変わったliveの値はjsonpathで取り出してファイルに残しておいてください。元に戻したあとも証拠になります。
差を計算してファイルに残す
kubectl diff -f /root/cgoa-drift/desired/orders.yamlの出力を/root/cgoa-drift/drift.txtに保存してください。ファイルにはreplicasの差が見えている必要があります。
kubectl diff -f <파일>は、サーバーにドライランを投げて実際の差を見せてくれます(プレースホルダーはファイル名です)。差があると終了コードが1なので、リダイレクトするときに中断されないようにしてください。
宣言した状態へ戻す
元のマニフェストをもう一度適用して、replicasを2に戻してください。
エージェントのselfHealが行うことを、手で行います。元のファイルをそのままもう一度適用すれば済みます。
sync waveアノテーション3つ
/root/cgoa-drift/wave/に3つのファイルを作成してください。namespace.yamlはNamespace cgoa-waveで、アノテーションはargocd.argoproj.io/sync-wave: "-2"です。config.yamlはConfigMap orders-wave-config(ネームスペースcgoa-wave、dataに任意のキーを1つ)で、アノテーションはargocd.argoproj.io/sync-wave: "-1"です。app.yamlはDeployment orders-wave(ネームスペースcgoa-wave)で、アノテーションはargocd.argoproj.io/sync-wave: "1"です。
ウェーブの番号は文字列で書きます。インフラが先、設定がその次、ワークロードが最後になるように番号を決めてください。
PreSyncフックのJob
/root/cgoa-drift/hooks/db-migrate.yamlにJob db-migrateを作成してください(ネームスペースcgoa-drift、アノテーションargocd.argoproj.io/hook: PreSync、argocd.argoproj.io/hook-delete-policy: BeforeHookCreation、argocd.argoproj.io/sync-wave: "-1"、spec.backoffLimit: 1、PodのrestartPolicy: Never、コンテナ名migrate)。
フックの種類と削除ポリシーは、別のアノテーションキーです。削除ポリシーは、デフォルト値を明示的に書いておくほうがレビューにとってよいです。
pruneの対象の判別
pruneの対象を判別してください。まず/root/cgoa-drift/desired/config.yamlにConfigMap orders-config(ネームスペースcgoa-drift、dataに任意のキーを1つ)を宣言して適用してください。次に、legacy-configというConfigMapをcgoa-driftネームスペースに、ファイルを使わずに命令型で作成してください。最後に/root/cgoa-drift/prune-candidates.txtに、cgoa-driftネームスペースのConfigMapのうち、desired/ディレクトリのどこにも宣言されていないものの名前を、1行に1つずつ書いてください。(Kubernetesが自動的に作るkube-root-ca.crtは管理対象ではないので、除外します。)
pruneの対象は、「クラスターにあるのに、宣言用ディレクトリにはない」リソースです。クラスターが自動的に作るオブジェクトは対象ではない、という点を覚えておいてください。