Pruébalo en local en 15 minutos¶
¿Tu empresa ya tiene kubelatch?
No necesitas este tutorial: ve a Entrar y pedir acceso.
En este tutorial montas kubelatch en tu máquina con un cluster kind desechable. Te darás un permiso, usarás kubectl a través de kubelatch, verás cada petición en la auditoría y revocarás la credencial. Todo con contraseñas locales, sin GitHub.
Tardarás unos 15 minutos, más las descargas de la primera vez (dependencias de Go y Node, la imagen de Postgres y la del nodo de kind).
Antes de empezar¶
| Herramienta | Versión | Para qué |
|---|---|---|
| Go | 1.26 o superior | Compilar kubelatch |
| Node.js | 22.22 o superior | Construir la interfaz web |
| Docker con Compose | Reciente | Postgres y el cluster kind |
| kind | 0.24 o superior | El cluster de prueba. kind 0.20 crea Kubernetes 1.27, demasiado antiguo |
| kubectl | 1.31 o superior | Hablar con el cluster |
| git, make y openssl | Cualquiera | Clonar, compilar y generar el certificado de prueba |
Comprueba las versiones con go version, node --version, kind version y kubectl version --client.
Vas a usar dos terminales, las dos en la raíz del repositorio. En la terminal 1 corre kubelatch; todo lo demás va en la terminal 2, en la misma sesión de shell, porque los pasos reutilizan variables.
Tu ~/.kube/config no se toca
Si tu ~/.kube/config apunta a clusters reales, un kubectl a secas copiado de aquí actuaría sobre ellos. Por eso cada kubectl de este tutorial lleva --kubeconfig con un fichero del propio repositorio. No ejecutes kubectl sin él ni kubectl config use-context mientras lo sigues.
1. Clona el repositorio¶
git clone <url-del-repo> kubelatch && cd kubelatch # la URL te la da el equipo que mantiene kubelatch
cp .env.example .env
.env trae la configuración de desarrollo: Postgres en 127.0.0.1:5433 y una clave de cifrado de 32 bytes a cero. Nunca uses esos valores en un entorno real.
2. Arranca Postgres¶
make dev-db
Levanta un Postgres 17 en Docker que escucha solo en 127.0.0.1:5433, para no chocar con un Postgres local en el 5432. Los datos se guardan en un volumen de Docker.
3. Construye la interfaz web¶
make web
Instala las dependencias de la interfaz y la construye en web/dist. El binario de kubelatch la embebe al compilar, así que hazlo antes del siguiente paso.
4. Arranca kubelatch con TLS¶
En la terminal 1:
make dev-tls
Compila bin/kubelatch, genera un certificado autofirmado en .dev/tls/ y deja kubelatch escuchando en https://localhost:8443, con los logs en JSON. Hace falta HTTPS porque kubectl solo envía tokens por HTTPS. Déjalo corriendo.
Comprueba que responde desde la terminal 2:
curl --cacert .dev/tls/server.crt https://localhost:8443/readyz # ok
5. Crea el primer administrador¶
En la terminal 2. La CLI lee las mismas variables que el servidor:
set -a && . ./.env && set +a
bin/kubelatch user create admin --admin --display-name "Admin"
Te pide la contraseña dos veces, sin eco (Password: y Repeat password:). Debe tener al menos 12 caracteres. Termina con user admin created (id …, admin=true, break_glass=false).
6. Entra en la interfaz¶
Abre https://localhost:8443 en el navegador. Te avisará de que el certificado no es de confianza: es el autofirmado del paso 4, acéptalo para esta prueba.
Escribe admin en «Usuario», tu contraseña en «Contraseña» y pulsa «Entrar». Verás «Hola, Admin» y el menú: «Inicio», «Mi cuenta», «Clusters», «Permisos», «Credenciales», «CI», «Auditoría» y «Usuarios».
Usa localhost tal cual, no 127.0.0.1: kubelatch solo acepta peticiones de la interfaz desde su propia URL.
7. Crea el cluster kind¶
e2e/kind.sh up
KIND_KC="$PWD/e2e/.kind/admin.kubeconfig"
kubectl --kubeconfig "$KIND_KC" get pods
El script crea el cluster kubelatch-e2e en medio minuto y escribe su kubeconfig de administrador en e2e/.kind/admin.kubeconfig, nunca en ~/.kube/config. También arranca dos pods de prueba en default: web y ticker. get pods los muestra en Running.
e2e/kind.sh usa ~/.local/bin/kind y ~/.local/bin/kubectl si existen y, si no, los del PATH. Para usar otros: KIND=/ruta/a/kind KUBECTL=/ruta/a/kubectl e2e/kind.sh up.
Ahora marca el namespace default con Pod Security Admission baseline:
kubectl --kubeconfig "$KIND_KC" label namespace default pod-security.kubernetes.io/enforce=baseline
Lo necesitas porque en el paso 9 te darás el nivel debugger, que kubelatch solo concede en namespaces que aplican PSA baseline o restricted. Niveles de permiso explica por qué.
8. Registra el cluster en kubelatch¶
kubelatch necesita dos ServiceAccounts en cada cluster: una para reenviar tus peticiones y otra para mantener el RBAC. Registrar el cluster las crea y le pasa sus tokens a kubelatch.
-
Ve a «Clusters». Escribe
kinden «Identificador (slug, va en la URL del proxy)» ykind localen «Nombre», y pulsa «Registrar». El cluster aparece como «Sin tokens» y se abre el diálogo «Bootstrap de kind local». -
Pulsa «descargar bootstrap.yaml». El navegador guarda
kubelatch-bootstrap-kind.yaml. Aplícalo al cluster kind, cambiando la ruta si tu navegador descarga en otra carpeta:kubectl --kubeconfig "$KIND_KC" apply -f ~/Descargas/kubelatch-bootstrap-kind.yamlCrea el namespace
kubelatch-systemy las dos ServiceAccounts, con permisos mínimos. -
Pulsa «Copiar» junto a «One-liner» y ejecútalo así, pegándolo en lugar de
<one-liner>:( export KUBECONFIG="$KIND_KC"; <one-liner> )El one-liner usa el contexto actual de kubectl. El
exportdentro de los paréntesis lo fija al cluster kind solo para esa subshell, sin tocar tu sesión ni~/.kube/config. Imprime una línea de JSON:{"server":"https://127.0.0.1:…","ca":"…","proxyToken":"…","reconcilerToken":"…"}. -
Copia esa línea entera, pégala en «JSON de los tokens» y pulsa «Guardar tokens».
kubelatch valida los tokens contra el cluster, los guarda cifrados y hace la primera reconciliación. El diálogo se cierra y el cluster pasa a «Listo», con la versión de Kubernetes bajo la URL. «Última reconciliación» muestra — hasta que termina esa primera pasada: recarga la página y verás la fecha. Si pulsas «Namespaces», default aparece con PSA baseline.
Si cerraste el diálogo antes de tiempo, «Bootstrap y tokens» lo vuelve a abrir.
9. Date un permiso¶
Ser administrador de kubelatch no da acceso a los clusters: tú también necesitas un permiso.
- Ve a «Permisos».
- Elige
admin (Admin)en «Sujeto»,kinden «Cluster»,vieweren «Nivel» ydefault (PSA baseline)en «Ámbito». Deja «Expira» vacío y pulsa «Conceder». - Repite con
debuggeren «Nivel».
La tabla muestra los dos permisos en estado «Activo». viewer te deja leer casi todo en default salvo los secrets; debugger añade exec, attach y port-forward. En uno o dos segundos kubelatch crea en el cluster los RoleBindings correspondientes.
10. Emite tu credencial¶
- Ve a «Inicio». En «Mis accesos» aparecen tus dos permisos, cada uno con su grupo:
kubelatch:ns:default:viewerykubelatch:ns:default:debugger. - En «Mis credenciales», escribe
tutorialen «Nombre». Deja «Duración» en «7 días» y «Cluster» en «Todos los que tenga permitidos». Pulsa «Emitir credencial». - Se abre «Credencial emitida» con el token y el kubeconfig. Solo se muestran esta vez. Pulsa «Descargar kubeconfig»: el navegador guarda
kubelatch-tutorial.yaml.
Guárdalo en un fichero aparte, dentro de .dev/ (git lo ignora), y añádele el certificado autofirmado:
mv ~/Descargas/kubelatch-tutorial.yaml .dev/tutorial.kubeconfig
KL_KC="$PWD/.dev/tutorial.kubeconfig"
kubectl --kubeconfig "$KL_KC" config set-cluster kind --certificate-authority="$PWD/.dev/tls/server.crt" --embed-certs=true
El kubeconfig que emite kubelatch no lleva CA, porque en un despliegue real kubelatch sirve un certificado público (o una CA privada con KUBELATCH_KUBECONFIG_CA). set-cluster solo modifica ese fichero.
11. Usa kubectl a través de kubelatch¶
kubectl --kubeconfig "$KL_KC" auth whoami
kubectl --kubeconfig "$KL_KC" get pods
kubectl --kubeconfig "$KL_KC" exec web -- sh -c 'echo hola'
ATTRIBUTE VALUE
Username user:admin
UID 35b57553-…
Groups [kubelatch:ns:default:debugger kubelatch:ns:default:viewer system:authenticated]
NAME READY STATUS RESTARTS AGE
ticker 1/1 Running 0 3m
web 1/1 Running 0 3m
hola
Cada petición llega a kubelatch con tu token. kubelatch comprueba que la credencial vale, la registra y la reenvía al cluster con impersonación: actúa como user:admin con los grupos de tus permisos. El cluster decide con su RBAC. El viaje de una petición lo cuenta paso a paso.
12. Prueba algo que no puedes hacer¶
kubectl --kubeconfig "$KL_KC" get secrets
Error from server (Forbidden): secrets is forbidden: User "user:admin" cannot list resource "secrets" in API group "" in the namespace "default"
viewer no incluye los secrets y debugger tampoco. Es el propio cluster el que responde 403: kubelatch solo le dice quién eres.
13. Míralo en la auditoría¶
- En «Inicio», «Mi actividad» lista cada petición hecha con tus credenciales:
createdeselfsubjectreviews(elwhoami),listdepods (default)con200,execdepods/exec web (default)con101ylistdesecrets (default)con403. - Pulsa la fecha de una fila para ver el «Detalle de la petición»: el «Audit-ID» (el mismo que recibe el cluster), los «Grupos suplantados», la IP y el User-Agent.
- En «Auditoría», la pestaña «Peticiones a los clusters» muestra lo mismo para todos los sujetos, con filtros. La pestaña «Plano de control» muestra lo que hiciste en la interfaz:
user.create,cluster.create,cluster.tokens,grant.create,credential.issue…
14. Revoca la credencial¶
- En «Inicio», en «Mis credenciales», pulsa «Revocar» en la fila
tutorial. - El navegador te pide un motivo (opcional). Escribe
fin del tutorialy acepta. El estado pasa a «Revocada el …».
Prueba otra vez:
kubectl --kubeconfig "$KL_KC" get pods
error: You must be logged in to the server (credencial revocada)
Es un 401: la credencial dejó de valer al instante. Un exec, logs -f o port-forward que estuviera abierto con ella se habría cortado en menos de 10 segundos.
El intento también queda en «Auditoría». Marca «Incluir descubrimiento» y pulsa «Buscar»: aparece una fila sin sujeto, con el prefijo del token (klt_…) y el estado 401 credencial revocada.
15. Limpia¶
Para kubelatch con Ctrl-C en la terminal 1. Después, en la terminal 2:
e2e/kind.sh down # borra el cluster kubelatch-e2e y e2e/.kind/
make dev-db-down # para Postgres; los datos se quedan en el volumen
rm .dev/tutorial.kubeconfig ~/Descargas/kubelatch-bootstrap-kind.yaml
Si repites el tutorial con la misma base de datos, tu admin ya existe: sáltate el paso 5. Para empezar de cero, borra también el volumen con docker compose down -v.
Si algo no sale¶
| Síntoma | Qué hacer |
|---|---|
make dev-db falla porque el puerto 5433 está ocupado |
Cambia el puerto en docker-compose.yml y en la DATABASE_URL de .env. |
/readyz responde 503 |
Postgres no está arrancado: make dev-db. |
| El navegador muestra «SPA no construida» | Te saltaste make web. Ejecútalo, para kubelatch con Ctrl-C y vuelve a lanzar make dev-tls. |
La interfaz responde petición de otro origen rechazada |
Abriste https://127.0.0.1:8443. Usa https://localhost:8443. |
user create responde that login already exists |
El admin es de una prueba anterior. Entra con él o fija otra contraseña con bin/kubelatch user set-password admin. |
«Conceder» responde el nivel debugger exige que el namespace default tenga la etiqueta … |
Falta la etiqueta PSA del paso 7. Aplícala y vuelve a conceder. |
| kind crea Kubernetes 1.27 y «Guardar tokens» falla | Tu kind es antiguo. Instala kind 0.24 o posterior (o indícalo con KIND=), ejecuta e2e/kind.sh down y vuelve al paso 7. |
kubectl responde x509: certificate signed by unknown authority |
Falta el set-cluster del paso 10. |
kubectl responde the server has asked for the client to provide credentials |
El kubeconfig apunta a http://…: kubectl no envía el token sin TLS. Usa make dev-tls y https://localhost:8443. |
kubectl responde certificate has expired |
El certificado de make dev-tls dura 30 días. Borra .dev/tls/, vuelve a lanzar make dev-tls y repite el set-cluster del paso 10. |
Para errores del día a día con una credencial, mira Si algo falla. Cuando termines, Próximos pasos te dice qué leer según tu papel.