HARUMI
← 戻る

2026 / 02

このラボ全体を支えるクラスターの運用

Home lab infrastructure個人運用

成果登録アプリケーション全体で単一の配信経路と内部名前解決を使用。各アプリケーションは自分のリポジトリから検出され、退役も同じ経路で行われます。公開アイデンティティ方針を明示し、既存メトリクスは読まれずに眠るのではなくアラートを上げます。

概要

ベアメタルの Kubernetes 基盤とロンドンの Oracle Cloud クラスターでラボを運用しています。日付付きのインフラ観測は Architecture ページで公開しています。アプリケーションは手作業ではなくリポジトリから検出され、テスト、ビルド、スキャン、配信タグを更新する別コミットという同じ経路を通ります。

背景

同じクラスターで外部リクエストと再現可能なアプリケーション配信の両方を扱います。

システム

Tokyo and London: requests, messaging and lab deliveryInternetCloudflare TunnelCloudflare Access for ops hostskgatewaySHARED GATEWAY → TOKYO APPSGateway serviceLONDON CAMUNDA PUBLIC ENTRYTOKYO · KubernetesHOME LAB · BARE METALControl + computeComputeComputeMakeUpKashiwaLexTraceYOHAKUSitePlatformFluent Bit · pod logs on every Tokyo nodeKEYCLOAK · SHARED SIGN-INLOCAL MODEL · llama.cpp ON A HOME MACKafka · Tokyo buffer2 BROKERS · KRaftk8s-logsLONDON · KubernetesORACLE CLOUD · ARM64 · 12 GB / NODENode A · 12 GB ARM64Node B · 12 GB ARM64Camunda 8.10 · lab orchestrationZEEBE BROKERS · TASKLIST · OPERATELog consumerOpenSearch · seven-day retentionWireGuard · wg-londonTOKYO CONTROL PLANE ↔ LONDONROUND TRIP ≈ 240 msDELIVERY EVENTS ↔KAFKA TOPICSLONDON PULLS LOGS →Git pushGitLab CIImage buildTag-bump commitArgoCDTokyo: automatic sync · London: manual sync via approved changes → KubernetesCAMUNDA · LAB WORKFLOWS ONLYCI succeeds → lab delivery checksinfra change: approved in Tasklistapplied after approval · not a product gateOUTSIDE OBSERVER · ORACLE FREE · 1 GBprobes the public hosts every minutealerts over a path independent of both clustersInfisical · secrets projected into namespacesCloudNativePG PostgreSQL · Prometheus / Alertmanager
REQUEST PATHREQUEST PATHInternetCloudflare TunnelCloudflare Access for ops hostsTOKYO · KubernetesHOME LAB · BARE METALkgateway (shared) → appsMakeUp · Kashiwa · LexTraceYOHAKU · Site · PlatformKEYCLOAK · LOCAL MODEL (MAC)Control + computeCompute · ComputeLONDON · KubernetesORACLE CLOUD · ARM64 · 12 GB / NODENode A · 12 GB ARM64Node B · 12 GB ARM64Gateway service → CamundaLONDON PUBLIC ENTRYOUTSIDE OBSERVER · ORACLE FREE · 1 GBprobes the public hosts every minuteCROSS-CLUSTER MESSAGINGCROSS-CLUSTER MESSAGINGTOKYO · KafkaTOKYO BUFFER · 2 BROKERS · KRaftFluent Bit · pod logs on every Tokyo nodek8s-logsWireGuard · wg-london · ≈ 240 msTOKYO CONTROL PLANE ↔ LONDON · RTTDelivery events ↔ Kafka topicsLondon consumer pulls logs ↓LONDONCamunda 8.10 · lab orchestrationZEEBE BROKERS · TASKLIST · OPERATELog consumerOpenSearchLOGS RETAINED FOR SEVEN DAYSGITOPS DEPLOY PATHGITOPS DEPLOY PATHGit pushGitLab CIImage buildTag-bump commitArgoCDSEPARATE COMMIT AFTER BUILD→ Tokyo cluster: automatic sync→ London cluster: manual syncTHROUGH APPROVED CHANGESCamunda 8.10 · lab orchestrationCI succeeds → lab delivery checksinfra change: approved in Tasklistapplied after approval · not a product gateInfisical · secrets projected into namespacesCloudNativePG PostgreSQLPrometheus / Alertmanager

