Skip to main content

K3s Kubernetes

Portainer/ UI

Why Portainer?

Although there are more the few UI managers for Kubernetes, Portainer is the easiest to setup on our Raspberry Pi 4 Kubernetes cluster. Core features are free and for our local use is more than enough. Although the one business feature I would like to have in free version is the ability to browse docker registry. If you have up to 5 node cluster, you can actually get Portainer business version for free, not sure if this is temporary action or not. I'm not sponsored by them (But guys, if you are reading this and want to sponsor me I will not say "no" to you). Look at the Portainer website for more info.

How to install Portainer

I have decided not to use HTTPS for accessing the UI, I will be using it only internally with no access to internet or such. HTTP will be just fine. To enable HTTPS look at the installation guide with helm version here: Official Installation Guide.

If you build the k3s Kubernetes cluster on your Raspberry Pi 4 with DietPi with me using this guide, you should have all prerequisites installed and ready.

Mostly it needs helm and storage class (in our case Longhorn) installed. It will eat 10 GB of space from storage.

Install using helm (as root from control node):

helm repo add portainer
helm repo update

helm install --create-namespace -n portainer portainer portainer/portainer

It should not take long and deploy single deployment with one container:

root@control01:~# kubectl get pods -n portainer
NAME                         READY   STATUS    RESTARTS   AGE
portainer-685c4f4bfc-p7znm   1/1     Running   0          2m27s

# See, it took 10 GB of space from storage.
root@control01:~# kubectl get pvc -n portainer
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
portainer   Bound    pvc-7f60d68b-911d-4119-a239-bb87bbf06599   10Gi       RWO            longhorn       3m23s

Next I have created service to expose our Portainer UI on its own IP address. Create folder called portainer and put the svc.yaml file there:

apiVersion: v1
kind: Service
  name: portainer
  namespace: portainer
  selector: portainer portainer
  type: LoadBalancer
    - name: http
      protocol: TCP
      port: 9000
      targetPort: 9000

Apply the service:

kubectl create -f svc.yaml

This will make the UI accessible on

Login to Portainer

When you try to log in to the Portainer for the first time, and you took too much time, the UI will time out with this message: "Your Portainer Instance timed out for security purposes."

You need to restart the deployment. Restarting in Kubernetes is a bit tricky, here is a guide how to do it. We need to scale the container to 0, then scale it back to 1.

root@control01:~/portainer# kubectl get deployments -n portainer
portainer   1/1     1            1           15m

root@control01:~/portainer# kubectl scale --replicas=0 deployment portainer -n portainer

root@control01:~/portainer# kubectl get deployments -n portainer
portainer   0/0     0            0           15m

kubectl scale --replicas=1 deployment portainer -n portainer

After that try to log in again, you should get this screen:

Create new user and set password.

On the next screen, we will tell Portainer to use our Local environment. This will connect it to our k3s cluster.

You should see your k3s cluster in the list.

Portainer and local registry

Next jump down on the menu and click on "Registries" tab and "Add registry".

We will add our local docker registry to the list.


That's it, you can now manage almost everything from this UI going further. Look at the Portainer documentation for more info. Portainer documentation.

Another solid part of our cluster is done, get some drinks and enjoy your k3s cluster.