自宅鯖の紹介(と改築) ~働かざる者kubernetes~

この記事は[海洋大技術系サークル Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kaiyo-tech)の2日目です。新入生がこんな早い枠貰っていいんですか！？

# はじめに

NePP所属のしらすです。ロボ研にも所属しており主にインフラ周りをいじってたりしています。

この記事の趣旨ですが、 


~~シリコンバレーの古いことわざにも「*働かざる者kubernetes*」というのがあるように、徒然なるままにその日暮らしをしている僕もKubernetesクラスタを組むべきなのではないか！と思うようになりました。~~

ただ単にアドカレのネタに自宅のインフラ諸々を改築したい＆自宅鯖の紹介をしたい欲が出てきたのがきっかけです。

# これまでどうしていたか

## ハードウェア

ラズパイ,ノートPC,ヤフオクで落としたサーバ等々雑多にあるものでやってます。

### HP ProLiant ML350 G6

高2のときヤフオクで落としてきたタワー型のやつ、でかつよ。メモリは2GB×3しかなかったものを36GBまで増設しました。いずれデュアルCPUのメモリ144GBまで強化する予定です。
![DSC_0497.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727779/aaca51da-fdf5-efcc-bbe9-33c0f1ccffa1.jpeg)
(部屋が汚くて公開できる画角がこれしかない)
```terminal
hp-server
-------------
OS: Proxmox VE 8.1.3 x86_64
Host: ProLiant ML350 G6
Kernel: 6.5.11-4-pve
Shell: bash 5.2.15
CPU: Intel Xeon E5620 (8) @ 2.400GHz
GPU: AMD ATI Radeon HD 3650/3750/4570/4580
Memory: 36GB
Disk: 128GB
```

電気代結構かかってたり夜寝るときうるさかったりで、、体調悪いときは精神衛生上の観点から電源落としてます。

### Raspberry Pi4 Model B 8GB

半導体不足で価格が高騰する前に買いました。高校の課題研究でもお世話になったマシン。

![IMG_20211011_214741.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727779/402f0c88-dcb4-fbf0-d2ea-970ba10d734c.jpeg)

(扇風機で冷やしていた頃。流石にファン買いました。)

```terminal
rp4-01 
---------- 
OS: Debian GNU/Linux 12 (bookworm) aarch64 
Host: Raspberry Pi 4 Model B Rev 1.4 
Kernel: 6.1.0-rpi4-rpi-v8 
Shell: bash 5.2.15 
CPU: BCM2835 (4) @ 1.800GHz 
Memory: 97MiB / 7810MiB 
Disk: 1000GB
```

### Raspberry Pi3 Model B+ 1GB

メモリ少ないです。家電リモコン以外には多分使わない。

```terminal
rp3-01
---------- 
OS: Raspbian GNU/Linux 11 (bullseye) armv7l 
Host: Raspberry Pi 3 Model B Plus Rev 1.3 
Kernel: 6.1.21-v7+ 
Shell: bash 5.1.4 
CPU: BCM2835 (4) @ 1.400GHz 
Memory: 1GB
Disk: 32GB
```

### HP Pavilion 15 Notebook PC

家族用PCだったものを持ち出してきました。なんか言われたら返します。

外出先からVNCつなぐのと予備のWebサーバとして使用しています。

```terminal
hp-notebook
-------------
OS: Debian GNU/Linux 11 (bullseye) x86_64
Host: HP Pavilion 15 Notebook PC 098A110100404100
Kernel: 5.10.0-23-amd64
Shell: bash 5.1.4
CPU: Intel i7-4500U (4) @ 3.000GHz
GPU: NVIDIA GeForce GT 740M
Memory: 4GB
Disk: 250GB
```

## 主なサービス

そもそもあまりアクセスがない(負荷を掛けるのは自分くらい)です。

