自宅のネットワーク環境、以前も一度書きましたが、ちょっとずつ中身がアップデートされてきてて、そろそろ一度整理して書き残しておきたいと思います。 こういうのって、一度組んだら「動いているからヨシ」で放置しがちじゃないですか。で、何かの拍子に死んだ時に「あれ、ここどうなってたっけ……」って青ざめる。 そうならないための備忘録も兼ねて、現状のアーキテクチャを晒しておきます。
セキュリティ的には…多分大丈夫でしょう。
前提と制約
まず、我が家のネットワークにおける「譲れない制約」と「妥協した点」について。
- 賃貸・固定IPなし: 基本ですね。ISPから降ってくるIPは変わるし、そもそも公開サーバーにする気はない。VPN(Netbird使ってます)越しにしかアクセスさせません。
- ルーターはYAMAHA RTX830: 信頼と実績。ただ、IPv6のRA(Router Advertisement)が1つのプレフィックスしか降ってこない仕様(というかISP側の仕様?)上、下手にVLANでサブネットを切りまくるとIPv6の配布が地獄になります。
- トラブルシューティングの簡素化: かっこつけてVLAN切りまくってルーティング複雑にすると、深夜にネットが繋がらなくなった時に絶望します。「ファクトリーリセットして一からやり直し」だけは避けたい。なので、L3(ルーティング)レベルではフラットに。L2やコンテナレベルで分離する方針です。
ネットワーク構成図 (Physical / Network Layer)
物理・ネットワーク層の構成はこんな感じ。
192.168.100.0/24 のフラットなネットワークですが、接続形態(有線/無線)や役割でゆるくゾーニングしています。
シンプルですね。 YAMAHA RTX830の下にL2スイッチ(SWX2210-8G)がぶら下がっていて、そこから有線でサーバー群、AP経由でクライアント群が繋がっています。
ここでのこだわり: 一見ただのフラットなネットワークですが、実はスイッチ(SWX2210)側で マルチプルVLAN を設定しています。 要は「ルーターとは話せるけど、隣のポートとは話せない」状態にしています。
サーバー・仮想化基盤 (Compute / Logical Layer)
ここからが本題。運用効率のためにあえてマトリョーシカ構成(入れ子)にしているコンピュート層と、外部連携のフローです。
OSはUbuntu 24.04。この上で Incus を使ってシステムコンテナ(LXC)を払い出し、その中に MicroK8s でKubernetesクラスタを構築しています。
「なぜVMやベアメタルではなくシステムコンテナなのか?」というと、圧倒的な軽さと運用の楽さにつきます。 Incusなら、ホストOSを汚さずに環境を切り出せますし、何かあったらスナップショットから瞬時に復元できます。 Gitea Runnerのように「K8sの外に置きたいけどホスト汚したくない」やつらを隔離するのにも便利なんですよね。
こだわりポイント解説
この構成の「肝」となる部分をいくつか補足します。
1. 内向きDNSの解決策 (PowerDNS + ExternalDNS)
自宅ラボあるある「内向きDNSどうする問題」。 /etc/hosts を書くのは負けだと思っているので、PowerDNS をK8s内に立てています(MetalLBで .254 で公開)。
仕組みはこう。
- ExternalDNS が Ingress リソースを監視。
*.home.localみたいなホスト名を検知すると、PowerDNSにレコードを自動登録。 - YAMAHA RTX830 のDNS設定で、
*.home.localの問い合わせだけ.254(PowerDNS) に転送するように設定。 - これで宅内のどの端末からも、特別な設定なしでドメイン名でアクセス可能に。
2. SSL証明書の自動化 (Cert-Manager + Cloudflare)
「オレオレ証明書」はブラウザの警告がウザいので、Lets Encrypt で正規の証明書を取っています。 ただ、宅内からしかアクセスできないサーバーなので、HTTP-01認証(80番ポート公開)は使えません。 そこで、Cloudflare で管理しているドメインのサブドメインを自宅用に切り出し、DNS-01認証 を使っています。Cert-ManagerがCloudflareのAPIを叩いてTXTレコードを書き換えることで、外部公開なしで証明書を自動発行・更新しています。
3. 外部アクセス (Netbird)
外からアクセスしたい時は Netbird というVPNを使っています。
Kubernetes上で netbird-operator を動かしており、こいつがゲートウェイになります。
ここでもDNSがキモで、Netbirdの「Magic DNS」設定を利用し、自宅ドメインの解決には自宅のPowerDNS (.254) を使うようにルート広告させています。
これにより、外出先からVPNを繋ぐだけで、自宅にいるのと全く同じURL (https://grafana.home.local etc.) でサービスに繋がります。体験として最高です。
4. 秘密情報の管理 (ExternalSecrets + Infisical)
パスワードやAPIキーなどのSecret類は、Gitリポジトリにはコミットしたくない。 そこでNAS上で Infisical をセルフホストし、K8s上の ExternalSecrets Operator がそこから値を引っ張ってきて K8s Secret を生成する構成にしています。 ただ、現状NAS側のSSL証明書管理が手動(辛い)だったり、DBがNAS上のDockerだったりと、ここだけちょっとレガシーな運用が残ってしまっているのが悩みどころ。Infisical自体をK8sに乗せ替えたい野望はありますが、鶏卵問題(Infisicalを起動するためのSecretはどこに置くの?)になりそうで躊躇してます。
k8sの運用
ArgoCD でGitOpsしています。 アプリ間の依存関係(DBが立ち上がってからアプリを起動したい、など)が複雑になってきたので、今後は ArgoCD Sync Waves などを活用して、デプロイ順序も美しく管理していきたい所存。
Giteaはソースコード管理だけでなく、Docker Registryとしても酷使しています。ローカル用にカスタマイズしたイメージなどはここにPushされ、K8sからPullされます。自宅開発のエコシステムがここで完結しているのが気持ちいい。
「趣味にしてはやりすぎ」に見えるかもしれませんが、各種自動化の仕組みが噛み合って動いてくれるおかげで、一度組んでしまえば日々の運用は驚くほど楽になります。









