Kubernetes Dashboard es una interfaz web para consultar y gestionar los recursos de un clúster: cargas de trabajo, Services, volúmenes, logs de los pods y eventos. En este tutorial lo instalarás con Helm, crearás una cuenta de administrador y otra de solo lectura con RBAC, generarás tokens para iniciar sesión y accederás al panel de forma segura mediante un reenvío de puertos y un túnel SSH, sin exponerlo a Internet.

Requisitos previos

  • Un clúster de Kubernetes en funcionamiento (por ejemplo K3s o MicroK8s sobre un VPS de CubePath con Ubuntu 24.04) y kubectl configurado con permisos de administrador.
  • Un usuario no root con privilegios sudo en el servidor desde el que ejecutas kubectl.
  • Acceso SSH a ese servidor desde tu equipo.
  • metrics-server instalado si quieres ver gráficas de CPU y memoria en el panel (K3s lo incluye de serie).

Paso 1: Instalar Helm

Desde la versión 7 del chart, Kubernetes Dashboard solo se distribuye como chart de Helm, porque se compone de varios servicios (API, autenticación, interfaz web, recolector de métricas y un proxy Kong). Instala Helm con su snap oficial:

sudo snap install helm --classic

Comprueba la versión:

helm version --short

La salida muestra la versión instalada, por ejemplo v3.x.x o v4.x.x. El chart del panel funciona con ambas.

Paso 2: Instalar Kubernetes Dashboard

Añade el repositorio del chart y actualiza el índice:

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

Instala el chart en su propio namespace. upgrade --install sirve tanto para la primera instalación como para actualizaciones posteriores:

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

Espera a que todos los pods estén en Running:

kubectl -n kubernetes-dashboard get pods
NAME                                                    READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-api-5f65f8c9d4-7xk2n               1/1     Running   0          60s
kubernetes-dashboard-auth-7c4f8b6d9-q2lrm               1/1     Running   0          60s
kubernetes-dashboard-kong-79867c9c48-hn8vw              1/1     Running   0          60s
kubernetes-dashboard-metrics-scraper-5c6c5f9b4-t9pdz    1/1     Running   0          60s
kubernetes-dashboard-web-6b8d7c5f7-rjx4c                1/1     Running   0          60s

El punto de entrada es el Service kubernetes-dashboard-kong-proxy, de tipo ClusterIP, así que el panel no es accesible desde fuera del clúster. Compruébalo:

kubectl -n kubernetes-dashboard get svc kubernetes-dashboard-kong-proxy
NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard-kong-proxy   ClusterIP   10.43.51.210   <none>        443/TCP   2m

Paso 3: Crear una cuenta de administrador

El panel no tiene usuarios propios: inicias sesión con un token de una ServiceAccount de Kubernetes y ves lo que permitan sus roles RBAC. Crea una ServiceAccount con el rol cluster-admin:

nano dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: admin-user
    namespace: kubernetes-dashboard
kubectl apply -f dashboard-admin.yaml

Comprueba que la cuenta tiene los permisos esperados:

kubectl auth can-i delete pods --all-namespaces --as=system:serviceaccount:kubernetes-dashboard:admin-user
yes

Paso 4: Crear una cuenta de solo lectura

Kubernetes incluye el ClusterRole view, que permite leer la mayoría de recursos pero no modificarlos ni leer Secrets. Es más seguro reutilizarlo que escribir un rol propio:

nano dashboard-viewer.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: viewer-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-viewer-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
  - kind: ServiceAccount
    name: viewer-user
    namespace: kubernetes-dashboard
kubectl apply -f dashboard-viewer.yaml

Verifica que puede listar pods pero no borrarlos:

kubectl auth can-i list pods -A --as=system:serviceaccount:kubernetes-dashboard:viewer-user
kubectl auth can-i delete pods -A --as=system:serviceaccount:kubernetes-dashboard:viewer-user
yes
no

