photoncloud-monorepo/docs/architecture/baremetal-mesh-migration.md

113 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## ベアメタル向けサービスメッシュ移行計画
本ドキュメントでは、既存の PhotonCloud サービス群を、
Deployer/NodeAgentmTLS Agent ベースのサービスメッシュ風アーキテクチャに
段階的に移行するためのマイルストーンを定義する。
### 1. 現状整理フェーズ(完了済み前提)
- `baremetal/first-boot`:
- 役割: 初回ブート時のクラスタ join・基本サービス起動。
- 常駐ではなく oneshot 系 systemd unit 群。
- `deployer/`:
- 役割: Phone Home によるノード登録と最低限の Node/Config 管理。
- まだ常駐型 NodeAgent や ServiceInstance Reconcile は未実装。
- mTLS:
- 各サービスごとに ad-hoc な TLS/mTLS 設定が存在。
- dev ではしばしば平文/`-k` での接続。
### 2. フェーズ 1: Chainfire モデルと Deployer 拡張
**目的**: Chainfire をクラスタ状態のソース・オブ・トゥルースにする土台を作る。
- **M1-1**: `specifications/deployer/README.md` に定義した
`Cluster / Node / Service / ServiceInstance / MTLSPolicy` モデルを Chainfire 上に作成。
- PoC 用に `photoncloud-ctl` 的な小さな CLI で CRUD を実装。
- **M1-2**: `deployer-server``NodeInfo` を Chainfire にも書き出すように拡張。
- 既存のローカルストレージ(ファイル or メモリ)は残しつつ、
Chainfire を **optional backend** として追加。
- **M1-3**: 管理 API に「サービス配置」を表すエンドポイントを追加。
- 例: `/api/v1/admin/services/{service}/instances` で、
Node とインスタンス数を指定できるようにし、内部で ServiceInstance を生成。
### 3. フェーズ 2: NodeAgent常駐型 Reconcilerの導入
**目的**: 各ノードで Desired State → Observed State の Reconcile を開始する。
- **M2-1**: `plasmacloud-reconciler` を NodeAgent として再定義/拡張。
- `--node-id``--chainfire-endpoint` を引数に取り、無限ループで動作。
- **M2-2**: NodeAgent が自ノードの `Node``ServiceInstance` を watch し、
ログ出力のみ行う「read-only モード」を実装。
- まだ systemd 操作やプロセス起動はしない。
- **M2-3**: systemd 統合(ベアメタルノード側)。
- NixOS モジュールで `services.node-agent.enable = true;` を追加。
- 既存 first-boot の後に NodeAgent を常駐させる。
### 4. フェーズ 3: サービスプロセス管理の Reconcile
**目的**: NodeAgent が実際にサービスプロセスを起動/停止できるようにする。
- **M3-1**: 各サービスの NixOS モジュールを見直し、
`enable = false` をデフォルトにした上で、
NodeAgent から `systemctl start/stop` で制御しやすい形に整理。
- **M3-2**: NodeAgent 内に「ServiceInstance → systemd unit 名」のマッピングを追加。
- 例: `service="chainfire" → unit="chainfire.service"`
- 単純な 1:1 マッピングからスタート。
- **M3-3**: Reconcile ループにプロセス制御を追加。
- Desired にあるのに起動していなければ `systemctl start`
- Desired にないのに起動していれば `systemctl stop`
- **M3-4**: 起動結果/ヘルスを Chainfire にフィードバック。
- `instances/{service}/{instance_id}.state``ready` / `unhealthy` に更新。
### 5. フェーズ 4: mTLS Agent の導入(プレーンプロキシ)
**目的**: サービスメッシュの「形」を先に作り、まだ TLS を強制しない。
- **M4-1**: 新クレート `mtls-agent`(名称要検討)を作成。
- 最初は平文 TCP/HTTP プロキシとして実装。
- ローカル app_port ←→ mesh_port の中継のみを行う。
- **M4-2**: NodeAgent が ServiceInstance 起動時に、
mTLS Agent を隣に起動するフローを追加。
- config ファイル生成 → `systemctl start mtls-agent@{service}` など。
- **M4-3**: Chainfire 上の ServiceInstance に `mesh_port` を登録。
- 他サービスからの接続先として mesh_port を使う用意をする。
- **M4-4**: 一部サービス間通信(例: `apigateway → creditservice`)を
mTLS Agent 経由に切り替える PoC。
- アプリ側は `client-common` 抽象を通じて `http://127.0.0.1:<mesh_control_port>` を叩く。
### 6. フェーズ 5: mTLS 対応とポリシー制御
**目的**: mTLS/TLS/平文を Chainfire のポリシーで切り替えられるようにする。
- **M5-1**: mTLS Agent に TLS/mTLS 機能を実装。
- dev では平文、stg/prod では mTLS をデフォルトに。
- 証明書/鍵は既存の T031 TLS 自動化の成果物を利用。
- **M5-2**: Chainfire の `MTLSPolicy` を反映するロジックを Agent に実装。
- `(source_service, target_service)` と Cluster の `environment` からモード決定。
- **M5-3**: Deployer から `MTLSPolicy` を編集できる管理 API を追加。
- 例: `/api/v1/admin/mtls/policies`
- **M5-4**: ステージング環境で「全経路 mTLS on」を試験。
- 問題があればポリシーを `permissive``plain` に戻せることを確認。
### 7. フェーズ 6: 既存 ad-hoc mTLS 実装の段階的削除
**目的**: サービスコードから mTLS 実装を徐々に削除し、Agent に集約する。
- **M6-1**: 既存の各サービスから「直接 TLS ソケットを開いているコード」を列挙。
- `grep` ベースで `rustls`, `native-tls`, `tls` 関連を洗い出し。
- **M6-2**: 重要なサービスから順に、通信経路を `client-common` 抽象経由に置き換え。
- まずは dev 環境でのみ mTLS Agent 経由にする feature flag を導入。
- **M6-3**: 本番で mTLS Agent 経由通信が安定したら、
対象サービスから ad-hoc な TLS 設定を削除。
- **M6-4**: 最終的に、サービス側は「平文 HTTP/gRPC over localhost」という前提のみを持ち、
セキュリティ/暗号化はすべて mTLS Agent に移譲。
### 8. 段階ごとのロールバック戦略
- 各フェーズは **Chainfire のキー空間と Deployer 設定で制御** できるようにする。
- 例: NodeAgent を停止すれば、従来通り first-boot ベースの静的構成に戻せる。
- 例: `MTLSPolicy` を削除すれば、Agent は平文モードに戻る(または完全停止)。
- NodeAgent/mTLS Agent を導入するときは、必ず
「全てのノードで Agent を止めると従来構成に戻る」状態を維持したまま進める。