David's Tech Blog

Ramblings of a random Irish nerd.

01 Jan 2020

Deploying Kubernetes to a Raspberry Pi

The Raspberry Pi 4 is revolutionary. It is the perfect balance between power and affordability.

However, as with most electronics impulse-buys, I've had difficulty putting it to good use. I thought I'd bring up a kubernetes cluster to host my personal blog(this). There will be a series of posts related to that, this being the first.

There are a few lightweight kubernetes offerings around these days. microk8s was one I tried, but shortly after k3s appeared on the scene. It was impressive that it requires nearly no system level dependencies (microk8s requires snap).

One decision k8s made that I don't prefer is the use of the traefik ingress controller. I prefer the ingress-nginx controller, but it's not that difficult to switch one out for the other.

K3S Install

I'm assuming that you have a Raspberry Pi booted with some sane Linux distro. I prefer Arch for Arm. And also that you have docker installed and running.

Then, initiate the super simple k3s install script with particular options.

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=" --no-deploy=traefik --docker" sh -s -

The --no-deploy=traefik instructs the installer to skip the in-built traefik install, the --docker instructs k3s to use plain docker instead of the newer containerd. I prefer it because it fits in with my workflows. If you have a super simple setup you can likely omit this option and stick with containerd.

After the cluster is bootstrapped, you should have a functioning cluster, try executing kubectl get pods --all-namespaces. You should see familiar pods like coredns.

Nginx Ingress Install

Now, this is the most infuriating thing about Kubernetes on ARM. All setup guides and a vast majority of examples assume you're running amd64 hardware, so most new users will be puzzled why they're getting CrashLoopBackoff on their pods. Will this is because your little Raspberry Pi is trying to execute binaries that are built to run on your Intel Desktop. You can likely see log messages like invalid exec format or similar.

Some of the time you'll be lucky and the project in question will have arm images available, but more likely than not you will have to build arm images yourself.

Gotcha: Although the Raspberry Pi 4 is 64bit capable, most distros for it are still 32bit. Watch out for arm64 images that wont run.

Fortunately the ingress-nginx project has an arm build that we can use, however the default manifests from the setup guide use amd64

For this reason I created a new repo that has manifests that are ready to go on a Raspberry Pi.

You can install the nginx ingress controller by issuing the following commands:

kubectl apply -f https://raw.githubusercontent.com/dmarkey/kube-rpi/master/ingress-nginx/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/dmarkey/kube-rpi/master/ingress-nginx/cloud-generic.yaml

This should bring up a single replica deployment, also with k3s, it will bring up a small pod that acts as a load balancer to forward traffic, you should get an nginx 404 page when going to your Raspberry Pi's IP address.

At this point you're ready to install some apps and get the ingress controller to forward some traffic.

comments powered by Disqus