Si quieres limitar a alguien a un solo namespace, usa un RoleBinding en ese namespace (en lugar de un ClusterRoleBinding) que apunte al ClusterRole view o edit. En ese caso, en el panel tendrá que seleccionar su namespace en el desplegable superior, porque no podrá listar los demás.

Paso 5: Generar un token de acceso

Genera un token temporal para la cuenta de administrador. Por defecto caduca en una hora; con --duration puedes ajustarlo:

kubectl -n kubernetes-dashboard create token admin-user --duration=8h
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik...

Copia el token completo; lo pegarás en la pantalla de inicio de sesión. Los tokens temporales son la opción recomendada, porque dejan de funcionar solos. Si necesitas un token que no caduque, por ejemplo para una herramienta interna, crea un Secret vinculado a la ServiceAccount:

nano admin-user-token.yaml
apiVersion: v1
kind: Secret
metadata:
  name: admin-user-token
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token
kubectl apply -f admin-user-token.yaml
kubectl -n kubernetes-dashboard get secret admin-user-token -o jsonpath='{.data.token}' | base64 -d; echo

Este token es válido hasta que borres el Secret, así que trátalo como una contraseña de administrador y revócalo con kubectl -n kubernetes-dashboard delete secret admin-user-token cuando ya no lo necesites.

Paso 6: Acceder al panel de forma segura

En el servidor donde ejecutas kubectl, reenvía un puerto local al proxy del panel. Por defecto kubectl port-forward solo escucha en 127.0.0.1, de modo que no queda expuesto:

kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
Forwarding from 127.0.0.1:8443 -> 8443
Forwarding from [::1]:8443 -> 8443

Deja ese comando en ejecución. Desde tu equipo, abre un túnel SSH que lleve tu puerto 8443 al puerto 8443 del servidor:

ssh -L 8443:localhost:8443 your_user@your_server_ip

Abre https://localhost:8443 en el navegador de tu equipo. El panel usa un certificado autofirmado, así que el navegador mostrará un aviso: acéptalo para continuar. En la pantalla de inicio de sesión, pega el token del paso anterior y pulsa Sign in.

Si tienes kubectl y el kubeconfig del clúster en tu propio equipo, puedes saltarte el túnel y ejecutar el port-forward directamente en local.

Paso 7: Usar el panel

Una vez dentro, las secciones principales del menú lateral son:

  • Workloads: Deployments, Pods, StatefulSets, DaemonSets, Jobs y CronJobs. Desde un pod puedes ver sus logs y abrir una shell con el botón Exec.
  • Service: Services e Ingresses.
  • Config and Storage: ConfigMaps, Secrets y PersistentVolumeClaims.
  • Cluster: nodos, namespaces, roles y eventos.

Con la cuenta viewer-user los botones de edición y borrado devolverán errores de permisos, lo que confirma que RBAC funciona.

Solución de problemas

Algún pod no arranca. Revisa sus eventos y logs:

kubectl -n kubernetes-dashboard describe pod nombre_del_pod
kubectl -n kubernetes-dashboard logs nombre_del_pod

El panel muestra Unauthorized o vuelve a la pantalla de inicio. El token ha caducado o se copió incompleto. Genera uno nuevo con kubectl create token.

Se ve el panel pero aparecen errores forbidden en todas las secciones. La ServiceAccount no tiene permisos suficientes. Compruébalo con kubectl auth can-i --list --as=system:serviceaccount:kubernetes-dashboard:nombre_de_la_cuenta.

No aparecen gráficas de CPU y memoria. Falta metrics-server o aún no ha recogido datos. Verifica que kubectl top nodes responde.

Conclusión

Has instalado Kubernetes Dashboard con Helm, creado cuentas de administrador y de solo lectura con RBAC, generado tokens y accedido al panel sin exponerlo a Internet. Como siguientes pasos, crea cuentas limitadas a namespaces para cada equipo, actualiza el chart periódicamente con helm repo update y helm upgrade, y evalúa migrar a Headlamp, que sigue mantenido y admite extensiones.