Building a kubernetes cluster on raspberry pi using k3s
On a smaller raspberry pi where you don't have that much resources (usually 1-2 gb of ram) you don't have the resources to run a full fledged kubernetes cluster. There is a project for providing fully working lightweight kubernetes cluster using rancher's k3s.
Prerequisites
In order to be able to install k3s on raspberry pi you need one or more raspberry pi's, having raspberrian or ubuntu loaded up into the sdcard of the pi's. A fully working networking.
Installation
Installation of the k3s is fairly simple. Let's assume we have two raspberry pi's working as two different nodes. One that will be the manager and the other the worker node of our cluster (I was told that it is politically incorrect to use the terminology master and slaves). First of all you need to make sure that you have these two option added to /boot/firmware/cmdline.txt
cgroup_enable=memory cgroup_memory=1
:
# cat /boot/firmware/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc quiet splash cgroup_enable=memory cgroup_memory=1
Once you added the options reboot your pi's to activate the options.
On the master you will be running the following command line:
#curl -sfL https://get.k3s.io | sh -
[INFO] Finding release for channel stable
[INFO] Using v1.20.4+k3s1 as release
[INFO] Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.20.4+k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.20.4+k3s1/k3s
[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] systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO] systemd: Starting k3s
After a short while if you are running the kubectl get nodes
you'll end up with something like this:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
manager Ready control-plane,master 4m46s v1.20.4+k3s1
Now it's time to install the slave. For this we need to look into the /var/lib/rancher/k3s/server/node-token
and copy the node token from the file:
# cat /var/lib/rancher/k3s/server/node-token
K1073b3f02527159c80edf837727ae35cde5169707a7be0ecc91ca5a852e1e2c76f::server:c86cf36c0577ece1ef6d2cf072ece1c4
Now login to each of the worker nodes and run the following commands:
# curl -sfL https://get.k3s.io | K3S_URL=https://<manager ip address>:6443 K3S_TOKEN=K1073b3f02527159c80edf837727ae35cde5169707a7be0ecc91ca5a852e1e2c76f::server:c86cf36c0577ece1ef6d2cf072ece1c4 sh -
[INFO] Finding release for channel stable
[INFO] Using v1.20.4+k3s1 as release
[INFO] Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.20.4+k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.20.4+k3s1/k3s
[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-agent-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO] systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
[INFO] systemd: Starting k3s-agent
Again after a few minutes if you run kubect get nodes
on the manager you will see both nodes in Ready
state:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
manager Ready control-plane,master 4m46s v1.20.4+k3s1
worker Ready 4m10s. v1.20.4+k3s1
Now your kubernetes cluster is ready to be used. The previous commands are working on most of the linux environments not only on raspberry pi's. Therefore you can create a small kubernetes cluster on small virtual machines with not a whole bunch of resources.