6.5 KiB
6.5 KiB
ベアメタル向けサービスメッシュ移行計画
本ドキュメントでは、既存の PhotonCloud サービス群を、 Deployer/NodeAgent+mTLS 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 を実装。
- PoC 用に
- 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 を常駐させる。
- NixOS モジュールで
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。
- Desired にあるのに起動していなければ
- 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}など。
- config ファイル生成 →
- 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 を止めると従来構成に戻る」状態を維持したまま進める。