Conectar el clúster una vez
-
Ten un clúster con Kubernetes 1.34 o posterior
Si ya lo tienes, pasa al 2. Si no, en un servidor Linux con Internet es un comando, como root (tarda un minuto):
curl -sfL https://get.k3s.io | sh -✓ Listo si
kubectl get nodesmuestra los nodos enReady. -
Da de alta el entorno en Safent
En equipo.lab.safentmcp.com: Cartera › el cliente › el proyecto › pestaña Entornos › Añadir un entorno. Pon un nombre (
planta-norte) y el tipo, y pulsa Dar de alta. Si el clúster es tuyo y sirve a todos tus clientes, entra por Infraestructura del partner, arriba en la Cartera.✓ Listo si aparece el comando de conexión. Cópialo: solo se enseña una vez.
-
Pega el comando en un terminal con
kubectlEn el ordenador desde el que administras el clúster (en k3s, en el propio servidor, después de
sudo -i). Tarda menos de un minuto.✓ Listo si termina en «Listo» y, en Safent, el entorno sale Conectado.
Instalar una app una vez por app
-
Elige dónde se instala
En Safent: el proyecto › Repositorios › el repositorio › Despliegue › Elegir dónde se despliega › el entorno › Fijar destino. Preproducción recibe cada versión; producción, desde que se acepta la UAT.
✓ Listo si la línea de tiempo del destino llega a Instalada.
-
Si se para en «Falta la configuración», ponla
Son los datos que la app necesita del cliente (su base de datos, sus claves…). En Safent, Configuración de la app enseña qué variables pide y el comando, ya con su nombre. Escribe los valores en
<app>.env, una líneaNOMBRE=valorcada una, sin comillas, y ejecuta el comando en el terminal conkubectl: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 -✓ Listo si en menos de un minuto pasa a Instalada.
Y ya está. Las versiones siguientes llegan solas, y si una no arranca, el clúster vuelve solo a la anterior.
Si lo necesitas
Crear el clúster en Azure, AWS, Google Cloud o HPE PCAIComandos de cada proveedor, con kubectl de administrador al final.
Hace falta Kubernetes 1.34 o posterior (x86 o ARM), kubectl con un usuario administrador y un almacenamiento por defecto
(k3s, AKS y GKE ya lo traen). Si las apps se publican con URL propia, también un dominio, un ingress y certificados.
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.
Si la red del clúster filtra la salida a InternetLo único que hay que abrir: HTTPS de salida a dos direcciones.
Pide a quien lleve la red que permita, desde los nodos del clúster, la salida por HTTPS (TCP 443) a forgejo.lab.safentmcp.com y
equipo.lab.safentmcp.com, por nombre de dominio. No se abre nada de entrada. Compruébalo desde el terminal del paso 3: la primera
tiene que dar 200 y la segunda 401 (el registro responde y pide la credencial que pone el comando).
curl -sS -o /dev/null -w '%{http_code}\n' https://equipo.lab.safentmcp.com/salud
curl -sS -o /dev/null -w '%{http_code}\n' https://forgejo.lab.safentmcp.com/v2/Si el clúster sale a Internet por un proxyCuatro cosas antes de pegar el comando; lo demás lo hace él.
- En Safent: ficha del entorno › Editar › Proxy de salida:
http://proxy.empresa.local:3128› Guardar. Si 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: deja salir a
forgejo.lab.safentmcp.comyequipo.lab.safentmcp.com(443). Desde un nodo tiene que dar401: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 ya descargan imágenes de Internet, no hay que tocar nada):
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 clúster):
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 de «Crear el clúster»): 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 su red y su región:
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, si tampoco sale directo a Internet (en k3s, el propio servidor), antes de pegar el comando:
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#[:/].*##')"
Si la red inspecciona el HTTPSProxy o cortafuegos con certificado propio: se pone en Safent y en los nodos.
Se nota porque al pegar el comando sale curl: (60) SSL certificate problem. Pide a sistemas el certificado raíz de la
empresa: un fichero .crt o .pem que empieza por -----BEGIN CERTIFICATE-----.
- En Safent: ficha del entorno › Editar › Certificado de la empresa: pega el certificado › Guardar. Flux y el agente confiarán en él.
- En cada nodo y en el equipo donde pegas el comando, como root, con el certificado guardado en
empresa-ca.crt(en Red Hat o Rocky:cp empresa-ca.crt /etc/pki/ca-trust/source/anchors/ && update-ca-trust):Después reinicia k3s (en los agentes,cp empresa-ca.crt /usr/local/share/ca-certificates/empresa-ca.crt && update-ca-certificatesk3s-agent) o, con otro Kubernetes,containerd. Las apps que ya corren no se paran:En AKS, el certificado va en el fichero del proxy:systemctl restart k3s"trustedCa": "<el certificado en base64>". - Comprueba desde un nodo que da
401y nocurl: (60)(con proxy, después delexportdel terminal):curl -sS -o /dev/null -w '%{http_code}\n' https://forgejo.lab.safentmcp.com/v2/
Y pega el comando de conexión (o repítelo, si ya lo habías pegado).
Si el comando se paraDice qué falta. Lo arreglas y lo vuelves a pegar: repetirlo no rompe nada.
| Mensaje | Qué hacer |
|---|---|
curl: (6) o curl: (7) nada más pegar el comando | El terminal no llega a equipo.lab.safentmcp.com: salida a Internet. Si sale por un proxy, ponlo en el terminal (proxy, punto 4) y vuelve a pegar el comando. |
curl: (60) nada más pegar el comando, o «este equipo no confía en su certificado» | La red inspecciona el HTTPS: certificado de la empresa, puntos 2 y 3, en este equipo. |
| 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: salida a Internet. 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í: la salida 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í: la salida 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. |
| «los nodos no confían en su certificado» | Certificado de la empresa, punto 2, en cada nodo (y reinicia k3s o containerd). |
| «Flux no confía…» o «El agente no confía en el certificado…» | Certificado de la empresa, punto 1: en Safent. Si ya estaba, pide a sistemas el raíz (y el intermedio, si lo hay) y pega los dos. |
| Falta la configuración (en Safent) | No es un fallo: crea el secreto con el comando de Configuración de la app. |
Probarlo con una app de ejemploSafent instala una app suya por el mismo camino que las reales.
- En Safent, en la ficha del entorno: Prueba de despliegue › Hacer la prueba. En medio minuto se para en «Falta la configuración».
- En el terminal, ponle su configuración:
echo "MENSAJE=Hola desde el clúster" > safent-ejemplos-prueba-despliegue.env 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 unos 30 segundos sale Instalada. Para verla, en el terminal (Ctrl+C para cerrar) y después
http://localhost:8080en el navegador: dice «Despliegue correcto» con tu mensaje.kubectl -n safent-ejemplos-prueba-despliegue port-forward svc/app 8080:8080 - Para quitarla: Quitar la prueba en Safent y, en el terminal,
kubectl -n flux-system delete secret safent-ejemplos-prueba-despliegue-config.
Versiones, volver atrás e incidenciasCada versión firmada se guarda; volver a una anterior es un botón.
- Volver a una anterior: en el Despliegue del repositorio, Versiones · volver a una anterior › «Instalar en producción» (o en preproducción) junto a la que quieras. Un minuto, sin tocar el clúster.
- Si una versión no arranca, Flux vuelve sola a la anterior y Safent la marca como fallida, con el motivo.
- Una incidencia se reporta en Safent (menú Reportar incidencia). Su arreglo sale como versión de parche (
1.1.0→1.1.1) y llega sola, como cualquier otra.
Qué ve Safent y qué se queda en el clústerNadie entra; todo va firmado; los datos no salen.
- Nadie entra: ni accesos, ni SSH, ni VPN. Todas las conexiones las abre el clúster, hacia dos direcciones de Safent.
- Todo firmado: cada imagen y cada chart se firman al publicarse; el clúster comprueba la firma y, si no cuadra, no instala.
- La configuración se queda en el clúster, en un Secret. Safent solo sabe cómo se llaman las variables.
- Safent ve el estado de cada despliegue, el inventario técnico (versión, nodos, GPU, almacenamiento; nunca datos) y la salud de las apps (peticiones, errores y tiempos, en la pestaña Salud de cada proyecto). La telemetría se guarda en la infraestructura de Safent, no en terceros.
- En el clúster quedan Flux y la credencial de solo lectura en
flux-system, el agente de entorno ensafent-entornoy un namespace por app.
Sin Internet (planta aislada)Cada versión llega en un paquete firmado que se instala a mano.
- Da de alta el entorno con Conectividad: Aislado. Safent da un fichero de conexión: en el servidor,
sudo sh conectar-aislado.sh(Docker) okubectl apply -f conectar-aislado.yaml(Kubernetes). - Cada versión se descarga en Versiones › Paquete offline. En el servidor:
Pon los valores en
tar xzf paquete-*.tar.gz && cd paquete-*/ && cp app.env.example app.envapp.env(si la app pide configuración) y ejecuta./instalar-offline.sh: comprueba las firmas e instala. - El estado lo deja el agente en un fichero firmado; súbelo en Safent con Subir estado.
Pausar las actualizaciones o dar de baja el entornoPausar es un comando; dar de baja, un botón y unos comandos de limpieza.
Pausar (lo instalado sigue funcionando; para reanudar, lo mismo con false). El nombre es safent-<cliente>-<entorno>:
kubectl -n flux-system patch kustomization safent-<cliente>-<entorno> --type merge -p '{"spec":{"suspend":true}}'Dar de baja: en Safent, ficha del entorno › Dar de baja. Safent deja de entregarle versiones, anula su token y enseña los comandos de limpieza, ya con el nombre del entorno. Ejecutados en el terminal, quitan todo lo de Safent, apps incluidas. Quedan Flux y la configuración de cada app.
Probado de principio a fin en un servidor Ubuntu con k3s, también detrás de un proxy que inspecciona el HTTPS: conectar tarda menos de un minuto y una app queda instalada medio minuto después de poner su configuración. Azure, AWS, Google Cloud y HPE PCAI siguen la documentación oficial de cada proveedor. Safent Developer Team · octubre de 2026.