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.
Notael proyecto Kubernetes Dashboard ha sido archivado por sus mantenedores y ya no recibe nuevas versiones ni parches de seguridad. SIG UI recomienda Headlamp como alternativa. Puedes seguir esta guía para clústeres de laboratorio o donde ya lo uses, pero para instalaciones nuevas en producción valora Headlamp.
Requisitos previos
- Un clúster de Kubernetes en funcionamiento (por ejemplo K3s o MicroK8s sobre un VPS de CubePath con Ubuntu 24.04) y
kubectlconfigurado con permisos de administrador. - Un usuario no root con privilegios
sudoen el servidor desde el que ejecutaskubectl. - 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
Advertencia
cluster-admintiene control total sobre el clúster. Usa esta cuenta solo para administración y reparte entre tu equipo cuentas con menos privilegios, como la del paso siguiente.
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.
Importanteno publiques el panel con un Service
NodePortoLoadBalancer, ni con un Ingress abierto a Internet. Cualquiera que obtenga un token podría gestionar el clúster. Si necesitas acceso web permanente, ponlo detrás de una VPN o de un proxy con autenticación.
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.
