このページには Raspberry Pi を使った k3s の最低限のインストール方法について書いてあります。
クラスター構成 #
次の Raspberry Pi 4B を3台使って k3s クラスターを構築します。次のような構成です。
Server | Agent | |
---|---|---|
Hardware | Raspberry Pi 4B x 1台 | Raspberry Pi 4B x 2台 |
OS | Raspberry Pi OS Lite (64-bit) | Raspberry Pi OS Lite (64-bit) |
なお、 公式の Cluster Datastore Options に記載の通り、k3s のクラスターデータストアには複数のオプションがあります。 データストアを k3s クラスターに組み込んで構築する場合には SQLite と etcd のどちらかの選択肢になります。 High Availability 構成を取りたい場合には必然的に、Etcd を選択する必要があります。 HA 構成の場合、サーバーノードに最低でも 3台必要となります。
公式ドキュメントに次のような警告があります。
WARNING: Embedded etcd (HA) may have performance issues on slower disks such as Raspberry Pis running with SD cards.
Raspberry Pi 3B+ がたくさん余っているのでこれらをサーバーノードにしようと試みましたが、少なくとも Raspberry Pi 3B+ では etcd を使ったサーバーノードとしては動きませんでした。USB ブートで SSD を使えば動きそうな気もしますが、サイズが大きくなるのとコストの問題で断念しました。
Raspberry Pi 4B では辛うじて動きますが CPU 使用率は iowait によって常時高い状態です。
ここでは k3s として最もシンプルな構成である Enbedded SQLite を使います。
下準備 #
Raspberry Pi の場合、メモリー管理を cgroups にさせるための設定が必要です。 この設定を行わないと k3s は動きません (k8s も同様)。 k3s については公式ドキュメントの ここ に書いてあります。
cgroups の現状の設定は次のコマンドを打つとわかります。
$ cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 4 1 1
cpu 6 42 1
cpuacct 6 42 1
blkio 9 42 1
memory 0 50 0 ← disable になっている
devices 10 42 1
freezer 8 2 1
net_cls 5 1 1
perf_event 7 1 1
net_prio 5 1 1
pids 2 47 1
rdma 3 1 1
Raspberry Pi OS の場合、/boot/cmdline.txt
に cgroup_memory=1 cgroup_enable=memory
と行末に追加すればよいです。
なお、Ubuntu の場合、対象のファイルが異なり、/boot/firmware/cmdline.txt
に cgroup_memory=1 cgroup_enable=memory
と行末に追加すればよいです。
リブート後、先ほどのコマンドを確認すると次のように有効化されたことが確認できます。
$ cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 8 4 1
cpu 5 43 1
cpuacct 5 43 1
blkio 7 43 1
memory 10 59 1 ← enabled になった
devices 9 40 1
freezer 11 5 1
net_cls 4 4 1
perf_event 2 4 1
net_prio 4 4 1
pids 6 48 1
rdma 3 1 1
k3s のインストール #
サーバーノードの準備 #
はじめに1台目のサーバーノードにするマシンで k3s が提供するインストレーションスクリプトを次のように実行し、k3s をインストールします。
$ curl -sfL https://get.k3s.io | sh -
k3s が動いているかは次のコマンドで確認できます。
$ systemctl status k3s
● k3s.service - Lightweight Kubernetes
Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-05-07 23:15:31 JST; 1min 18s ago
Docs: https://k3s.io
Process: 2514 ExecStartPre=/bin/sh -xc ! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service (code=exited, status=0/SUCCESS)
Process: 2516 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
Process: 2517 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 2518 (k3s-server)
Tasks: 113
Memory: 1.2G
CPU: 2min 21.847s
CGroup: /system.slice/k3s.service
├─2518 /usr/local/bin/k3s server
├─2603 containerd -c /var/lib/rancher/k3s/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var/lib/rancher/k3s/agent/containerd
├─3355 /var/lib/rancher/k3s/data/33f2f883e918543e89bba65177eafb6148f9fa38c07c61cf7ce6ae61c0f50a96/bin/containerd-shim-runc-v2 -namespace k8s.io -id 5f73363534bc68a471e8e85d9c6b5338f0fa2d5abcfb509067cd861c4717331f -address /run/k3s/containerd/containerd.sock
├─3415 /var/lib/rancher/k3s/data/33f2f883e918543e89bba65177eafb6148f9fa38c07c61cf7ce6ae61c0f50a96/bin/containerd-shim-runc-v2 -namespace k8s.io -id bde37415c39032980c8e86c4f2e81497a22d6bda9ceffb5cf5a81a6545326eed -address /run/k3s/containerd/containerd.sock
├─3452 /var/lib/rancher/k3s/data/33f2f883e918543e89bba65177eafb6148f9fa38c07c61cf7ce6ae61c0f50a96/bin/containerd-shim-runc-v2 -namespace k8s.io -id 1bc0a55988ce27af6e9af5f137f2e198f3b2017cd3f28e71c9fab734e20432ed -address /run/k3s/containerd/containerd.sock
├─4731 /var/lib/rancher/k3s/data/33f2f883e918543e89bba65177eafb6148f9fa38c07c61cf7ce6ae61c0f50a96/bin/containerd-shim-runc-v2 -namespace k8s.io -id b9ee9090243876f9d1de208638acc8def689fcf4c7f20054fb76eec06c2c54c4 -address /run/k3s/containerd/containerd.sock
└─4820 /var/lib/rancher/k3s/data/33f2f883e918543e89bba65177eafb6148f9fa38c07c61cf7ce6ae61c0f50a96/bin/containerd-shim-runc-v2 -namespace k8s.io -id 47be4174f17f2b517dde7c71d9cf9dd7a3ca31332b19f9b782af83cfe42a604a -address /run/k3s/containerd/containerd.sock
また、正しく動いていれば kubectl コマンドも通ります。
$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-server1 Ready control-plane,master 2m23s v1.23.6+k3s1
ワーカー(エージェント)ノードの追加 #
以後の作業を行うためにはサーバーノードのトークンが必要になります。
トークンは
公式ドキュメントにも書いてあるように /var/lib/rancher/k3s/server/node-token
にあります。
ワーカー(エージェント)ノードの追加は次のコマンドを実行します。
curl -sfL https://get.k3s.io | K3S_URL=https://<IP of first server>:6443 K3S_TOKEN="<token of first server>" sh -
ここまで完了すれば次のようにノードが追加されているはずです。
$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-agent1 Ready <none> 77s v1.23.6+k3s1
k3s-agent2 Ready <none> 69s v1.23.6+k3s1
k3s-server1 Ready control-plane,etcd,master 3h9m v1.23.6+k3s1
外部からクラスターにアクセスする #
公式ドキュメントに書いてあるとおりですが、次のようにすればよいです。
いずれのサーバーノードにある /etc/rancher/k3s/k3s.yaml
がアクセス用の設定ファイルです。
ファイルの中身は次のようになっています。
この内容を外部端末にコピーし、ループバックアドレスになっているサーバーの IP アドレスをいずれかのサーバーノードの IP アドレスに変更します。
その設定ファイルのパスを環境変数 KUBECONFIG
として保存すれば、以後 kubectl コマンドが通ります(kubectl は別途インストールしてください)。
$ sudo cat /etc/rancher/k3s/k3s.yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUyTVRNeE9UUTRNRFV3SGhjTk1qRXdNakV6TURVME1EQTFXaGNOTXpFd01qRXhNRFUwTURBMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUyTVRNeE9UUTRNRFV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRbnlyTUswVlpYeEswUmZCNm53UUEycmgzeVhvdzNrbGowQzI1NFpoOWwKWURKempma1RVNVlob2ZiTmR0dUJzaHhJRnhZdkV3dnd4MUhERnI5dWZ3WjVvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVYxNS8rNEx2SXF4ZXhjV1JBakJyCmdPcXRGa0V3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQVBIcFE3Ull6M0NuS3lVYWFJMG9FTVJvM3VtM2ZnQ2sKVVdISzNRZFljUEc2QWlFQW92TU1mc2xFZEhGQU0rcEhHL3JmQXh3UXFJYkh0ZnJuVnQ4a2lXOGdNb3M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://127.0.0.1:6443 ← ここを変更する
name: default
contexts:
- context:
cluster: default
user: default
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrakNDQVRlZ0F3SUJBZ0lJV3J1UTFXMHp4L1l3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOakV6TVRrME9EQTBNQjRYRFRJeE1ESXhNekExTkRBd05Gb1hEVEl5TURJeApNekExTkRBd05Gb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJQWHhMSjZRNzM4SUMvbGkKUHhOMklKUVVkN3hYVTJIV0dkTythZkljd25hVnplamJhYlhmVmFaaW1xcldRM2dhMy9hTDFBWlVFcmxxOHNLZgp3dytTVHdXalNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCU0N4Z0NTY0pxWkt4WUxTc0pMTnZ2SjdBWjR2REFLQmdncWhrak9QUVFEQWdOSkFEQkcKQWlFQTVNUFFPTDVGQm5FVkVmOWlsVXk1dS9VbWpVVFk3Nk03NW1KVW1UNWliYTRDSVFDWFluV2VOQm9VSWdXMAppU2ViazB2cWcvKzBPTk0rMWNnSG4zUzBjZmhxaVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCZURDQ0FSMmdBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwClpXNTBMV05oUURFMk1UTXhPVFE0TURRd0hoY05NakV3TWpFek1EVTBNREEwV2hjTk16RXdNakV4TURVME1EQTAKV2pBak1TRXdId1lEVlFRRERCaHJNM010WTJ4cFpXNTBMV05oUURFMk1UTXhPVFE0TURRd1dUQVRCZ2NxaGtqTwpQUUlCQmdncWhrak9QUU1CQndOQ0FBUndXYWRXMFlMaDl0dlJNOVBEVXhjdXJCNEhsQnJWYXhPWmNlUDAxSzgxCkxCbmZhczBTbzlOUnN0SzBRVy9JcitHQ0pqYUVmTjlwL1FrOGZOV1NsNGNYbzBJd1FEQU9CZ05WSFE4QkFmOEUKQkFNQ0FxUXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVnc1lBa25DYW1Tc1dDMHJDU3piNwp5ZXdHZUx3d0NnWUlLb1pJemowRUF3SURTUUF3UmdJaEFPSC9Xa0pmYXBIMFVFT1plZ0tPMFdxY3BnT0JrKy8vCjkxWkRPeURFVGJQcUFpRUFtYTZjazJUd0xVY1kwa1BHWHNvTCtYRlZRZ25scTNZQ0hYaUVHOHdBTTFrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU5LZGwrLzIycExBVCszY3dqRkpBdWVnaWVqK0ZlUXlJU0ZDQ25rUjRVTnJvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFOWZFc25wRHZmd2dMK1dJL0UzWWdsQlIzdkZkVFlkWVowNzVwOGh6Q2RwWE42TnRwdGQ5VgpwbUthcXRaRGVCcmY5b3ZVQmxRU3VXcnl3cC9ERDVKUEJRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=
K3s サーバーノードで sudo なしで kubectl コマンドを実行する #
なぜサーバーノードにおいて kubectl コマンドを実行する際に sudo
が必要になるか見てみます。
上述の /etc/rancher/k3s/k3s.yaml
の権限を見てみます。
$ ls -l /etc/rancher/k3s/k3s.yaml
-rw------- 1 root root 2957 May 8 21:31 /etc/rancher/k3s/k3s.yaml
ご覧のとおり、root 権限でしか開くことができないため、sudo
が必要になります。
このファイルの権限を変更してもよいですし、このファイルを任意の場所(例えば、~/.kube/
)にコピーし、ファイル権限を変更し、環境変数 KUBECONFIG
にコピーしたファイルのパスを設定しても、sudo
なしで kubectl
が実行できるようになります。
なお、セキュリティ面は一切考慮していませんので、各自の環境に合わせて設定してください。
K3s のアンインストール #
念のために K3s のアンインストール方法については 公式ドキュメントのこちらのページをご参照ください。
以上です。