Synced is not always deployed.

課題

kubectl debug Pod の内部からノードをデバッグすることは、ノード自体をデバッグすることと同じではありません。chroot /host はデバッグ Pod 自身のマウント/PID 名前空間のスナップショットであり、ホストのライブ状態ではありません——/proc は空を返し、内部で実行した mount/umount は実際のホストのマウントテーブルに反映されません。これを信じてしまうかどうかが、NAS 再構築中のクリーンな修正と実際の障害発生の分かれ目でした。

調査

最初の仮説

デバッグコンテナはライブなホストを示し、ArgoCD の Synced は対象ビルドのデプロイ完了を示すと考えました。

ホストの本当に最新の状態に依存する操作(マウント後の書き込み、既にマウント済みかの確認など)は、デバッグ Pod のスナップショット内で直接実行するのではなく、ホスト自身のサービスマネージャへ委譲する必要があります。この「便利な代理ではなく本物の状態を確かめる」という習慣はクラスター全体で現れます。二段階 GitOps パイプライン(push がビルドをトリガーし、別の後続コミットがデプロイ済みイメージタグを更新)では、自分のコミットに対する ArgoCD の Synced+Healthy 状態を確認しても、そのコミットがイメージ参照に触れていなければ何も証明しません——実際のタグ更新コミットを待つ必要があります。同じ習慣が効いた例がその後 2 つ出ました——認証チェックへリダイレクトする *前* にセッション cookie を発行していたパスワード関門(リダイレクトに従わなければ全部開く。あれは提案であって関門ではなかった)、そして実際には収集されていないメトリクス名に対して書かれたアラート規則。どちらも推論ではなく計測で見つかりました。

証拠

# delegated to the host service manager, not run inside the debug container

デバッグ Pod は別の namespace のスナップショットで、ビルドコミットの後には別のタグ更新コミットが存在しました。

判断

ホスト状態に依存する処理はデバッグコンテナではなくホスト自身のサービスマネージャへ委譲し、タグ更新コミットをデプロイの基準にしました。

結果

ラボ全体のワイルドカード DNS(dnsmasq)と Cloudflare Zero Trust のプライベートルーティングにより、LAN 内でもリモートでも内部の *.local ホスト名にアプリごとの再設定なしで同じ方法でアクセス可能——生のクラスター IP を公開する代替案として意図的に採用したものです。

次に変えること

現在の制約: ベアメタル 3 台でもなお小さな障害領域です。Camunda は Zeebe ブローカー 2 台・レプリカ 2 で動くため、そのどちらかのノードを再起動するとエンジンが止まる——2026 年 10 月のカーネル更新に伴う再起動でも確認しました。保守には引き続き順序設計が必要です。

次の一手: 復旧手順の演習と、基盤レベルのサービス目標を整備します。

プロジェクトの歩み

  1. 2026.10.03

    全ノードが Ubuntu 26.04 LTS へ

    新しい計算ノードで先行検証し、ワーカーとコントロールプレーンは 24.04 を経て 26.04.1 へ。3 ノードとも kernel 7.0・Kubernetes 1.37・Calico 3.32 で稼働し、コントロールプレーンの有線 NIC はツリー外ドライバーからカーネル内蔵ドライバーへ移行。

  2. 2026

    クラスター始動

    ベアメタル 3 ノード、自前ホスト GitLab、ArgoCD——以後のすべてを載せる GitOps の土台。

次のプロジェクト

NOEMA — 内省ライフシステム →