k0s とは
Kubernetesのディストリビューションの一つで、"Zero Friction Kubernetes"=摩擦
ゼロのk8sだそうです。
k8sクラスタの構築、動作に必要なコードを無理やり単一のバイナリに収めたコンパクトなパッケージで、簡単に、また非常に低いスペックの環境でk8sクラスタを構築・運用することができます。
k0s 公式サイトはこちら↓です。
また Github のリポジトリは↓でございます。
必要なシステム要件が最低、"1 vCPU, 1 GB RAM"となっておりまして、スペックの低いIoTのエッジ側でもk8sが動く、というのがウリでございます。
k0s がラズパイ4で動くのか
さて、私の手元のラズパイ4は以下のような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をインストールするマニュアルがございます。
ところがここでの対象環境は、メモリ 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
この3つは必要でした。
そして再起動しましょう。
$ 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のラズパイでも十分なのではないでしょうか。
引き続き、色々なサービスの検証を行ってまいりたいと思います。
本日は以上です。