A quick guide for Kubernetes on a Raspberry Pi (3, 3B, 4) cluster

raspberry pi Mar 15, 2020

While there are many guides on creating a cluster with Kubernetes there are less on how to create one with Raspberry Pi's (arm architecture) and even less for novices that explain in an easy way what to keep in mind when doing this.

When I started with this project I knew next to nothing about Kubernetes and what lies behind it. In this article, I will not go deeper into the material than setting it up correctly and deploying an example container (GitLab runner) from Docker hub.


  • Raspberry Pi (at least 2GB RAM is recommended for the master so go for RPi 4)

A quick overview of Kubernetes and the used programs

  • kubeadm - master command for the cluster
  • kubelet - this runs the containers
  • kubectl - utility to control the cluster
  • flannel - overlay network for network configuration

Installing kubeadm, kubelet and kubectl

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

Initialize kubeadm (on master node only)

kubeadm init --apiserver-cert-extra-sans=<local ip of master node> --service-cidr --pod-network-cidr=

After initialization it will give you a command to join the cluster which shall be executed on all slave nodes. It will look something like this:

kubeadm join --token kgr932f.g3j3i453ji0t34 \
--discovery-token-ca-cert-hash sha256:f9i3fh39hf04h93iuh43g4jih3g4oiho3g4

Copy configuration

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Install Flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml

Example container - gitlab runner

apiVersion: extensions/v1beta1
kind: Deployment
name: gitlab-runner-arm
replicas: 4
        arch: arm
        - image: bostrot/gitlab-runner:latest
        name: gitlab-runner-arm
#          volumeMounts:
#          - mountPath: /etc/gitlab-runner
#            name: gitlab-etc
#          - mountPath: /home/gitlab-runner
#            name: gitlab-home
            - name: registrationToken
            value: <token>
            - name: description
            value: <cluster name>
#      volumes:
#        - name: gitlab-etc
#          emptyDir: {}
#        - name: gitlab-home
#          emptyDir: {}

Now you can create the container with kubectl apply -f runner.yml. You can shut it down with kubectl delete -f runner.yml.


Installing kubeadm, kubelet and kubectl - https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl (last visited Mar. 15, 2020)
The Kubernetes network model - https://kubernetes.io/docs/concepts/cluster-administration/networking/ (last visited Mar. 15, 2020)


Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.