Slide 1

Slide 1 text

NixOS + Kubernetesで構築する 自宅サーバーのすべて ichi-h.com

Slide 2

Slide 2 text

ichi-h Development | Domain modeling | System Design. Love: PureScript 2

Slide 3

Slide 3 text

技術記事 より詳しい解説をZennにて公開中 https://zenn.dev/ichi_h/articles/ff001e0005e33c 3

Slide 4

Slide 4 text

TOC 自宅サーバーで実現したいこと Nix/NixOSとは何か なぜNixOSなのか 基盤構築 NixOS Kubernetes 構築してみての所感 おすすめできるか 4

Slide 5

Slide 5 text

自宅サーバーで 実現したいこと

Slide 6

Slide 6 text

旧自宅サーバーの構成

Slide 7

Slide 7 text

新たに実現したいこと Dropboxのようなストレージサービスの提供 パスワードマネージャーの提供 各アプリケーションに対して、自分だけが名前解決できる独自ドメイ ンを使ってセキュアに通信できる仕組みの構築 稼働するサーバーのログやメトリクスの収集・監視 7

Slide 8

Slide 8 text

Raspberry Pi 4 Model B(Yomogi/蓬) CPU: ARM Cortex-A72 RAM: 4 GB Storage: 64 GB(SDカード) Node: Control Plane Mini PC(Tokiwa/常盤 & Hanaakari/花明かり) CPU: Intel N97 RAM: 16 GB Storage 1: 512 GB(M.2 SSD) Storage 2 (Hanaakari): 1 TB(外付けSSD) Node: Worker Server Spec 8

Slide 9

Slide 9 text

Nix/NixOSとは何か

Slide 10

Slide 10 text

Nix 純粋関数型言語である Nix 言語を用いて、開発環境やビルド環境に必要 なパッケージを宣言的に管理できるパッケージマネージャー 10

Slide 11

Slide 11 text

Package Manager 11 特定のプログラミング言語におけるパッケージ管理 pip (Python) npm/yarn/pnpm (Node.js) cargo (Rust) etc. ユーザー権限下におけるパッケージ管理 Homebrew Root権限下におけるパッケージ管理 apt (Debian系) dnf (RHEL系) etc.

Slide 12

Slide 12 text

Package Manager 12 特定のプログラミング言語におけるパッケージ管理 pip (Python) npm/yarn/pnpm (Node.js) cargo (Rust) etc. ユーザー権限下におけるパッケージ管理 Homebrew Root権限下におけるパッケージ管理 apt (Debian系) dnf (RHEL系) etc.

Slide 13

Slide 13 text

Package Manager 13 特定のプログラミング言語におけるパッケージ管理 pip (Python) npm/yarn/pnpm (Node.js) cargo (Rust) etc. ユーザー権限下におけるパッケージ管理 Homebrew Root権限下におけるパッケージ管理 apt (Debian系) dnf (RHEL系) etc. グローバル環境を荒らさない パッケージ管理 ◎

Slide 14

Slide 14 text

flake.nix

Slide 15

Slide 15 text

開発環境の立ち上げ

Slide 16

Slide 16 text

Reproducible / 再現性 16 Nix はパッケージを互いに隔離して構築します。これにより、パッケージ の再現性が保証され、宣言されていない依存関係が存在しないため、あ るマシンで動作するパッケージは、別のマシンでも動作します。 Nix builds packages in isolation from each other. This ensures that they are reproducible and don’t have undeclared dependencies, so if a package works on one machine, it will also work on another. 引用: https://nixos.org、2025年10月10日訪問

Slide 17

Slide 17 text

Declarative / 宣言的 17 Nixを使えば、使用しているプログラミング言語やツールに関係なく、プ ロジェクトの開発環境やビルド環境を簡単に共有できます。 Nix makes it trivial to share development and build environments for your projects, regardless of what programming languages and tools you’re using. 引用: https://nixos.org、2025年10月10日訪問

Slide 18

Slide 18 text

Reliable / 信頼性 18 Nixは、あるパッケージのインストールやアップグレードによって他のパ ッケージが破損しないことを保証します。以前のバージョンへのロール バックを可能にし、アップグレード中にどのパッケージも不整合な状態 にならないことを保証します。 Nix ensures that installing or upgrading one package cannot break other packages. It allows you to roll back to previous versions, and ensures that no package is in an inconsistent state during an upgrade. 引用: https://nixos.org、2025年10月10日訪問

Slide 19

Slide 19 text

特定のプログラミング言語におけるパッケージ管理 pip (Python) npm/yarn/pnpm (Node.js) cargo (Rust) etc. ユーザー権限下におけるパッケージ管理 Homebrew Root権限下におけるパッケージ管理 apt (Debian系) dnf (RHEL系) etc. NixOSとは? 19

Slide 20

Slide 20 text

