2026-07 / 06
Harumi Platform — 3 つの管理ツールを 1 つに統合
成果3 つに分かれていた運用画面を 1 つの管理コンソールへ統合しました。退役させたツールが抱えていたデータは失わずに移行しています。
概要
クラスターのヘルス・リソース・ドキュメント・接続情報を一元化した単一コンソール。それぞれ運用情報の異なる断片を抱えていた 3 つの管理ツールを置き換えた。
背景
コンソールにはライブな ArgoCD データが必要でしたが、唯一分かっていた管理者資格情報は認証が通らず、権限を絞った読み取り専用アカウントは用意済みでもトークンを発行する手段がまだありませんでした。
システム
Role: get,list on pods · namespace-scoped, no secrets退役は、削除ではない。
Retire the surface, not the data.
3 ops surfaces → 1 console, zero downtime.課題
ドキュメントサイト・旧 Camunda ダッシュボード・infra リポジトリの各種メモという 3 つのツールが、それぞれ「ラボの現状」の異なる断片を保持しており、どこか一箇所を見れば済むという状態ではなかった。最も古いツールを退役させる(4 つ目のツールを追加するのではなく)には、その中に何が同居しているかを先に確認する必要があった——実際にはその前提が崩れていた。
調査
最初の仮説
サーバー自身の HMAC シークレットを使い、既存の読み取り専用アカウント向けにオフラインでトークンを自前署名すれば、管理者パスワードを完全に回避できると考えました。
まずライブなクラスター状態に対する読み取り専用のコンソールを構築し、退役対象ツールの実際のコンテンツ——URL 一覧、サービスごとの接続情報、ディスク健康ボード——を先に移植した。最も古いツールの namespace に何が同居しているかを監査したところ、その内容とは無関係な共有インフラが 2 つ見つかった——ラボ内すべての公開ホスト名を支える Cloudflare トンネルと、ディスク健康監視 DaemonSet。どちらも新しい Pod へ移設し、健全性を確認してから(トンネルの新旧 Pod は仕様上一時的に同じトークンを共有した)、旧 namespace を削除した。
証拠
sub: "harumi-platform:apiKey" # not "harumi-platform"
# registry lookup keyed by jti, not iat2 種類の claim を試しましたがどちらも "token is revoked" と拒否されました——サーバーは発行時刻ではなく jti を登録簿と照合しており、ローカルアカウントの subject には裸のアカウント名にはない ":apiKey" サフィックスが必要でした。
退けた修正
サーバー自身の HMAC シークレットでトークンをオフライン自前署名する方法。2 種類の claim を試しましたが、どちらも "token is revoked" として拒否されました——サーバーは発行時刻ではなく jti を登録簿と照合し、ローカルアカウントの subject には ":apiKey" サフィックスが必要です。claim の形を推測し続けることは、正規のエンドポイントが既に存在するインターフェースをリバースエンジニアリングすることに他なりませんでした。
判断
既存手順の bcrypt パッチで管理者パスワードをリセットし、claim の形を推測し続けるのではなく ArgoCD 自身のアカウントトークン発行エンドポイントでトークンを生成しました。
結果
ディスク健康監視エージェントの Go ソースは、リポジトリが消えた時点でどこにも残っていなかった——復旧できたはずの日次バックアップは、当時オフラインだったマシン上にあった。孤児化したイメージに永久に固定された DaemonSet を残すのではなく、ゼロから書き直した。3 台それぞれで一時的な特権デバッグ Pod を使い、まず実機の smartctl の JSON 出力を採取してからパーサーを実装——サイレントにゴミデータを生むところだった一点(明示的な ATA パススルーフラグでのみ SMART 属性が取得できる USB 接続ドライブ)も含めて確認済み。
次に変えること
現在の制約: 発行したトークンに有効期限はありません——手動で更新するサービス資格情報としては許容範囲ですが、より広いシステムに転用すべきパターンではありません。
次の一手: 計画中の読み取り専用 AI 診断レイヤーにも、同じ最小権限・secrets 非許可のパターンを適用します。
関連する記録
自前署名のトークンは正しく拒否された →技術構成
Next.js · Kubernetes RBAC · ArgoCD API · Prometheus · Go · Redis