Nix と NixOS を使って 趣味 K8s クラスタを運用する

-- Views

October 11, 25

スライド概要

https://docs.google.com/presentation/d/1HIcVwcGBKtWGiWHWKeTVnEuBe_Gg_PahtCEy1B-i6dA/edit?usp=sharing

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

Nix と NixOS を使って 趣味 K8s クラスタを運用する 伴野 良太郎(ばんの りょうたろう) 情報科学若手の会 2025 1

2.

伴野 良太郎(ばんの りょうたろう) ● a.k.a. Ushitora Anqou https://anqou.net/ ● インフラエンジニア@某社 ● 関数型言語(OCaml)や形式手法が好き ● 各種つながり ○ @[email protected](メイン) ○ @ushitora_anqou (X formerly known as Twitter)(最近は使ってません) ● 家に趣味の Kubernetes(K8s)クラスタがある 2

3.

趣味 Kubernetes クラスタ VPS k3s server (control plane) Mastodon 用のクラスタを趣味で運用中 CPU: 2 コア RAM: 2 GB Disk: 30 GB 特長: k3s agent (worker) 自宅 サーバ CPU: 6 コア RAM: 16 GB Disk: 700 GB ● 全てのサーバで NixOS を採用 ● VPS ・自宅サーバ共に比較的 非力なマシン ● k3s で構築された K8s クラスタ 軽量な K8s ディストリビューション 3

4.

サーバを管理していると思うこと ● セットアップをすぐに思い出せるようにしたい ○ 一度正常動作した後、期間が空いても分かるようにしたい ○ 宣言的に設定したい ● 設定を Git・GitHub で管理したい ○ 以前どのような設定をしていたのか分かるようにしたい ○ SSH できない出先でもスマホから設定を見られるようにしたい ● 複数台のサーバの設定をまとめて管理したい ○ 共通の設定とサーバごとの設定を分けて記述したい そんな都合の良いシステムが!? 4

5.

そこで Nix・NixOS! この発表に含まれるもの: ● Nix・NixOS の入門 ● サーバ用 OS としての NixOS の便利ポイント ● 非力なマシンでの NixOS の運用 Tips この発表の目標 みなさんが NixOS でサーバを立てる気になる (そして Mastodon を始める) 5

6.

Nix と NixOS 6

7.

Nix とは ● 一言だと「パッケージマネージャに Makefile がついたもの」 ○ 「必要なツールをダウンロードし(パッケージマネージャ)それを使ってプログラ ムなどをビルドする(Makefile)」というのが書ける ● Nix 言語という独自言語を使って何をどうビルドするかを書く ○ Makefile と同じ文法というわけではない(Makefile はあくまで喩え) ● ビルドの設定を宣言的に記述できる ○ 「このパッケージの名前はこうで、バージョンはこれ、依存はこれでソースはこ こ」のように書くとビルドされる 7

8.

例:Nix で簡単なプログラムをビルドする パッケージの名前とバージョンの 定義 ソースコードをどこからダウンロー ドするかを指定 ビルド結果は /nix/store 配下 に保存される $ nix-build -A icat … /nix/store/rdnpq5m5fx4k0lqg2mn53vr4kjv9dvkv-icat-v0.5 $ readlink result /nix/store/rdnpq5m5fx4k0lqg2mn53vr4kjv9dvkv-icat-v0.5 https://nix.dev/tutorials/packaging-existing-software $ ls result/bin 依存パッケージを指定 result という symlink が作られる icat 8

9.

Nix の特長:ビルドの再現性の担保 マシン M1 ビルド Nix コード マシン M2 ビルド 出力 O 出力 O 誰がいつどこでビルドしても 同じ出力 O が 同じ出力 O 手に入る が手に入る(再現性) 再現性担保のために: ● ビルドに必要なものは全て明示する ○ ○ インターネットからダウンロードしたい場合は予めハッシュ値を明示 パッケージリポジトリは使用するコミットハッシュを指定 ● 明示したもの以外はビルド中に使えない ○ ビルド中はローカルのファイルシステムやネットワークにアクセス不可 9

10.

NixOS とは NixOS のロゴ https://github.com/NixOS/branding ● Nix をシステム管理のツールとして採用した Linux distro ● Nix コードとしてシステム全体の設定を書く ○ どのソフトウェアをインストールするか・どの systemd service を起動するか・ ネットワークの設定をどうするか等々を Nix で書く nixos-rebuild switch で設定ファイルなどを $ sudo nixos-rebuild switch --flake .#basil ビルドし有効化 ○ このコードを Nix でビルドすると必要なソフトウェアや設定ファイルが出力され … るnew configuration is Done. The /nix/store/m1rijxbaki4mgiiv1jydwa1a7wkrryjz-nixos-system-basil-25.05.20251001.5b5be50 ● ビルドされたソフトウェア・設定ファイルをシステムに配置 $ ls /nix/store/m1rijxbaki4mgiiv1jydwa1a7wkrryjz-nixos-system-basil-25.05.20251001.5b5be50/sw/ 環境変数などもそのビルド結果を向くように設定される bin ○ etc lib sbin share ビルドの結果 bin や lib などが作られ 使えるようになる 10