特定のプログラミング言語におけるパッケージ管理 pip (Python) npm/yarn/pnpm (Node.js) cargo (Rust) etc. ユーザー権限下におけるパッケージ管理 Homebrew Root権限下におけるパッケージ管理 apt (Debian系) dnf (RHEL系) etc. NixOSとは? 20

Slide 21

Slide 21 text

特定のプログラミング言語におけるパッケージ管理 pip (Python) npm/yarn/pnpm (Node.js) cargo (Rust) etc. ユーザー権限下におけるパッケージ管理 Homebrew Root権限下におけるパッケージ管理 apt (Debian系) dnf (RHEL系) etc. NixOSとは? 21 + システム設定 etc.

Slide 22

Slide 22 text

特定のプログラミング言語におけるパッケージ管理 pip (Python) npm/yarn/pnpm (Node.js) cargo (Rust) etc. ユーザー権限下におけるパッケージ管理 Homebrew Root権限下におけるパッケージ管理 apt (Debian系) dnf (RHEL系) etc. NixOSとは? 22 + システム設定 etc.

Slide 23

Slide 23 text

git/neovim/zshの有効化

Slide 24

Slide 24 text

SSHの設定

Slide 25

Slide 25 text

日本語入力の設定

Slide 26

Slide 26 text

なぜNixOSなのか

Slide 27

Slide 27 text

複数サーバーのセットアップが必要 毎回手動で設定を行うのはめんどくさい ↓ 設定をNix式ですべて表現し、複数のマシンで再利用 ↓ nixos-rebuild ↓ 爆速で環境構築DONE! 🎉 1. セットアップの爆速化 27

Slide 28

Slide 28 text

Kubernetes関連の設定を毎回やるのはだるい それ以外の設定はほぼ共通になりそう ↓ 再利用する単位で.nixファイルを切り出してモジュール化 使いたいモジュールをサーバーごとの設定からimport ↓ 同じ設定を再利用できる! ♻️ 2. 設定の再利用 28

Slide 29

Slide 29 text

ロマン ロマン 3. ロマン 29

Slide 30

Slide 30 text

基盤構築 - NixOS - 30

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

Kubernetesクラスター立ち上げ 32 基本的にはKubernetes - NixOS Wikiの通りに進めていけばOK https://nixos.wiki/wiki/Kubernetes services.kubernetes.roles kubeletやetcdといった立ち上がるコンポーネントのプリセットを 選択できる コンポーネントはホストOSのサービスとして稼働 easyCertsという機能が有効になる X509証明書による認証や証明書の自動更新ができる FlannelによるCNI自動設定 services.kubernetes.rolesを使わずに、1から設定することも可能

Slide 33

Slide 33 text

Control Plane/Workerに必要な コンポーネントの立ち上げ WorkerであればnodeだけでOK master etcd apiserver scheduler controller manager addon manager flannel proxy node flannel docker kubelet proxy

Slide 34

Slide 34 text

端末間の通信にTailscaleを使用 TailscaleのSplit DNSという機能を使い、*.home.ichi-h.comというド メインのみLocal DNSで名前解決するように設定 ↓ Tailscaleから提供されるIPアドレスを覚えなくてOK! tailnet nameも忘れてOK! VPN + Local DNS 34

Slide 35

Slide 35 text

Split DNS

Slide 36

Slide 36 text

CoreDNSの立ち上げ/設定

Slide 37

Slide 37 text

*.home.ichi-h.comのトラフィックを花明かりサーバーで受ける Nginxを使い、KubernetesクラスターからNodePortで公開されている Pod(Traefik)へポートフォワーディングを行う Proxy Server 37

Slide 38

Slide 38 text

Port Forwarding

Slide 39

Slide 39 text

Nginx立ち上げ/設定

Slide 40

Slide 40 text

基盤構築 - Kubernetes -

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

Traefikを使って各Podへリバースプロキシを行う NodePortでクラスター外に公開し、ホストでPort Forwardingしている Nginxからトラフィックを受け取る Let’s Encrypt + Cloudflare + Lego(ACME)による証明書の自動発行 Ingress Controller 42

Slide 43

Slide 43 text

Reverse Proxy

Slide 44

Slide 44 text

Grafana: ログやメトリクスのモニタリング・通知 Loki: ログストレージおよびクエリエンジン Prometheus: メトリクスコレクタ Vector: ログコレクタ Logs & Metrics Monitoring 44

Slide 45

Slide 45 text

Monitoring System

Slide 46

Slide 46 text

Rook Cephを用いた分散ストレージの提供 Rook クラスター上でCephストレージをうまく扱えるようにするための フレームワーク Ceph 分散ストレージの供給 NixOSで利用する場合、いくつか追加の設定が必要になる 詳しくは私の技術記事を参照 正直NFSとかでよかった気がする…… Storage 46

Slide 47

Slide 47 text

