TT Lab
はじめる
学ぶ 学習パス コース

CGOA — GitOps認定アソシエイト

ドリフトを作り、見て、戻す

TT Labで続きを見る

目標

ドリフトを自分で作り、その差を計算してファイルに残し、宣言した状態に戻すという一巡を、手で回します。続いてsync waveとPreSyncフックのマニフェストを作成し、クラスターを調べてpruneの対象を判別します。

なぜ重要なのか

Argo CDの調整ループは魔法ではなく、このラボで行うことをデフォルトで180秒ごとに繰り返しているだけです。再レンダリングし、liveを読み、比較し、ポリシーが許せば適用します。このループを手で一度回してみると、refreshとsyncがなぜ別の動作なのか、selfHealを有効にするということが運用にどんな規律を求めるのかが、体で理解できます。pruneの判別も同じです。エージェントはクラスターのすべてのリソースを消すのではなく、自分が作ったと印を付けておいたもののうち、Gitから消えたものだけを消します。この境界を知らないと、「なぜあれは消えないのか」と「なぜあれが消えたのか」の両方を説明できません。このラボ環境にはArgo CDのCRDがないので、ウェーブとフックはファイルとして作成し、採点もファイルを読んで行います。

ステップ

  1. /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で適用してください。
  2. ファイルはそのままにして、クラスターのordersのreplicasだけを5に変え、ドリフトを作ってください。そして変わったliveの値をkubectl get ... -o jsonpathで読み取り、/root/cgoa-drift/live-replicas.txtに保存してください(あとで元に戻したあとも、証拠として残します)。
  3. kubectl diff -f /root/cgoa-drift/desired/orders.yamlの出力を/root/cgoa-drift/drift.txtに保存してください。ファイルにはreplicasの差が見えている必要があります。
  4. 元のマニフェストをもう一度適用して、replicasを2に戻してください。
  5. /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"です。
  6. /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)。
  7. 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は管理対象ではないので、除外します。)

参考

望ましい状態の宣言と適用

/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の対象は、「クラスターにあるのに、宣言用ディレクトリにはない」リソースです。クラスターが自動的に作るオブジェクトは対象ではない、という点を覚えておいてください。