- Nginx(個人HP)
- Samba(ファイルサーバ)
- Discordbot
- VNC Server
- Cloudflare Tunnel(ポート開放したくないので)

仮想化なにそれ美味しいの？状態だったので全て直のDebian上で動かしていました。
今はML350 G6だけProxmox VE入れてLXC使ってます。

※LXCとは
>LXC は Linux カーネルが持つコンテナ機能のためのユーザスペースのインターフェースです。
Linux ユーザがシステムコンテナやアプリケーションコンテナを簡単に作成したり管理したりするためのパワフルな API とシンプルなツールを提供しています。

参考:[LXC/イントロダクション](https://linuxcontainers.org/ja/lxc/introduction/)

## ユーザ管理・監視

LDAP入れても使う人が一人なのですぐやめました。悲しいですね。
監視ツールはMuninとProxmoxのコンソールでグラフ眺める程度です。

# 改築

ラズパイ4をコントロールプレーンに、ML350 G6のLXC上にワーカーノードをそれぞれ配置してKubernetesクラスタを構成します。前提条件として各マシン・LXCともに適当なIPアドレスを振っときます。

## クラスタ構成

| HostName | IP address    | Machine                | CPU                      | Memory    | Disk         | OS                                     | 備考         |
| :------- | :------------ | :--------------------- | :----------------------- | :-------- | :----------- | :------------------------------------- | :----------- |
| rp4-01   | 192.168.1.120 | Raspberry Pi 4B        | BCM2835 (4)              | 8GB       | 1000GB       | Debian GNU/Linux 12 (bookworm) aarch64 | Control Plane |
| lxc-01   | 192.168.1.130 | LXC(ProLiant ML350 G6) | LXC(Intel Xeon E5620(8)) | 8GB       | 22GB         | LXC(Proxmox VE 8.1.3 x86_64)           |          |
| lxc-02   | 192.168.1.131 | LXC(ProLiant ML350 G6) | LXC(Intel Xeon E5620(8)) | 8GB       | 22GB         | LXC(Proxmox VE 8.1.3 x86_64)           |              |
| lxc-03   | 192.168.1.132 | LXC(ProLiant ML350 G6) | LXC(Intel Xeon E5620(8)) | 8GB       | 22GB         | LXC(Proxmox VE 8.1.3 x86_64)           |              |

## LXC上で組む際の注意点

LXCはKVMなどの仮想マシンと比べより少ないリソースで動作させることができるのですが、安全のためにコンテナ内から利用できないOSの機能があります(LXCの仕様)。これをどうにかしないことにはk8sが動かないので以下を`/etc/pve/lxc/<コンテナID>.conf`に追記。

```conf:/etc/pve/lxc/<コンテナID>.conf
lxc.apparmor.profile: unconfined
lxc.cap.drop:
lxc.cgroup.devices.allow: a
lxc.mount.auto: proc:rw sys:rw
```

また、特権コンテナでないといけないのでUnpriviledgedのチェックは外す、swapを有効にしない等々にも気をつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727779/2f8abe01-c12f-f93b-be7b-6617fd1b8c80.png)
↑コンテナの設定例

## 設定

[公式のドキュメント](https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)を参考に設定しました。コンテナランタイムもcontainerdを使用しているので特に独自性はないです。



参考:
[1.proxmoxのコンテナにk8sクラスタを構築する](https://zenn.dev/honahuku/articles/setup-k8s-cluster-using-proxmox-containers)
[2.ProxmoxVEのLXCでKubernetesクラスタを構築する。](https://zenn.dev/ddpn08/articles/d85176619f3fdd)
[3.4台のラズパイでk8sクラスタを組んだ](https://skanehira.github.io/this-week-in-gorilla/articles/raspberry-pi-cluster.html)

# おわりに
現状何もサービスを移行できていないのでぼちぼちやっていきます。
また、今後のGNU Socialの記事でも使っていく予定です。
みんなもおうちでkubernetesクラスタを組もう！