クラスターのバックアップとしてVeleroを使用 バックアップ先はAWS S3 Kopiaを使ってデータ暗号化・圧縮 週1回バックアップを実行 Backup System 47

Slide 48

Slide 48 text

構築してみての所感

Slide 49

Slide 49 text

Mini PCは十分に使える ただRaspberry Piがかなりきつい…… SDカードがI/Oでボトルネックになっている メモリもギリギリ(常に75 ~90%ほど使っている) サーバースペックについて 49

Slide 50

Slide 50 text

予想通り、OSの再現性と設定の再利用性は素晴らしかった 意外にも生成AIからの回答が使えることがある ただ、services.kubernetes.rolesのような中身がブラックボックス化し ている設定を使っているときに、そこでバグると辛い ネット上に情報は文字通り「ない」 GitHubから該当箇所を探してコードリーディングが始まるのが日 常 NixOSについて - その1 50

Slide 51

Slide 51 text

NixOSについて - その2 51 一見 NixOS から完成されたパッケージが提供され、それを組み合 わせるだけで OS を構築できるかと思いきや、その中身で何が起き ているかはわからないという点において、実は意外にも、NixOS は Ubuntu のような完成された状態で提供されるディストリビューシ ョンと近い弱点を抱えているんじゃないかなと思いました。 引用: https://zenn.dev/ichi_h/articles/ff001e0005e33c、2025年10月11日訪問

Slide 52

Slide 52 text

Arch Linux まっさらな状態から手続きの積み重ねによって環境を構築するディス トリビューション Nix 式のようにシステムの全体像を把握する手段が基本的にはない 代わりに、必ず 1 回は手続きを踏む必要があり、かつそうした手続き をドキュメントとして残す風習があるため、詳細な操作には強い もしNix言語を自由に操れたならば、NixOSでもシステムのすべてを宣言 的に構築することができる → Arch Linuxと近い性質 cf. Arch LinuxとNixOS 52

Slide 53

Slide 53 text

NixOSについて - その3 53 このように考えると、再現性の高いパッケージを再利用して恩恵を 得ようとするライトユーザーと、システムのすべてを宣言的に構築 しようとするヘビーユーザーとの間で、NixOS の捉え方が変わるの かもしれません。 引用: https://zenn.dev/ichi_h/articles/ff001e0005e33c、2025年10月11日訪問

Slide 54

Slide 54 text

環境の再現性が高い クラスターを爆破してしまっても数コマンドで元に戻せる Reconciliation Loopが強力 = Desired State(望ましい状態)と Current State(現在の状 態)に差異がある場合、その差分を継続的に解消するというコン セプト サーバーを再起動しても、エラーにならず勝手に望ましい状態へ 持っていってくれるのは楽 公式ドキュメントに使い物にならないページがある Kubernetesについて - その1 54

Slide 55

Slide 55 text

技術 = 道具 = 問題解決の手段 問題が紐づかない道具はあり得ない ドキュメントには、その道具が何の問題を対象として取っているのか を記述すべき(What, Why) その道具の意義や使いどころへと繋がる 技術仕様 = どう問題を解決するのかを表現したもの(How) Howを抽象化して、WhatやWhyを読み手に解釈させるドキュメン トはリーダブルではない Kubernetesについて - その2 55 読み手が最速で理解できる、リーダブルなドキュメントを

Slide 56

Slide 56 text

おすすめできるか

Slide 57

Slide 57 text

できません

Slide 58

Slide 58 text

services.kubernetes.rolesは便利だが、自由がない CNIをFlannelから変更しにくい 事実上NixOS以外のノードをクラスターに参加できない etc. services.kubernetes.rolesを使わない場合、開発コストが増大する より情報がない中で環境を作る必要がある .nixを読解して自力で解決できないとNixOSは扱えないという意見 もある ↓ どちらかを受け入れる必要がある 自由度と開発コストのトレードオフ 58

Slide 59

Slide 59 text

ただ

Slide 60

Slide 60 text

こんなことをやっている人はたぶん世界に1000人もいない 全世界0.0000122%の逸材になれます NixOSを使いたいからNixOSを使うという人はぜひ ロマンを追い求める すべての人におすすめ! 60 ✨ ✨

Slide 61

Slide 61 text

WE FEEL SO ROMANTIC! 🚢🚢🚢

Slide 62

Slide 62 text

NixOS + Kubernetesで構築する自宅サーバーのすべて https://zenn.dev/ichi_h/articles/ff001e0005e33c Nix & NixOS | Declarative builds and deployments https://nixos.org Kubernetes - NixOS Wiki https://nixos.wiki/wiki/Kubernetes NixOSで最強のLinuxデスクトップを作ろう https://zenn.dev/asa1984/articles/nixos-is-the-best NixOSの使い方とArch Linux、Gentooとの比較 https://zenn.dev/nixos/articles/ff1cc62ff04de0 参考