--- title: "Cómo instalar Kubernetes Dashboard con Helm y acceso seguro" description: "Instala Kubernetes Dashboard con Helm, crea cuentas de administrador y de solo lectura con RBAC, genera tokens de acceso y entra al panel por un túnel SSH." category: "Kubernetes Avanzado" language: es source: https://cubepath.com/es/docs/kubernetes-avanzado/instalacion-del-panel-de-control-de-kubernetes updated: 2026-09-25 --- # Cómo instalar Kubernetes Dashboard con Helm y acceso seguro 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. > Nota: el 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 `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: ```bash sudo snap install helm --classic ``` Comprueba la versión: ```bash 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: ```bash 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: ```bash helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \ --create-namespace --namespace kubernetes-dashboard ``` Espera a que todos los pods estén en `Running`: ```bash kubectl -n kubernetes-dashboard get pods ``` ```output 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: ```bash kubectl -n kubernetes-dashboard get svc kubernetes-dashboard-kong-proxy ``` ```output NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-dashboard-kong-proxy ClusterIP 10.43.51.210 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`: ```bash nano dashboard-admin.yaml ``` ```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 ``` ```bash kubectl apply -f dashboard-admin.yaml ``` Comprueba que la cuenta tiene los permisos esperados: ```bash kubectl auth can-i delete pods --all-namespaces --as=system:serviceaccount:kubernetes-dashboard:admin-user ``` ```output yes ``` > Advertencia: `cluster-admin` tiene 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: ```bash nano dashboard-viewer.yaml ``` ```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 ``` ```bash kubectl apply -f dashboard-viewer.yaml ``` Verifica que puede listar pods pero no borrarlos: ```bash 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 ``` ```output 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: ```bash kubectl -n kubernetes-dashboard create token admin-user --duration=8h ``` ```output 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: ```bash nano admin-user-token.yaml ``` ```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 ``` ```bash 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: ```bash kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443 ``` ```output 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: ```bash 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. > Importante: no publiques el panel con un Service `NodePort` o `LoadBalancer`, 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: ```bash 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.