1台程度のマシンで、小規模な k8s(Kubernetes) 環境を構築できる MicroK8s をラズベリーパイ(以下「ラズパイ」)に導入する手順を確認してみました。MicroK8s は Ubuntu を開発&提供している Canonical 社が開発する k8s パッケージです:
まずラズパイ本体を用意します。後述しますが k8s はスワップメモリを無効にして稼働させる必要があるため、ラズパイ3以前のメモリ 1GB 環境だと少し厳しいかもしれません。今回はメモリ 4GB モデルのラズパイ4を使って確認しました。
次に 64bit 版ラズパイ OS をインストールします(MicroK8s は 64bit OS 向けに提供されています)。64bit 版のラズパイ OS は 2021/01/08 の時点では正式リリースされているわけではありませんが、こちらからテスト版をダウンロードすることができます:
http://downloads.raspberrypi.org/raspios_arm64/images/
私は 2020-08-24 という日付が入ったモジュールをダウンロードしました(この記事を記述している時点では最新の 64bit モジュールです。公式の 32bit 版と比べるとたまに知らない間に再起動してたりして、少し不安定な印象はあります)。ダウンロード後に展開してマイクロ SD カードに書き込みます(このあたりは通常の手順と同様)。そしてラズパイ(4)にセットして初期セットアップを済ませておきます。
この後に MicroK8s をインストールするのですが、その前に準備作業を2つほどしておきます。まず k8s はスワップメモリが存在していると正しく動作しないため、まずはスワップを無効にします:
続けて、これも通常の k8s を導入する際にも行う必要のある手順ですが、cgroups のメモリーサブシステムを利用するため、/boot/cmdline.txt に記述されている内容の(同じ行の)最後に以下の赤字部分を追記して保存し、この段階で一度リブートします:
これで k8s を導入するための準備が完了しました。続けて MicroK8s をインストールします。今回は公式サイトでも紹介されている、Snapd を利用する方法でインストールします。まずは Snapd (とこの後で使う iptables-persistent)をインストールして一度リブートします:
再起動後に再度ログインし、改めて Snap を使って MicroK8s をインストールします(この手順で少し時間がかかります):
MicroK8s のインストールが完了したら以下の3つのコマンドを実行後に(一度 exit してから)再ログインします:
ここまでの作業で MicroK8s がインストールされて、MicroK8s が起動されているはずです。 以下の "get nodes" コマンドを実行して STATUS 欄が "Ready" と表示されることを確認します:
またサービスの一覧は "get services" コマンドで確認できます:
なお、MicroK8s の起動/終了のコマンドはそれぞれ以下の通りです:
Snap パッケージになっているので、インストール時の手間が非常に簡略化されている印象でした。一方で、(これは MicroK8s というよりも 64bit OS の問題なのかもしれませんが)全体的に不安定な挙動が見受けられるように感じました。"microk8s.kubectl get nodes" コマンドの結果が READY ではなく NotReady になることがあったり、システムがいつの間にか再起動していたりして、イマイチ安定していないような気もします。
まずラズパイ本体を用意します。後述しますが k8s はスワップメモリを無効にして稼働させる必要があるため、ラズパイ3以前のメモリ 1GB 環境だと少し厳しいかもしれません。今回はメモリ 4GB モデルのラズパイ4を使って確認しました。
次に 64bit 版ラズパイ OS をインストールします(MicroK8s は 64bit OS 向けに提供されています)。64bit 版のラズパイ OS は 2021/01/08 の時点では正式リリースされているわけではありませんが、こちらからテスト版をダウンロードすることができます:
http://downloads.raspberrypi.org/raspios_arm64/images/
私は 2020-08-24 という日付が入ったモジュールをダウンロードしました(この記事を記述している時点では最新の 64bit モジュールです。公式の 32bit 版と比べるとたまに知らない間に再起動してたりして、少し不安定な印象はあります)。ダウンロード後に展開してマイクロ SD カードに書き込みます(このあたりは通常の手順と同様)。そしてラズパイ(4)にセットして初期セットアップを済ませておきます。
この後に MicroK8s をインストールするのですが、その前に準備作業を2つほどしておきます。まず k8s はスワップメモリが存在していると正しく動作しないため、まずはスワップを無効にします:
$ sudo swapoff -a
続けて、これも通常の k8s を導入する際にも行う必要のある手順ですが、cgroups のメモリーサブシステムを利用するため、/boot/cmdline.txt に記述されている内容の(同じ行の)最後に以下の赤字部分を追記して保存し、この段階で一度リブートします:
console=serial0,115200 console=tty1 root=PARTUUID=a3ba36bd-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cgroup_enable=memory cgroup_memory=1
これで k8s を導入するための準備が完了しました。続けて MicroK8s をインストールします。今回は公式サイトでも紹介されている、Snapd を利用する方法でインストールします。まずは Snapd (とこの後で使う iptables-persistent)をインストールして一度リブートします:
$ sudo apt install snapd iptables-persistent $ sudo reboot
再起動後に再度ログインし、改めて Snap を使って MicroK8s をインストールします(この手順で少し時間がかかります):
$ sudo snap install microk8s --classic
MicroK8s のインストールが完了したら以下の3つのコマンドを実行後に(一度 exit してから)再ログインします:
$ sudo usermod -a -G microk8s $USER $ sudo chown -f -R $USER ~/.kube $ sudo iptables -P FORWARD ACCEPT
ここまでの作業で MicroK8s がインストールされて、MicroK8s が起動されているはずです。 以下の "get nodes" コマンドを実行して STATUS 欄が "Ready" と表示されることを確認します:
$ microk8s.kubectl get nodes
NAME STATUS ROLES AGE VERSION
raspberrypi Ready <none> 7h25m v1.20.0-37+6252d1e153c00f
またサービスの一覧は "get services" コマンドで確認できます:
$ microk8s.kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 9h
なお、MicroK8s の起動/終了のコマンドはそれぞれ以下の通りです:
$ microk8s start (起動) $ microk8s stop (終了)
Snap パッケージになっているので、インストール時の手間が非常に簡略化されている印象でした。一方で、(これは MicroK8s というよりも 64bit OS の問題なのかもしれませんが)全体的に不安定な挙動が見受けられるように感じました。"microk8s.kubectl get nodes" コマンドの結果が READY ではなく NotReady になることがあったり、システムがいつの間にか再起動していたりして、イマイチ安定していないような気もします。