· raspberrypi · 6 min read

Raspberry Pi 5にk3sを入れる

kubernetesの軽量バージョンであるk3sをラズパイに入れます

kubernetesの軽量バージョンであるk3sをラズパイに入れます

前回はラズパイのセットアップまでを行いました。 今回はこれにk3sを入れます。

k3s構成

端末

ノード種別
Raspi1Server
Raspi2Agent
Raspi2Agent

ネットワーク

各端末ともWi-Fiに接続していますが(固定IP)、3台とも有線でそれぞれスイッチングHUBを仲介して接続しています(それも固定IP)。

補足

k3sはデフォルトの「データストア」として組み込みのsqliteが使用できます。軽量ではありますが単一ファイルで運用されるので、可用性の点で劣ります。k8sで使用されているetcdも使用可能ですが、今回はsqliteで構築します。

etcd以外には、PostgreSQLとMySQLも使用できるようです。

なお、可能性を高めるならk3sサーバーを複数台で構成するのがベストプラクティスです(最低3台以上の奇数台構成)。
その上でロードバランサーをサーバーの前段に配置するのがよいですが……今回はそこまではしません。

サーバー/エージェントともに行う作業

以下はmaster, workerともに各ノード共通の作業です

cgroups有効化

デフォルトではcgroupsが有効化されていないので有効にします

cd /boot/firmware
sudo vi cmdline.txt

cmdline.txt末尾に以下を追加

cgroup_memory=1 cgroup_enable=memory

OSを再起動します。

sudo reboot

k3sインストール

これはサーバーのみで実施する作業です。
以下のコマンドを実行するだけでOKです。

curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644

k3sでは状態管理のデフォルトのデータストアとして、SQLiteが使用されています。で、SQLiteは単一ファイルのDBで複数サーバー構成には対応していません。単一障害点になりうるので、可用性対策として、組み込みetcdもしくはPostgreSQL, MySQLの使用が望ましいです。ただ、今回は自宅のラズパイ環境なので軽量なSQLiteでインストールしてみます。

クラスタデータストア: https://docs.k3s.io/ja/datastore

後でetcdに切り替えることができるみたいなので、後日試してみるとします。

デフォルトの組み込みSQLiteデータベースを使用している既存のクラスターがある場合、K3sサーバーを—cluster-initフラグで再起動するだけでetcdに変換できます。

高可用性組み込みetcd: https://docs.k3s.io/ja/datastore/ha-embedded

なお、インストールコマンドの--write-kubeconfig-mode 644がないとk3s.yamlが読めない警告が出るようです。

WARN[0000] Unable to read /etc/rancher/k3s/k3s.yaml, please start server with --write-kubeconfig-mode or --write-kubeconfig-group to modify kube config permissions
pi@rp51:/boot/firmware $ curl -sfL https://get.k3s.io | sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.32.3+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.32.3+k3s1/sha256sum-arm64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.32.3+k3s1/k3s-arm64
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Finding available k3s-selinux versions
sh: 416: [: k3s-selinux-1.6-1.el9.noarch.rpm: unexpected operator
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service /etc/systemd/system/k3s.service.
[INFO]  Host iptables-save/iptables-restore tools not found
[INFO]  Host ip6tables-save/ip6tables-restore tools not found

k3sの状態を確認してみます。

systemctl status k3s

active状態なので大丈夫でしょう。

 k3s.service - Lightweight Kubernetes
     Loaded: loaded (/etc/systemd/system/k3s.service; enabled; preset: enabled)
     Active: active (running) since Sat 2025-05-03 01:41:55 JST; 1min 0s ago
       Docs: https://k3s.io

ノードの状態を確認してみます。

kubectl get nodes

うまく出来てそうですね。

NAME   STATUS   ROLES                  AGE    VERSION
rp51   Ready    control-plane,master   5m8s   v1.32.3+k3s1

エージェントのインストール

以下はエージェントとなるラズパイで実施する作業です。

まずはサーバーにログインし、以下のファイルを参照してトークンを控えます。
エージェントのインストールに必要となります。

/var/lib/rancher/k3s/server/token

エージェントとなるラズパイで以下のインストールスクリプトを実行します。

curl -sfL https://get.k3s.io | K3S_URL=https://<MasterのIPアドレ>:6443 K3S_TOKEN=<上のトークンテキス> sh -

Masterノードのラズパイで、ノードを確認してみます。

k3s kubectl get nodes

追加されてるっぽいですね。

NAME   STATUS   ROLES                  AGE    VERSION
rp51   Ready    control-plane,master   18m    v1.32.3+k3s1
rp52   Ready    <none>                 2m2s   v1.32.3+k3s1
rp53   Ready    <none>                 31s    v1.32.3+k3s1

kubectl get nodes -o wideで詳細が出力可能です。

pi@rp51:/etc/rancher/k3s $ kubectl get nodes -o wide
NAME   STATUS   ROLES                  AGE   VERSION        INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION         CONTAINER-RUNTIME
rp51   Ready    control-plane,master   13h   v1.32.3+k3s1   192.168.20.20   <none>        Debian GNU/Linux 12 (bookworm)   6.12.20+rpt-rpi-2712   containerd://2.0.4-k3s2
rp52   Ready    <none>                 13h   v1.32.3+k3s1   192.168.20.21   <none>        Debian GNU/Linux 12 (bookworm)   6.12.20+rpt-rpi-2712   containerd://2.0.4-k3s2
rp53   Ready    <none>                 13h   v1.32.3+k3s1   192.168.20.22   <none>        Debian GNU/Linux 12 (bookworm)   6.12.20+rpt-rpi-2712   containerd://2.0.4-k3s2

k3sのインストールができました。

Back to Blog