【2021年12月版】k0sをRaspbianのラズパイ4で動かす。

# k0s とは

Kubernetesのディストリビューションの一つで、"Zero Friction Kubernetes"=摩擦
ゼロのk8sだそうです。
k8sクラスタの構築、動作に必要なコードを~~無理やり~~単一のバイナリに収めたコンパクトなパッケージで、簡単に、また非常に低いスペックの環境でk8sクラスタを構築・運用することができます。

k0s 公式サイトはこちら↓です。

https://k0sproject.io/

また Github のリポジトリは↓でございます。

https://github.com/k0sproject/k0s

必要なシステム要件が最低、"1 vCPU, 1 GB RAM"となっておりまして、スペックの低いIoTのエッジ側でもk8sが動く、というのがウリでございます。

# k0s がラズパイ４で動くのか

さて、私の手元のラズパイ４は以下のようなOSとスペックでございます。

```
$ uname -a
Linux raspberrypi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
$ cat /etc/issue
Raspbian GNU/Linux 10 \n \l
```
というわけで、

- OS: Raspbian Buster
- メモリ: 4 GB

の構成です。

K0sの公式サイトでは、以下のようにラズパイにk0sをインストールするマニュアルがございます。

https://docs.k0sproject.io/v1.22.4+k0s.0/raspberry-pi4/

ところがここでの対象環境は、メモリ 8GB、OS "Ubuntu Server 20.04.1 LTS"でして、手元の環境とはちょっと異なります。(さらに低いわけです。。。)

大丈夫なのか・・・ちょっとトライしてみましょう！

## 事前準備

それでは早速、上記のサイトを参考に、あくまで参考に、Raspbianをいじっていきます。

まずは "memory"の"cgroup"を有効にします。

```
$ sudo vi /boot/cmdline.txt
```

などでファイルの末尾に以下の設定を追加

```
cgroup_enable=memory
```
こちらは上記の記述の追加だけでOKでした。

続いて、以下のファイルに設定を記述してカーネルモジュールを追加します。

```
$ sudo vi /etc/modules-load.d/modules.conf 
```
などで以下の設定を追加します。

```
overlay
nf_conntrack
br_netfilter
```
この３つは必要でした。

そして再起動しましょう。

```
$ sudo shutdown -r now
```
さて、再起動が終わりましたら、一旦、cgroupやカーネルモジュールを以下のコマンドで確認してみます。

```
$ mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
$ cat /proc/cgroups
#subsys_name    hierarchy       num_cgroups     enabled
cpuset  9       1       1
cpu     5       1       1
cpuacct 5       1       1
blkio   4       1       1
memory  2       78      1
devices 10      38      1
freezer 7       1       1
net_cls 6       1       1
perf_event      8       1       1
net_prio        6       1       1
pids    3       43      1
$ lsmod | grep overlay
overlay               106496  0
$ lsmod | grep nf_conntrack
nf_conntrack          139264  0
nf_defrag_ipv6         20480  1 nf_conntrack
nf_defrag_ipv4         16384  1 nf_conntrack
$ lsmod | grep br_netfilter
br_netfilter           32768  0
bridge                163840  1 br_netfilter
ipv6                  495616  32 br_netfilter,bridge
```
はい、無事に memoryのcgroupは有効になっており、カーネルモジュールのロードはできているようですね。

## k0sのインストール

では、以下のコマンドでk0sをインストールします。

```
$ curl -sSLf https://get.k0s.sh | sudo sh
Downloading k0s from URL: https://github.com/k0sproject/k0s/releases/download/v1.22.2+k0s.1/k0s-v1.22.2+k0s.1-arm
k0s is now executable in /usr/local/bin
```
続いて、クラスタのインストールと実行を以下のコマンドでおこないます。

```
$ sudo k0s install controller --single
...
$ sudo k0s start
```
今回はシングルクラスタ用のデフォルト設定でk0sのクラスタを設定し、クラスタの起動を行っております。

さすが摩擦ゼロ。インストール＆初期設定がめちゃくちゃ簡単です。

## 動作確認
`k0s start`した後はしばらく・・・1分程度は応答がないと思いますが、以下のコマンドでクラスタの状態がチェックできます。

```
$ sudo k0s status
Version: v1.22.2+k0s.1
Process ID: 4951
Role: controller
Workloads: true
```
また`systemctl`コマンドでサービスのログなどが確認できます。

```
$ systemctl status k0scontroller
...
```
さらに5分程度、待っていると以下のように`k0s kubectl`でk8sクラスタの操作ができるようになります。

```
$ sudo k0s kubectl get nodes
...
```
さて、`get nodes`でノードのステータスが"Ready"になったら起動完了です！

`kubectl` で操作できるように設定ファイルを吐き出します。

```
$ sudo cat /var/lib/k0s/pki/admin.conf > ~/.kube/config
```
で、ちゃんと`kubectl`でアクセスできるか確認してみます。

```
$ kubectl get node
...
```
ここでちゃんとしたレスポンスが返って来ればOKです。
いや〜、早くも**K8sクラスタ、起動完了**です。

`~/.kube/config`の`localhost`をラズパイのIPアドレスに書き換えれば他PCからのkubectlやLensで接続も可能です。

Lensでのスクショは貼りませんが、ちゃんとアクセス可能でした。すごい。簡単。

## 停止と破棄

以下のコマンドでサービスの停止が可能です。

```
$ sudo k0s stop
```

またクラスタの設定破棄も以下のコマンドでサクッと可能です。

```
$ sudo k0s reset
```

はい、これでクラスタのお掃除も完了です。

トライ＆エラーを繰り返したいk8sクラスタでの実験ではお掃除が簡単なのは非常にありがたいですね。

# 感想など

k0sの名の通り、非常に簡単にクラスタの作成と破棄が行えます。
本家サイトにはラズパイのメモリ8Gが推奨とありましたが手元の4Gのラズパイでも動作できました。
少々のサービスの動作確認程度なら4Gのラズパイでも十分なのではないでしょうか。

引き続き、色々なサービスの検証を行ってまいりたいと思います。

本日は以上です。