Installing Kubernetes Dashboard on a K3s High Availability Cluster (Ubuntu 24.04)

The Kubernetes Dashboard is a browser-based UI that allows you to visualize, manage, and troubleshoot workloads and resources inside your Kubernetes cluster. In this guide, we will deploy the Dashboard on a K3s High Availability (HA) cluster that is already running successfully on three Ubuntu 24.04 control-plane nodes.

This tutorial assumes:

  • You already have a working K3s HA cluster
  • All commands are executed on the primary node (CP1) unless otherwise specified
  • You have kubectl and helm available from cp1 via K3s installation

If your cluster is not yet installed, refer to the K3s HA installation guide first.

Step 1: Install Helm (if not already installed)

Helm is required because Kubernetes Dashboard now supports only Helm-based installation.

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Verify installation:

helm version

Step 2: Add Kubernetes Dashboard Helm Repository

helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm repo update

Step 3: Deploy Kubernetes Dashboard

helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \
  --namespace kubernetes-dashboard \
  --create-namespace

This will install:

  • Dashboard UI
  • Kong proxy for secure access
  • Required RBAC components

To verify the deployment:

kubectl -n kubernetes-dashboard get pods

The Dashboard components should show status as Running.

Step 4: Expose the Dashboard for External Access

K3s does not provide LoadBalancer services by default for Metal deployments. To enable external access temporarily:

kubectl -n kubernetes-dashboard patch svc kubernetes-dashboard-kong-proxy \
  -p '{"spec":{"type":"NodePort"}}'

Check assigned NodePort:

kubectl -n kubernetes-dashboard get svc kubernetes-dashboard-kong-proxy

Example output:

kubernetes-dashboard-kong-proxy   NodePort   10.43.190.83   <none>   443:31443/TCP   1m

Meaning:

  • UI can be accessed via any control-plane node IP
  • Port: 31443

Open in browser:

https://<ANY_CP_NODE_IP>:31443

Example for our setup:

https://10.11.12.11:31443

Your browser will show an untrusted certificate warning – proceed anyway.

Step 5: Create a Service Account for Login

By default, Dashboard requires a token authentication.

Create the YAML file:

cat <<EOF | sudo tee dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

Apply it:

kubectl apply -f dashboard-admin.yaml

Step 6: Retrieve Login Token

kubectl -n kubernetes-dashboard create token admin-user

Copy the output token and paste it into the Dashboard login page:

  • Authentication Method: Bearer Token

You will now access the UI with full admin privileges.

Optional: Secure Access Using Reverse Proxy Manager

Since we have Nginx Proxy Manager, we can:

  • Bind a clean domain like
    https://k8s.syncbricks.com
  • Enable proper SSL certificate (LetsEncrypt)
  • Protect Dashboard behind authentication

This improves usability and security for daily operations.

(A full configuration guide will be published in part 3 of this series.)

Dashboard Installed Successfully

You can now:

  • View, scale, restart applications
  • Monitor nodes, pods, workloads, jobs
  • Deploy new apps using UI

Leave a Comment