K3s installation on a Raspberry Pi

k3s raspberry raspberry pi cgroups

4 min read | by Jordi Prats

To install k3s on a Raspberry Pi looks quite straight forward but it has it's nuisances.

Installing k3s should be a single line command:

# curl -sfL https://get.k3s.io | sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.18.9+k3s1 as release
[INFO]  Downloading hash https://github.com/rancher/k3s/releases/download/v1.18.9+k3s1/sha256sum-arm.txt
[INFO]  Downloading binary https://github.com/rancher/k3s/releases/download/v1.18.9+k3s1/k3s-armhf
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[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]  systemd: Starting k3s

So far looks like everything should be just fine, but if you check the k3s status using systemctl you will realize it refuses to start:

# systemctl status k3s
● k3s.service - Lightweight Kubernetes
   Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Tue 2020-10-13 19:38:00 BST; 4s ago
     Docs: https://k3s.io
  Process: 2107 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
  Process: 2108 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
  Process: 2109 ExecStart=/usr/local/bin/k3s server (code=exited, status=1/FAILURE)
 Main PID: 2109 (code=exited, status=1/FAILURE)

You will have to start k3s manually to be able to get a helpful error message:

# /usr/local/bin/k3s server --no-deploy servicelb --no-deploy traefik
ERRO[2020-10-13T19:40:58.690824994+01:00] Failed to find memory cgroup, you may need to add "cgroup_memory=1 cgroup_enable=memory" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi) 
FATA[2020-10-13T19:40:58.691126492+01:00] failed to find memory cgroup, you may need to add "cgroup_memory=1 cgroup_enable=memory" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi) 

You can check that memory cgroups are disabled by looking for "memory" on /proc/cgroups:

$ cat /proc/cgroups 
#subsys_name  hierarchy num_cgroups enabled
(...)
memory  0 87  0
(...)

The last column tells us whether it is enabled or not. We will have to add "cgroup_memory=1 cgroup_enable=memory" to the cmdline.txt and reboot the system.

Afterwards, we can check again this file to make sure everything if good to go:

$ cat memory /proc/cgroups 
#subsys_name  hierarchy num_cgroups enabled
(...)
memory  8 186 1
(...)

Once enabled, k3s will start on boot:

$ kubectl get nodes
NAME                                 STATUS   ROLES    AGE   VERSION
datalore.lolcathost.systemadmin.es   Ready    master   59d   v1.18.9+k3s1

Update: A while ago, I created a pull request (PR-2379) to k3s adding an installation hint for the issue explained on this post, since it got merged now you'll see the following instead:

root@rpi-n01:~# curl -sfL https://get.k3s.io | sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.21.4+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.21.4+k3s1/sha256sum-arm64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.21.4+k3s1/k3s-arm64
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[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]  Failed to find memory cgroup, you may need to add "cgroup_memory=1 cgroup_enable=memory" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi)
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service  /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s
Job for k3s.service failed because the control process exited with error code.
See "systemctl status k3s.service" and "journalctl -xe" for details.

Posted on 20/12/2020