11.

NixOS の特長 Nix を使っていることによる 様々な恩恵がある Nix を使い宣言的に OS の設定を行える ● 明示的に書いたソフトウェアや設定のみが有効化される インストールされるソフトウェアの設定が Nix から行える ● 様々なソフトウェアの設定を Nix に統一できる NixOS が配置する設定ファイルに再現性がある ● マシン M1 向けの設定ファイルをマシン M2 でビルドできる ○ ビルド結果を M1 に送ればそのまま使える 11

12.

サーバ用 OS としてのNixOS 12

13.

サーバを管理していると思うこと 再掲(P.4) ● セットアップをすぐに思い出せるようにしたい ○ 一度正常動作した後、期間が空いても分かるようにしたい ○ 宣言的に設定したい ● 設定を Git・GitHub で管理したい ○ 以前どのような設定をしていたのか分かるようにしたい ○ SSH できない出先でもスマホから設定を見られるようにしたい ● 複数台のサーバの設定をまとめて管理したい ○ 共通の設定とサーバごとの設定を分けて記述したい これらが NixOS によって どのように解決されるかを紹介 13

14.

例 1:インストールされるソフトウェアの宣言的な管理 environment.systemPackages に設定された ソフトウェアが PATH に設定される サーバ用 OS としての嬉しさ セットアップをすぐに思い出せる 14

15.

例 2:各種ソフトウェアの設定 docker のインストールと有効化 swapfile の有効化 userspace で動く tailscale の有効化 様々な異なるソフトウェアの設定を Nix を用いて統一的に扱える dm-raid module の有効化 (LVM RAID) サーバ用 OS としての嬉しさ Nix ファイルはテキストなので 設定を Git・GitHub で管理できる 15

16.

サーバ用 OS としての嬉しさ 複数台のサーバの設定を まとめて管理できる 例 3:k3s の設定 k3s server と k3s agent で設定を共通化 共通部分 k3s server 用 k3s agent 用 16

17.

非力なマシンでの NixOS 17

18.

非力なマシンで NixOS を使うときのつらさ ● ディスク容量の管理 ○ Nix・NixOS ではアンインストールという操作はなく、代わりにガベージコレク ション(GC)によって使用していないものが削除される ○ 定期的に GC を動作させつつディスク容量をモニタリング ● ソフトウェアの自動更新 ○ 既存の仕組みでは様々な問題がある ■ ○ 特に非力なサーバだとビルド時の負荷が深刻 GitHub Actions (GHA) を使って解決 この後のスライドでは こちらについて解説 18

19.

NixOS の自動更新:既存手法(system.autoUpgrade) NixOS にはシンプルな自動更新の仕組みがある ● 更新する時刻を指定する ● 時刻になるとパッケージリポジトリに更新を見に 行く ● 必要なものをマシン上でダウンロード・ ビルド・インストール これで問題ない? ● シンプルすぎるがゆえの問題が色々 https://nixos.wiki/wiki/Automatic_system_upgrades 19

20.

サーバ以外の場所( GHA)で ソフトウェア・設定ファイルの ビルドを行う NixOS の自動更新:system.autoUpgrade の問題点 ● サーバ上でソフトウェア・設定ファイルのビルドが走る ○ 非力なマシンだと負荷が高まる ● GitHub 上の設定と実際のデプロイがズレる ○ ○ 全ての問題が 更新はサーバ上でしか起こらない GHA で解決! GHA で先に GitHub 上の パッケージリポジトリのハッシュ値が更新によってズレる Nix ファイルを ● 各サーバで独立に更新が走る ○ 更新してからデプロイする k3s の更新順序(server→agent)を守れない GHA で更新を直列化する 20

21.

NixOS の自動更新:問題解決のアイデア NixOS の設定を管理する GitHub レポジトリ上で以下を実施: ● 一日に一回 GHA workflow を起動 ● パッケージリポジトリのコミットハッシュを更新し git commit & git push ● 更新後のソフトウェア・設定ファイルをビルド ● ビルド結果を SSH 越しにサーバへデプロイ ○ k3s server→k3s agent になるように順に行う 実際にはこのステップで少 しハックが必要 21

22.

NixOS の自動更新:SSH 越しのデプロイ ● SSH 越しのデプロイは公式にサポートがある ○ nixos-rebuild コマンドの –target-host オプションを使用する ● デプロイ中に systemd service unit の再起動が走る可能性 ○ デプロイによってはネットワーク関連のサービスが再起動 ● SSH が切断されると nixos-rebuild コマンドは失敗する ○ nixos-rebuild で安全に可能なのはビルド結果のコピーまで →ビルド結果の有効化はホスト上の別プロセスで実施 ○ 短命な SSH 接続を繰り返して進捗をポーリングし結果を確認 22

23.

詳細:https://blog.anqou.net/2025/03/nixos-unattended-upgrade/ NixOS の自動更新:実装 毎日 18 時(JST)に動作開始 パッケージリポジトリの コミットハッシュを更新 差分を git commit & git push 23

