試験が使う言葉 — そしてCIとCDの境界はどこへ移ったのか
一言でいうと
CGOAには実技がない代わりに、用語を正確に使えるかが問われます。desired state、actual(live) state、drift、reconciliation、convergenceは、互いに言い換えられる言葉ではなく、1つのループをなす5つの異なる位置です。
なぜ必要なのか
現場では「syncを回しました」「合っていません」といった言葉でも会話が成り立ちます。ところが試験問題は「次のうち、driftを最もよく説明しているものはどれですか。」のように問い、4つの選択肢のうち3つがもっともらしく見えます。Deviation、Delta、Divergenceのような言葉が誤答として並びます。定義をあいまいに覚えていると、必ず間違えます。
どう動くのか
1周を順にたどると、次のようになります。
- Desired state(望ましい状態): Gitに宣言された、システムが到達すべき目標です。レンダリング結果まで含みます。Helmチャートやkustomizeのオーバーレイは「望ましい状態を生成する材料」であり、望ましい状態そのものは、それをレンダリングした最終的なマニフェストです。
- Actual state / Live state(実際の状態): クラスターのAPIサーバーが今持っているオブジェクトです。
- Drift(ドリフト): この2つの差です。誰かが
kubectl editを実行した、コントローラーがフィールドを書き換えた、直前のsyncが途中で失敗した、といったときに生じます。 - Reconciliation(調整): 差を見つけて、実際の状態を望ましい状態の側へ寄せていく行為です。
- Convergence(収束): その結果、両者が同じになった状態です。一度で収束しないこともあり、複数のループを回して最終的に同じになることをeventual consistencyと呼びます。
ここにさらに2つの言葉が加わります。State storeは望ましい状態を保持するバージョン管理システム(通常はGit)で、Software agentは調整を行うクラスター内のプロセス(Argo CD、Flux)です。OpenGitOpsの文書がこの2つの言葉をツール名の代わりに使うのは、GitOpsが特定の製品に縛られた概念ではないことをはっきりさせるためです。
CIとCDの境界はどこへ行ったのか
従来のCI/CDでは、境界は「テストが終わる地点」でした。GitOpsでは、境界がリポジトリの間へ移ります。
[앱 저장소] 코드 커밋 → 빌드 → 테스트 → 이미지 푸시 → (설정 저장소에 태그 커밋)
|
| ← 여기가 CI 의 끝
|
[설정 저장소] PR 리뷰 → 머지 → (에이전트가 당겨감) → 클러스터
↑ 여기부터가 CD
CIの成果物はもう「デプロイ」ではなくコミットです。CDは人がトリガーする作業ではなく、常に回っているループです。そのためGitOpsでは「デプロイの失敗」と「同期の失敗」は別の出来事であり、ロールバックもパイプラインの再実行ではなくgit revertで行います。revertは履歴を消さずに新しいコミットを積み上げるので、不変性の原則とも合っています。
よく出るひっかけを1つ挙げます。Webhookは必須ではありません。Webhookがなくても、エージェントはポーリング周期ごとにGitを確認するので、最終的には収束します。Webhookはその遅延を減らす最適化にすぎず、Webhookがなければ、GitOpsではないという説明は誤りです。
現場での姿
筆者のホームラボで実際に経験した場面を1つ紹介します。KubeVirtを入れたとき、すべてのコンポーネントの状態がAllComponentsReadyだったのに、VMは起動しませんでした。virt-launcherのPod仕様を調べると、initコンテナが使うバイナリのボリュームマウントが抜けていました。同じクラスターでこの種の出来事に遭うのは3回目だったと記録されています。
これが用語とどう関係するのかというと、Sync状態とHealth状態は別の軸だからです。Argo CDもSynced(望ましい状態と実際のオブジェクトが同じ)とHealthy(そのオブジェクトが実際に役目を果たしている)を別々に表示します。SyncedなのにDegradedというアプリはよくあります。Gitが指示したとおりに正確に作ったものの、その仕様自体が間違っている場合だからです。試験で「OutOfSyncでありながらHealthyであることはあり得るか」と問われたら、答えは「はい」です。2つの軸は独立しています。
次のクイズで確認すること
次のモジュールでリポジトリ構造を整えます。desired stateを「どのディレクトリにどんな形で置くか」がそのままリポジトリ戦略であり、環境間のプロモーションは、その構造の上でイメージタグ1行を移すPRとして整理されます。