Cómo llega una versión al clúster
Es un modelo de recogida (GitOps): Safent publica la versión firmada y el clúster va a buscarla. Quien instala es Flux, la herramienta estándar de la CNCF para esto, que corre dentro del clúster. Si el clúster ya usa Flux, se aprovecha el suyo.
Un servidor Ubuntu 24.04 recién instalado, siguiendo esta guía al pie de la letra
La página de la prueba mostró la configuración tal cual se escribió (con comillas, &, = y un teléfono).
Cambiar un valor y repetir el comando reinició la app con el valor nuevo en unos 30 s. Su telemetría llegó a Salud, y «Quitar la prueba»
dejó el clúster limpio. Al final, «Dar de baja» y sus comandos de limpieza (6 s) quitaron en un minuto todo lo de Safent, app incluida:
solo quedaron Flux y la configuración.
Detrás de un proxy: el mismo servidor sin otra salida a Internet que un proxy. Con el proxy puesto en Safent y en los nodos (paso 2), el comando dio sus 5 pasos en verde en 12 s, la prueba se descargó firmada y quedó instalada 16 s después de poner su configuración. Al reiniciar k3s para el proxy, las apps que ya corrían no se pararon.
Ten un clúster de Kubernetes 1.34 o posterior
- Quién
- Quien administra la infraestructura.
- Dónde
- Fuera de Safent. En un terminal, con la herramienta de la nube, o en el propio servidor si es k3s.
- Ha ido bien si
kubectl versionmuestra «Server Version» v1.34 o posterior.
Si el clúster ya existe y cumple esto, salta al paso 1. Lo que tiene que tener:
- Kubernetes 1.34 o posterior, en nodos x86 (amd64) o ARM (arm64). Es lo que soporta Flux, que es quien instala las versiones.
kubectlcon un usuario administrador del clúster. Solo hace falta para conectar.- Almacenamiento persistente: una StorageClass marcada por defecto (k3s, AKS y GKE ya la traen; en EKS Auto Mode se crea con el comando de su pestaña).
- Solo si las apps se publican con su propia URL: un dominio (del estilo
apps.cliente.com), un ingress y certificados (cert-manager o el balanceador del clúster).
Si no existe, elige el caso y ejecuta sus comandos en orden, en un terminal:
Servidor Linux (k3s)
Probado por Safent- Entra en el servidor, por ejemplo con
ssh tu-usuario@tu-servidor. Tiene que ser Linux (Ubuntu, Debian o RHEL), x86 o ARM, con al menos 2 CPU, 4 GB de memoria y salida a Internet por HTTPS. - Instala Kubernetes (k3s) como root. Tarda un minuto y trae
kubectl:curl -sfL https://get.k3s.io | sh - - Hazte root para el resto de pasos:
sudo -i - Comprueba que el nodo está listo (STATUS
Readyy VERSION v1.34 o posterior):kubectl get nodes
Para borrarlo todo al terminar las pruebas: /usr/local/bin/k3s-uninstall.sh
Azure (AKS)
Según la documentación oficial de Microsoft- Instala Azure CLI e inicia sesión (se abre el navegador):
az login - Instala
kubectl(en Linux o macOS, consudodelante si te lo pide):az aks install-cli - Crea un grupo de recursos:
az group create --name safent --location westeurope - Crea el clúster. Usa AKS estándar, no Automatic: sus salvaguardas pueden rechazar despliegues. Tarda unos minutos.
az aks create --resource-group safent --name safent --node-count 2 --node-vm-size Standard_D4s_v5 --generate-ssh-keys - Trae las credenciales a
kubectl:az aks get-credentials --resource-group safent --name safent - Comprueba la versión («Server Version» v1.34 o posterior):
kubectl version
Si el clúster usa Entra ID con Azure RBAC, el usuario que conecta necesita el rol «Azure Kubernetes Service RBAC Cluster Admin».
Para borrarlo: az group delete --name safent --yes --no-wait
AWS (EKS)
Según la documentación oficial de AWS- Instala AWS CLI,
eksctl y
kubectl, y configura las credenciales con
aws configure(oaws sso login, si la empresa usa SSO). Comprueba que responde con la cuenta buena:aws sts get-caller-identity - Crea el fichero
cluster.yaml:cat > cluster.yaml <<'EOF' apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: { name: safent, region: eu-west-1 } autoModeConfig: { enabled: true } EOF - Crea el clúster (EKS Auto Mode). Tarda unos 15 minutos y deja
kubectlapuntando a él:eksctl create cluster -f cluster.yaml - Marca un almacenamiento por defecto (Auto Mode no crea ninguno):
kubectl apply -f - <<'EOF' apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: auto-ebs-sc annotations: { storageclass.kubernetes.io/is-default-class: "true" } allowedTopologies: - matchLabelExpressions: - { key: eks.amazonaws.com/compute-type, values: [auto] } provisioner: ebs.csi.eks.amazonaws.com volumeBindingMode: WaitForFirstConsumer parameters: { type: gp3, encrypted: "true" } EOF - Comprueba la versión («Server Version» v1.34 o posterior):
kubectl version
Solo quien crea el clúster es administrador. Si el comando de conexión lo ejecuta otra persona, dale acceso con
aws eks create-access-entry y la política AmazonEKSClusterAdminPolicy.
Para borrarlo: eksctl delete cluster -f cluster.yaml --wait
Google Cloud (GKE)
Según la documentación oficial de Google- Instala Google Cloud CLI, inicia sesión y elige el
proyecto (cambia
TU-PROYECTOpor su ID):gcloud auth login && gcloud config set project TU-PROYECTO - Activa la API de Kubernetes e instala
kubectly el complemento de acceso:Si instalaste gcloud con apt, esos dos van congcloud services enable container.googleapis.com && gcloud components install kubectl gke-gcloud-auth-pluginsudo apt-get install kubectl google-cloud-cli-gke-gcloud-auth-plugin. - Crea el clúster (GKE Standard; Autopilot no está comprobado con Flux):
gcloud container clusters create safent --location=europe-southwest1-a --num-nodes=2 --machine-type=e2-standard-4 - Trae las credenciales a
kubectl:gcloud container clusters get-credentials safent --location=europe-southwest1-a - Comprueba la versión («Server Version» v1.34 o posterior):
kubectl version
Para borrarlo: gcloud container clusters delete safent --location=europe-southwest1-a
HPE Private Cloud AI
Por validar contigo en la primera PCAI- Una versión de PCAI que traiga Kubernetes 1.34 o posterior. Según la matriz de soporte de HPE, AIE 2026.07 trae la 1.34.2; las anteriores no llegan.
- Pide al administrador de PCAI un kubeconfig con permisos de administrador del clúster y úsalo:
export KUBECONFIG=$HOME/pcai-admin.kubeconfig - Comprueba que eres administrador (tiene que responder
yes):kubectl auth can-i create clusterrolebindings - Comprueba la versión («Server Version» v1.34 o posterior):
kubectl version
HPE no documenta públicamente cómo obtener ese kubeconfig de administrador ni si PCAI admite herramientas como Flux, que instala sus propios recursos en el clúster. Es lo primero que comprobaremos contigo en la primera PCAI que se conecte. Si no da un administrador del clúster o no tiene salida a Internet, se usa el modo sin Internet: cada versión llega en un paquete firmado que se instala con Helm.
Da de alta el entorno en Safent
- Quién
- Tu administrador o jefe de proyecto (o Safent, si se lo pides).
- Dónde
- En Safent, en
https://equipo.lab.safentmcp.com, con tu usuario. - Ha ido bien si
- Safent enseña el panel «Conecta … con Safent» con el comando del paso 3.
- Entra en
https://equipo.lab.safentmcp.comcon tu usuario y ve a Cartera. - Abre el sitio donde va el entorno:
- Infraestructura del partner, si es tuya y sirve para todos tus clientes: el botón Infraestructura del partner, arriba en la cartera.
- Infraestructura de un cliente tuyo, para un proyecto suyo: abre el cliente, el proyecto y su pestaña Entornos › Entornos del proyecto.
- Pulsa Añadir un entorno y rellena el formulario (los opcionales, solo si aplican):
| Campo | Qué poner |
|---|---|
| Nombre | Corto, en minúsculas y sin espacios: planta-norte, aks-produccion. |
| Tipo | Dónde está: HPE ProLiant DL145, HPE Private Cloud AI, AWS, Azure, Google Cloud, Kubernetes (k3s) o servidor propio. |
| Etapa | Preproducción recibe cada versión publicada. Producción la recibe cuando se acepta la UAT. |
| Conectividad | Con Internet, lo normal. «Aislado» solo si el clúster no puede salir a Internet de ninguna forma (Sin Internet). |
| Arquitectura | La de los nodos: x86 (amd64) o ARM (arm64). La ves con kubectl get nodes -L kubernetes.io/arch. |
| Dominio de las apps | Opcional. Solo si las apps se publican con URL propia, por ejemplo apps.cliente.com. Entonces pide también
los certificados (cert-manager, el balanceador del clúster o sin TLS) y, si quieres, la clase de ingress. |
| Proxy de salida | Opcional. Solo si el clúster sale a Internet por un proxy (paso 2). |
| Servidores de modelos | Opcional. Si el entorno sirve modelos de IA compatibles con OpenAI (NIM, vLLM…), sus direcciones. |
- Pulsa Dar de alta. Aparece el panel «Conecta «nombre» con Safent» con el comando del paso 3. Cópialo ahora: lleva dentro el token del entorno y solo se enseña una vez.
- Si lo pierdes, o si lo va a ejecutar otra persona, en la ficha del entorno pulsa Cómo conectarlo (o Volver a conectar): genera un comando nuevo y el anterior deja de valer.
Comprueba que el clúster sale a Internet (y ábrelo solo si no)
- Quién
- Quien administra el clúster y, si hay que abrir algo, quien lleva su red.
- Dónde
- Fuera de Safent. En la red del clúster: su cortafuegos, su proxy de salida o las reglas de salida de su nube.
- Ha ido bien si
- Las dos comprobaciones responden
200y401, y en el paso 3 sale «✓ llega a Safent y a su registro».
Lo normal es no tener que hacer nada. Un clúster creado como en el paso 0 (en Azure, AWS, Google Cloud o un servidor con Internet) ya sale a Internet por HTTPS. Solo hay que tocar algo si la red filtra lo que sale.
- Compruébalo desde donde vayas a ejecutar el paso 3 (en k3s, en el propio servidor). La primera tiene que responder
200:y la segunda,curl -sS -o /dev/null -w '%{http_code}\n' https://equipo.lab.safentmcp.com/salud401. El 401 es lo correcto: el registro responde y pide una credencial, que pone el paso 3.curl -sS -o /dev/null -w '%{http_code}\n' https://forgejo.lab.safentmcp.com/v2/ - Si alguna no responde, o la red del clúster filtra la salida, pide a quien la lleve esta regla. En Azure Firewall es una regla de aplicación;
en AWS Network Firewall, una lista de dominios permitidos; en un proxy, su lista de sitios permitidos.
Regla Valor Origen Los nodos del clúster (y sus pods). Destino forgejo.lab.safentmcp.comyequipo.lab.safentmcp.com, por nombre de dominio.Puerto TCP 443 (HTTPS). Sentido Solo de salida. No se abre nada de entrada. - Si el clúster sale a Internet por un proxy, sigue Si el clúster sale a Internet por un proxy, aquí debajo.
Si el clúster sale a Internet por un proxy
Antes del paso 3, estas cuatro cosas. Lo demás lo hace el comando de conexión: pone a Flux y al agente a salir por el proxy.
- En Safent: ficha del entorno › Editar › Proxy de salida: la dirección del proxy, por ejemplo
http://proxy.empresa.local:3128› Guardar. Al dar de alta, es el mismo campo del formulario. Si el proxy pide usuario y contraseña, van en la dirección (http://usuario:clave@proxy.empresa.local:3128); Safent no vuelve a enseñar la clave. - En el proxy: permite la salida a
forgejo.lab.safentmcp.comyequipo.lab.safentmcp.com, puerto 443. Compruébalo desde un nodo; tiene que responder401:curl -sS -x http://proxy.empresa.local:3128 -o /dev/null -w '%{http_code}\n' https://forgejo.lab.safentmcp.com/v2/ - En los nodos: que descarguen las imágenes por el proxy. Si el clúster ya descarga imágenes de Internet, ya lo hace y no hay que tocar
nada. Si no:
k3s
Probado por Safent- En el servidor, como root, añade el proxy al entorno de k3s (en los nodos agente, el fichero es
/etc/systemd/system/k3s-agent.service.env):cat >> /etc/systemd/system/k3s.service.env <<'EOF' CONTAINERD_HTTP_PROXY=http://proxy.empresa.local:3128 CONTAINERD_HTTPS_PROXY=http://proxy.empresa.local:3128 CONTAINERD_NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 EOF - Reinicia k3s (en los agentes,
systemctl restart k3s-agent). Las apps que ya corren no se paran:systemctl restart k3s
Kubernetes con containerd (kubeadm y similares)
Configuración estándar de systemd- En cada nodo, como root:
mkdir -p /etc/systemd/system/containerd.service.d cat > /etc/systemd/system/containerd.service.d/http-proxy.conf <<'EOF' [Service] Environment="HTTP_PROXY=http://proxy.empresa.local:3128" Environment="HTTPS_PROXY=http://proxy.empresa.local:3128" Environment="NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local" EOF systemctl daemon-reload && systemctl restart containerd - Comprueba que lo tiene (tiene que salir el proxy):
systemctl show containerd --property=Environment
Azure (AKS)
Según la documentación oficial de Microsoft- Crea el fichero con el proxy:
cat > aks-proxy.json <<'EOF' { "httpProxy": "http://proxy.empresa.local:3128", "httpsProxy": "http://proxy.empresa.local:3128", "noProxy": ["localhost", "127.0.0.1"] } EOF - Aplícalo al clúster (con los nombres del paso 0, o los suyos):
az aks update --resource-group safent --name safent --http-proxy-config aks-proxy.json
AKS reinstala todos los nodos al cambiar el proxy (las apps se reinician) y no admite proxy con usuario y contraseña. Desde entonces pone el proxy a los nodos y a los pods.
AWS (EKS)
Según la documentación oficial de AWS- EKS Auto Mode (el del paso 0): el proxy va en el NodeClass de los nodos, en
advancedNetworking. Cómo crear el NodeClass y el NodePool que lo usa: guía de AWS.advancedNetworking: httpsProxy: http://proxy.empresa.local:3128 noProxy: [localhost, 127.0.0.1, 169.254.169.254, .internal, .eks.amazonaws.com]
- Grupos de nodos gestionados: en los datos de usuario de su plantilla de lanzamiento, como en la guía de AWS.
Google Cloud (GKE)
Según la documentación oficial de GoogleGKE no admite proxy en los nodos. Si son privados, Google recomienda darles salida con Cloud NAT (y limitarla a las dos direcciones en el cortafuegos). Con la red y la región del paso 0:
gcloud compute routers create safent-nat --network=default --region=europe-southwest1 gcloud compute routers nats create safent-nat --router=safent-nat --region=europe-southwest1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-rangesHPE Private Cloud AI
Según la documentación oficial de HPEEl proxy de los nodos se pone al instalar PCAI (Setting up the proxy server). Si ya lo tiene, basta con que el proxy deje salir a las dos direcciones (punto 2).
- En el servidor, como root, añade el proxy al entorno de k3s (en los nodos agente, el fichero es
- En el terminal del paso 3, si ese ordenador tampoco sale directo a Internet (en k3s, el propio servidor), pon el proxy antes de pegar el
comando.
NO_PROXYdeja fuera la API del clúster, para quekubectlsiga llegando a ella:export HTTPS_PROXY=http://proxy.empresa.local:3128 NO_PROXY="localhost,127.0.0.1,$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' | sed 's#^[a-z]*://##; s#[:/].*##')"
Ejecuta el comando de conexión
- Quién
- Quien administra el clúster.
- Dónde
- Fuera de Safent. En un terminal del ordenador donde
kubectlllega al clúster (el del paso 0). En k3s, en el servidor, como root. Safent solo da el comando. - Ha ido bien si
- Termina con «Listo» y, en Safent, el entorno sale Conectado y Apto para instalar.
- Abre el terminal y comprueba que
kubectlapunta al clúster bueno: tiene que salir su nombre (en k3s no hace falta).kubectl config current-context - Pega el comando que copiaste en el paso 1 y pulsa Intro. Tiene esta forma:
curl -fsSL 'https://equipo.lab.safentmcp.com/entornos/<dueño>/<entorno>/conectar.sh?t=<token>' | sh - Tarda entre medio minuto y un par de minutos. Verás esto:
1/5 Clúster ✓ Kubernetes 1.34, 1 nodo(s) 2/5 Salida a Safent (HTTPS) ✓ llega a Safent y a su registro 3/5 Flux ✓ Flux instalado 4/5 Conexión con Safent ✓ repo de entregas, firma, avisos y agente de entorno ✓ Flux descarga de forgejo.lab.safentmcp.com 5/5 Primer aviso a Safent ✓ Safent ha recibido el aviso de <dueño>/<entorno>: 0 GPU, 1 nodo(s) Listo: «<dueño>/<entorno>» aparece como Conectado en Safent, con su lista de requisitos.
- En Safent, en la ficha del entorno: Conectado y Apto para instalar. Si sale «No apto», pulsa esa etiqueta: dice qué falta.
- Si se para con un mensaje, arregla lo que dice y vuelve a ejecutarlo: repetirlo no rompe nada (ver Si algo falla).
| Paso | Qué hace |
|---|---|
| 1/5 Clúster | Comprueba kubectl, que llega al clúster, que el usuario es administrador y la versión de Kubernetes. |
| 2/5 Salida | Comprueba que se llega a las dos direcciones por HTTPS. |
| 3/5 Flux | Instala la credencial de solo lectura del registro. Instala Flux solo si el clúster no lo tiene; si ya lo tiene, usa el suyo. |
| 4/5 Conexión | Instala el repo de despliegue de este entorno, la clave pública que verifica las firmas, los avisos a Safent y el agente de entorno, y comprueba que Flux descarga. |
| 5/5 Primer aviso | Lanza el agente una vez desde dentro del clúster y espera a que Safent confirme que lo ha recibido. |
Haz la prueba de despliegue
- Quién
- Quien administra el clúster.
- Dónde
- El botón, en Safent. La configuración y la comprobación, en el mismo terminal del paso 3.
- Ha ido bien si
- La prueba llega a Instalada y su página dice «Despliegue correcto» con tu mensaje.
Safent instala una app de ejemplo suya, firmada, por el mismo camino que cada versión real. Pide una variable de configuración,
MENSAJE, para que veas también cómo se pone la configuración.
- En Safent, en la ficha del entorno, pulsa Prueba de despliegue y después Hacer la prueba.
- Sigue la línea de tiempo. En medio minuto se para en Falta la configuración:
- Versión publicada para el entornoSafent la deja en el repo de despliegue del entorno.
- El entorno ha recogido el cambioFlux, desde el clúster, ve que hay una versión nueva.
- Chart descargado y firma verificadaSi la firma no cuadra, no se instala.
- Falta la configuraciónSolo si la app pide variables y aún no existen. Safent enseña la plantilla y el comando; en cuanto los pones, sigue sola.
- InstaladaLa app arranca con su configuración.
- Si una versión no arrancaFlux vuelve sola a la anterior y Safent la marca como fallida, con el motivo.
- En el terminal, crea el fichero de su configuración con el texto que quieras:
echo "MENSAJE=Hola desde el clúster" > safent-ejemplos-prueba-despliegue.env - En el mismo terminal, cárgalo en el clúster. Es el comando que enseña Safent en «Configuración de la app», el mismo para cualquier app:
echo "_huella=$(date +%s)" | kubectl -n flux-system create secret generic safent-ejemplos-prueba-despliegue-config --from-env-file=safent-ejemplos-prueba-despliegue.env --from-env-file=/dev/stdin --dry-run=client -o yaml | kubectl label --local -f - reconcile.fluxcd.io/watch=Enabled -o yaml | kubectl apply -f - - En Safent, la prueba pasa a Instalada en unos 30 segundos.
- Ábrela. En el terminal (se queda abierto; lo cierras con Ctrl+C):
y en el navegador del mismo ordenador entra en
kubectl -n safent-ejemplos-prueba-despliegue port-forward svc/app 8080:8080http://localhost:8080: dice «Despliegue correcto» y enseña elMENSAJEtal cual. Si estás en el servidor por SSH, abre otra sesión en él y mira la página concurl -s http://localhost:8080. - Para quitarla, en Safent pulsa Quitar la prueba: se desinstala con su namespace. Su configuración se borra en el terminal:
kubectl -n flux-system delete secret safent-ejemplos-prueba-despliegue-config
Las apps llegan solas
- Quién
- Tú (o Safent) eliges el destino de cada repositorio. Quien administra el clúster solo pone la configuración de cada app nueva.
- Dónde
- En Safent, en el Despliegue de cada repositorio.
- Ha ido bien si
- Cada destino llega a Instalada en su línea de tiempo.
- Abre el repositorio: Cartera › el cliente › el proyecto › pestaña Repositorios › el repositorio › pestaña Despliegue.
- Pulsa Elegir dónde se despliega (o «Añadir o cambiar destino»), elige de quién es el entorno (de Safent, tuyo o de tu cliente), su tipo y el entorno, y pulsa Fijar destino (o «Desplegar … aquí», si ya hay versión).
- Desde ahí, cada versión llega sola:
- a preproducción, cada versión publicada, es decir, firmada tras pasar el QA;
- a producción, cuando se acepta la UAT del proyecto y desde entonces cada versión;
- un sistema que ya estaba en producción y se trae para mantenerlo, sin UAT, va directo.
- Si la app pide configuración, la línea de tiempo se para en Falta la configuración: sigue La configuración de cada app.
La configuración de cada app
- Quién
- Quien administra el clúster.
- Dónde
- La plantilla, en Safent. El fichero y el comando, en el terminal con
kubectl. - Ha ido bien si
- En Safent, la versión pasa de «Falta la configuración» a Instalada en menos de un minuto.
Cada app declara en su .env.example lo que necesita de su entorno: la URL de la base de datos, las claves de las APIs… Al desplegarla,
la versión queda en Falta la configuración hasta que se ponga.
- En Safent, en el Despliegue del repositorio, pulsa Configuración de la app junto a su destino: enseña la plantilla y el comando, ya con el nombre de la app.
- En el terminal, crea el fichero
<app>.enva partir de la plantilla, con los valores reales: una línea por variable,NOMBRE=valor. El valor llega tal cual, con comas, espacios o cualquier símbolo; por eso va sin comillas. - Cárgalo en el clúster con el comando (aquí con
<app>; el de Safent ya lleva el nombre):echo "_huella=$(date +%s)" | kubectl -n flux-system create secret generic <app>-config --from-env-file=<app>.env --from-env-file=/dev/stdin --dry-run=client -o yaml | kubectl label --local -f - reconcile.fluxcd.io/watch=Enabled -o yaml | kubectl apply -f -
Safent solo conoce los nombres de las variables, nunca los valores. En menos de un minuto la versión se instala sola. Para cambiar un valor, edita el fichero y repite el comando: la app se reinicia con la configuración nueva.
El comando añade al secreto la clave _huella, que cambia en cada ejecución y hace que la app se reinicie, y la etiqueta
reconcile.fluxcd.io/watch=Enabled, que hace que Flux vea el cambio al momento. Si el secreto lo crea otra herramienta (un gestor de
secretos, por ejemplo), que ponga las dos.
Versiones y vuelta atrás
Cada versión sale de una entrega que ha pasado el QA, se publica firmada y se guarda. Su número sigue el versionado semántico:
- la primera de cada proyecto es la
1.0.0; - una entrega nueva sube el número del medio:
1.1.0→1.2.0; - el arreglo de una incidencia sube el último:
1.1.0→1.1.1.
- Si una versión no arranca, el entorno vuelve solo a la anterior (Flux deshace la actualización) y Safent lo marca como fallido con el motivo.
- Volver a una versión anterior es un botón, en Safent: en el Despliegue del repositorio, abre Versiones · volver a una anterior y pulsa «Instalar en preproducción» o «Instalar en producción» junto a la que quieras. Se instala en un minuto, sin tocar nada en el clúster.
- Cada versión sabe de qué entrega y de qué commit sale, y si fue el arreglo de una incidencia.
Monitorización
Al instalar cada app, Safent le pone las variables estándar de OpenTelemetry. Cualquier app que use OpenTelemetry (hay SDK para todos los lenguajes habituales; las de Safent ya lo traen) envía sus trazas, métricas y logs sin configurar nada más:
- Van a
equipo.lab.safentmcp.comcon un token propio de ese despliegue, que solo sirve para enviar su telemetría. - Safent las etiqueta con el cliente, la app y el entorno, y las guarda en Maple, una plataforma de observabilidad de código abierto que Safent aloja en su propia infraestructura. La telemetría no sale a ningún tercero.
- Se guardan 30 días de trazas y logs y 90 de métricas.
| Quién | Qué ve |
|---|---|
| Tú y tu cliente | En la pestaña Salud de cada proyecto: peticiones, porcentaje de errores, tiempos de respuesta (p50 y p95) y los errores más repetidos. Cada uno, solo de sus proyectos. |
| Equipo Safent | El panel completo de Maple, con cada traza, para diagnosticar. |
| Agente de soporte | La salud y los errores de producción de la app de la incidencia, y nada de otros clientes. |
Antes de entregar, mientras se desarrolla, Safent vigila cada 5 minutos la versión de prueba de cada entrega: si sube el porcentaje de errores, si va lenta o si aparece un error nuevo, el agente que la desarrolla lo arregla antes de entregarla.
Incidencias
Con el versionado, resolver una incidencia es el mismo camino que una entrega, y siempre hay una versión buena a la que volver.
- La reportas en Safent, en el menú Reportar incidencia: cliente, proyecto, qué pasa y su gravedad. Las del proyecto se ven en su pestaña Incidencias.
- El agente de soporte la diagnostica. Mira la salud y los errores de producción de esa app, revisa el código y te pregunta por el chat lo que necesite. Te deja un diagnóstico: qué pasa, la causa, a quién afecta, cómo esquivarlo mientras tanto y qué hay que cambiar.
- «Arreglar» convierte ese diagnóstico en una entrega: rama, QA y PR, como cualquier otra.
- Sale una versión de parche firmada (
1.1.0→1.1.1) que llega a preproducción y, si el proyecto ya está aceptado, a producción, sola. - Al instalarse, la incidencia queda «Resuelta». Tú la confirmas o la reabres.
Si urge, mientras se arregla: en el Despliegue del repositorio, Versiones · volver a una anterior › «Instalar en producción» en la versión anterior. Un minuto, sin tocar el entorno.
Seguridad
- Nadie entra. Safent no tiene accesos, SSH ni VPN a ningún clúster. Todas las conexiones las abre el clúster.
- Firmas. Cada versión (imagen y chart) se firma con cosign al publicarse. El clúster la verifica con la clave pública que instaló el comando de conexión; si no cuadra, no se instala.
- Imágenes fijadas. Cada imagen va por su huella
sha256: nadie puede cambiarla por otra con el mismo nombre. - Credencial de solo lectura. La del registro solo descarga, y solo los paquetes de ese entorno.
- La configuración se queda en el clúster. Vive en un Secret. Safent solo sabe cómo se llaman las variables.
- Tokens acotados. El del entorno se muestra una vez y «Volver a conectar» lo anula; el de telemetría solo sirve para enviar la de su despliegue.
- El agente de entorno solo cuenta la versión, los nodos, las GPU, los modelos y el almacenamiento, cada 5 minutos. Nunca datos.
| Qué queda en el clúster | Qué es |
|---|---|
flux-system | Flux (si no lo tenía), la credencial de solo lectura (safent-registro), la clave pública (safent-cosign) y los objetos safent-<dueño>-<entorno>. |
safent-entorno | El agente de entorno: un CronJob con permisos de solo lectura. |
<cliente>-<app> | Un namespace por app, con lo que instale cada versión. |
Sin Internet (planta aislada)
- Alta con «Aislado (sin Internet)». Safent da un fichero de conexión; llévalo al servidor. Con Docker:
sudo sh conectar-aislado.sh; con Kubernetes:kubectl apply -f conectar-aislado.yaml. Instala solo el agente de entorno. - Cada versión se descarga en Versiones › Paquete offline: un único fichero con la imagen, el chart, sus firmas y las herramientas. En el servidor:
Pon los valores en
tar xzf paquete-*.tar.gz && cd paquete-*/ && cp app.env.example app.envapp.env(solo si la app pide configuración) y después:Comprueba las firmas sin conexión e instala con Helm si hay Kubernetes, o con Docker Compose si no../instalar-offline.sh - El estado lo deja el agente en un fichero firmado; súbelo en Safent con «Subir estado». Si alguien lo modifica, Safent lo rechaza.
Si algo falla, el comando dice qué falta
| Mensaje | Qué hacer |
|---|---|
curl: (6) o curl: (7) nada más pegar el comando | El terminal no llega a equipo.lab.safentmcp.com: paso 2. Si sale por un proxy, ponlo en el terminal (proxy, punto 4) y vuelve a pegar el comando. |
| Falta kubectl… | Instala Kubernetes (o k3s) y kubectl. |
| kubectl no llega al clúster | Revisa KUBECONFIG (en k3s, entra como root con sudo -i). |
| Hace falta un usuario administrador | Ejecútalo con un usuario cluster-admin. |
| ⚠ Flux se soporta desde Kubernetes 1.34 | El entorno se conecta, pero no está apto para instalar hasta que se actualice el clúster. |
| Este equipo no llega a … / No se llega al registro de Safent | El ordenador donde ejecutas el comando no sale a esa dirección: paso 2. Si sale por un proxy, ponlo en el terminal (proxy, punto 4). |
| Flux no arranca | Si sus pods están en ImagePullBackOff (kubectl -n flux-system get pods), los nodos no salen a forgejo.lab.safentmcp.com aunque el ordenador desde el que se ejecuta sí: paso 2, desde los nodos. Con proxy, «En los nodos». |
| El agente no arranca | Lo mismo, con kubectl -n safent-entorno describe job/…: los nodos no descargan su imagen de forgejo.lab.safentmcp.com. |
| El agente no pudo avisar a Safent | Los pods no salen a equipo.lab.safentmcp.com aunque el ordenador desde el que se ejecuta sí: paso 2, desde el clúster. Con proxy, que deje salir a esa dirección. |
| Flux no descarga de forgejo.lab.safentmcp.com | Flux no llega al registro. Si el clúster sale por un proxy, ponlo en Safent (proxy, punto 1) y repite el comando. |
| ⚠ su Flux no tiene proxy | El clúster ya tenía Flux y no sale por el proxy: ponle HTTPS_PROXY y NO_PROXY como indica Flux. |
| Falta la configuración (en Safent) | No es un fallo: crea el secreto con el comando de Configuración de la app. |
Pausar o dar de baja
Pausar las actualizaciones
- Quién
- Quien administra el clúster.
- Dónde
- Fuera de Safent. En el terminal con
kubectl. - Ha ido bien si
- Lo instalado sigue funcionando y no llegan versiones nuevas hasta que reanudes.
Cambia <dueño>-<entorno> por los del entorno (el entorno planta-norte del cliente talleres sería
safent-talleres-planta-norte). Para reanudar, el mismo comando con false:
kubectl -n flux-system patch kustomization safent-<dueño>-<entorno> --type merge -p '{"spec":{"suspend":true}}'Dar de baja el entorno
- Quién
- Tú, en Safent; para limpiar, quien administra el clúster.
- Dónde
- Primero en Safent; después, en el terminal con
kubectl(o en el servidor, si es un DL145 sin Internet). - Ha ido bien si
- El entorno desaparece de Safent y, tras la limpieza, en el clúster no queda nada de Safent.
- En Safent, en la ficha del entorno, pulsa Dar de baja y confírmalo. Safent deja de entregarle versiones, su token deja de valer y los proyectos que lo tenían de destino se quedan sin él (te dice cuáles, para que elijas otro). En el clúster todavía no cambia nada.
- Safent enseña los comandos de limpieza, ya con el nombre del entorno. En un entorno con Internet son estos; desinstalan también las apps que
Safent instaló, con sus namespaces:
kubectl -n flux-system delete alerts.notification.toolkit.fluxcd.io,providers.notification.toolkit.fluxcd.io safent-<dueño>-<entorno> --ignore-not-found kubectl -n flux-system delete kustomizations.kustomize.toolkit.fluxcd.io safent-<dueño>-<entorno> --ignore-not-found --wait kubectl -n flux-system delete gitrepositories.source.toolkit.fluxcd.io safent-<dueño>-<entorno> --ignore-not-found kubectl -n flux-system delete secret safent-<dueño>-<entorno>-git safent-registro safent-registro-valores safent-cosign --ignore-not-found kubectl -n flux-system delete role,rolebinding safent-agente-entorno --ignore-not-found kubectl delete namespace safent-entorno --ignore-not-found kubectl delete clusterrole,clusterrolebinding safent-agente-entorno --ignore-not-found - Se ejecutan en el terminal. Compruébalo:
kubectl get nsya no muestrasafent-entornoni los namespaces de las apps. - Quedan Flux (lo usa quien quiera) y la configuración de cada app (los secretos
<app>-configdeflux-system), que se borra si ya no hace falta. Si el clúster ya no existe, no hay nada que limpiar.
Sin Internet, la limpieza solo quita el agente de entorno; las apps instaladas con los paquetes offline se quedan como están. Para volver a conectarlo más adelante, se da de alta otra vez, con el mismo nombre si quieres.
Safent Developer Team · octubre de 2026. Probado de principio a fin en un servidor Linux con k3s; Azure, AWS, Google Cloud y HPE PCAI siguen la documentación oficial de cada proveedor.