24.

詳細:https://blog.anqou.net/2025/03/nixos-unattended-upgrade/ NixOS の自動更新:実装 Tailscale SSH を使えるよう にセットアップ k3sk3s server・k3s server・k3s agent agent の順にビルドし、結果 の順にビルドし をサーバへコピー(まだ 結果をサーバへコピー systemd service の (まだ有効化は行わない) restart などは行わない) 24

25.

詳細:https://blog.anqou.net/2025/03/nixos-unattended-upgrade/ NixOS の自動更新:実装 コピーした最新のビルドを有効化するた めのプロセスをサーバ上で起動する 短命な SSH 接続を繰り返して 処理が終わったかをポーリング 25

26.

詳細:https://blog.anqou.net/2025/03/nixos-unattended-upgrade/ NixOS の自動更新:実装 自動更新が失敗したら Discord に通 知を飛ばす 動作の様子 26

27.

まとめに代えて NixOS でサーバを立てたくなった人へ ● 公式サイト https://nixos.org/ ● 拙筆『NixOS を使い始める』https://blog.anqou.net/2024/12/start-nixos/ ○ ただしこれはデスクトップ向け ● nixos-anywhere https://github.com/nix-community/nixos-anywhere ○ kexec を利用して NixOS をブートできる(らしい) ○ 使ったことはないですが VPS などで便利かも ● Mastodon https://joinmastodon.org/ja ○ Mastodon はいいぞ 27

28.

バックアップ 28

29.

例:Nix で Docker イメージをビルドする イメージの名前とタグの指定 イメージ内に含める ソフトウェアの一覧 イメージ内のセットアップ (Dockerfile の RUN 相当の記述) ENTRYPOINT や ENV などの指定 https://github.com/ushitora-anqou/ket-containers/blob/0 bf07d9052f5db71f2361a82e24365cec475eafa/nix/post gres-backup.nix 29

30.

例:Nix で Docker イメージをビルドする flake.lock nixpkgs のコミットハッシュを固定 →インストールされるパッケージを固定 → いつ誰がビルドしても全く同じイメージが出力される https://github.com/ushitora-anqou/ket-containers/tree/0 bf07d9052f5db71f2361a82e24365cec475eafa/nix Nix を使わず Dockerfile でビルドすると apt-get update したりするので必ずしも同じイメージが 作れるとは限らない 30

31.

NixOS の特長:設定のロールバックが容易 ● ソフトウェアのアップデートや設定の変更を元に戻せる ○ 前のソフトウェア・設定はインストールされたままなので symlink や環境変数 などを張り直すだけ 過去のビルドが保存される $ nixos-rebuild list-generations | head -4 Generation Build-date NixOS version Kernel Configuration Revision Specialisation Current 873 2025-10-02 23:44:19 25.11.20250928.e9f00bd 6.12.49 Unknown [] True 872 2025-10-01 18:52:44 25.11.20250928.e9f00bd 6.12.49 Unknown [] False 871 2025-09-30 18:12:23 25.11.20250928.e9f00bd 6.12.49 Unknown [] False $ sudo nixos-rebuild switch --rollback --flake .#anise building the system configuration... switching profile from version 873 to 872 … Done. The new configuration is /nix/var/nix/profiles/system nixos-rebuild switch –rollback によって巻き戻せる 31

32.

Nix の特長:豊富なパッケージと変更の容易さ ● 公式パッケージレポジトリである nixpkgs は 最大級の品揃え ○ ● 大きいだけでなく更新も早い パッケージを修正してカスタムビルドするのも 容易 ○ ビルドオプションを変更したりコードにパッチを 当てたりしてビルドできる ○ ● 新旧のバージョンに固定するのも容易 同じソフトウェアでも設定が異なれば別物とし てビルドされる ○ 同じソフトウェアの違うビルドが共存可能 https://repology.org/repositories/graphs 32

33.

例:nixpkgs にあるパッケージをパッチして使う nixpkgs にある imagemagick の ビルドオプションを変更してビル ドする nixpkgs にある wezterm にパッ チを当ててビルドする 33

34.

NixOS の特長:宣言的な OS の設定 マシンの設定を Nix 言語を使い宣言的に管理できる ● 明示的に書いたソフトウェアや設定のみが有効化される ● NixOS 側で用意されたオプションが「つまみ」として機能する ○ 各種ソフトウェアの設定を直接触ることなく、NixOS の設定として Nix 言語で 統一的に書ける ○ どのようなオプションがあるかは https://nixos.org/manual/nixos/stable/ や https://search.nixos.org/options から分かる 34

35.

NixOS の特長:ビルドの再現性 Nix のおかげで NixOS のビルドには再現性がある ● マシン A 向けの設定をマシン B でビルドできる ● ビルド結果を SSH 越しに別マシンへデプロイ可能 ○ nixos-rebuild の –target-host オプションで正式サポート ● ビルドできるということ自体が設定の正しさをある程度担保 ● VM を立ち上げて動作を確認できる ○ nixos-rebuild build-vm コマンドによって正式サポート 35