K3s のインストール手順

このページには Raspberry Pi を使った k3s の最低限のインストール方法について書いてあります。

クラスター構成 #

次の Raspberry Pi 4B を3台使って k3s クラスターを構築します。次のような構成です。

ServerAgent
HardwareRaspberry Pi 4B x 1台Raspberry Pi 4B x 2台
OSRaspberry 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.txtcgroup_memory=1 cgroup_enable=memory と行末に追加すればよいです。 なお、Ubuntu の場合、対象のファイルが異なり、/boot/firmware/cmdline.txtcgroup_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 のアンインストール方法については 公式ドキュメントのこちらのページをご参照ください。

以上です。