Kubernetes
Implementa FoxIDs en tu clúster de Kubernetes (K8s) o en Docker Desktop con Kubernetes habilitado.
Esta es una descripción de cómo hacer un despliegue predeterminado y iniciar sesión por primera vez, además de algunas consideraciones. Se espera que necesites personalizar los archivos yaml para adaptarlos a tus necesidades, preferencias y entorno.
Una instalación de FoxIDs es como un cubo, no hay dependencias externas y es fácil alcanzar una disponibilidad muy alta con poco esfuerzo.
FoxIDs se actualiza actualizando las dos imágenes Docker www.foxids.com/foxids:x.x.x y www.foxids.com/foxidscontrol:x.x.x
a una nueva versión. Las nuevas versiones de FoxIDs son backward compatible. Revise las notas de versión antes de actualizar. Allí también puede encontrar la versión actual de la imagen Docker.
Se requiere una licencia válida para acceder a las versiones de FoxIDs. Desde allí, puede generar un secret para autenticarse en el registro de imágenes Docker en www.foxids.com, que usa autenticación Basic.
Requisitos previos:
- Tienes un clúster de Kubernetes o Docker Desktop con Kubernetes habilitado.
- Tienes conocimientos básicos de Kubernetes.
- Tienes instalado
kubectl.
Esta es una lista de comandos útiles al final de esta descripción.
Este despliegue incluye:
- Dos sitios web, uno para FoxIDs y otro para FoxIDs Control (el cliente de administración y la API) en dos imágenes Docker
www.foxids.com/foxids:x.x.xywww.foxids.com/foxidscontrol:x.x.x. - Los dos sitios web están expuestos en dos dominios distintos, asegurados con certificados Let’s Encrypt generados automáticamente.
- MongoDB es una base de datos NoSQL y contiene todos los datos, incluidos tenants, entornos y usuarios. Se implementa con la imagen Docker oficial de MongoDB. Opcionalmente puedes usar tu propia instancia de PostgreSQL en lugar de MongoDB.
- De forma predeterminada, el caché se guarda en la base de datos. Opcionalmente usa un caché Redis si vas a instalar un clúster de FoxIDs con alto rendimiento. El caché mantiene secuencias (p. ej., inicio y cierre de sesión) y gestiona contadores para proteger la autenticación contra varios ataques, y un caché de datos (solo Redis) para mejorar el rendimiento. Redis se implementa con la imagen Docker oficial de Redis.
- Los registros se escriben en
stdout, donde Kubernetes puede recogerlos.
Deployment
El despliegue se realiza en el orden descrito.
Preparar
Descargue los archivos de configuración Kubernetes yaml aquí y colóquelos en una carpeta en su equipo, por ejemplo C:\FoxIDs\Kubernetes.
Abra una consola y navegue a la carpeta Kubernetes.
Volúmenes persistentes
Necesitas volúmenes persistentes para MongoDB y, opcionalmente, para Redis.
En un clúster de Kubernetes, usa o crea volúmenes persistentes adecuados y crea una persistent volume claim con el nombre mongo-data-pvc para MongoDB y, opcionalmente, una para Redis con el nombre redis-data-pvc.
Puedes usar el aprovisionamiento dinámico de almacenamiento con StorageClass.
Crear persistent volume claim para Mongo
kubectl apply -f k8s-mongo-pvc-dynamic.yaml
Crear opcionalmente persistent volume claim para Redis
kubectl apply -f k8s-redis-pvc-dynamic.yaml
Kubernetes en Docker Desktop
Si usas Kubernetes en Docker Desktop puedes crear volúmenes persistentes en el sistema de archivos del host; no se recomienda para producción.
Crear persistent volume para MongoDB
kubectl apply -f k8s-mongo-pv-dockerdesktop.yaml
Crear persistent volume claim para MongoDB
kubectl apply -f k8s-mongo-pvc-dockerdesktop.yaml
Crear opcionalmente persistent volume para Redis
kubectl apply -f k8s-redis-pv-dockerdesktop.yaml
Crear opcionalmente persistent volume claim para Redis
kubectl apply -f k8s-redis-pvc-dockerdesktop.yaml
Espacio de nombres
Esta guía generalmente usa el espacio de nombres foxids, considera cambiarlo para adaptarlo a tu entorno de Kubernetes.
Crear espacio de nombres
kubectl create namespace foxids
MongoDB
Cambia el nombre de usuario y la contraseña de MongoDB en k8s-mongo-secret.yaml. El nombre de usuario y la contraseña están codificados en base64.
Codifica en base64 «the text» en un símbolo del sistema según tu plataforma:
Windows
powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"the text\"))"
Linux / Mac
echo -n "the text" | base64
Agregar el secreto de MongoDB
kubectl apply -f k8s-mongo-secret.yaml -n foxids
Crear MongoDB
Opcionalmente expón MongoDB en el puerto 27017 descomentando LoadBalancer
kubectl apply -f k8s-mongo-deployment.yaml -n foxids
Agregar un ConfigMap para el servicio de MongoDB
kubectl apply -f k8s-mongo-configmap.yaml -n foxids
Opcionalmente usar PostgreSQL en lugar de MongoDB
Cambia el valor del nombre de usuario en postgres-username y el valor de la contraseña en postgres-password para que coincidan con tu instancia de PostgreSQL en k8s-postgres-secret.yaml. El nombre de usuario y la contraseña están codificados en base64.
Agregar el secreto de PostgreSQL
kubectl apply -f k8s-postgres-secret.yaml -n foxids
Cambia el endpoint de la base de datos PostgreSQL en postgres-db para que coincida con tu instancia de PostgreSQL en k8s-postgres-configmap.yaml
Agregar un ConfigMap para el servicio de PostgreSQL
kubectl apply -f k8s-postgres-configmap.yaml -n foxids
Opcionalmente usar Redis
Crear Redis opcionalmente
kubectl apply -f k8s-redis-deployment.yaml -n foxids
Agregar opcionalmente un ConfigMap para el servicio de Redis
kubectl apply -f k8s-redis-configmap.yaml -n foxids
Sitios web de FoxIDs
Dominios
Los dos sitios web de FoxIDs están configurados para usar dos dominios que creas y administras en tu DNS. Configura el archivo k8s-foxids-deployment.yaml con tus dominios seleccionados:
- El dominio del sitio FoxIDs
https://id.itfoxtec.com(dos lugares en el archivo) se cambia por tu dominio -id.my-domain.com - El dominio del sitio FoxIDs Control
https://control.itfoxtec.comse cambia por tu dominio -control.my-domain.com
Proveedor de correo electrónico Puedes configurar un proveedor global de correo o configurar más tarde proveedores de correo por entorno. FoxIDs admite el envío de correos con SendGrid y SMTP.
El proveedor global de correo se configura en el archivo k8s-foxids-deployment.yaml en el contenedor/pod foxids dentro de la sección env:.
Este ejemplo muestra cómo agregar Outlook / Microsoft 365 con SMTP:
- name: "Settings__Smtp__FromEmail"
value: "my@email-address.org"
- name: "Settings__Smtp__FromName" # Optional from name associated to the email address
value: "e.g, my company name"
- name: "Settings__Smtp__Host"
value: "smtp.office365.com"
- name: "Settings__Smtp__Port"
value: "587"
- name: "Settings__Smtp__Username"
value: "my@email-address.com"
- name: "Settings__Smtp__Password"
value: "xxxxxxx"
Importante si usas PostgreSQL
Cambia la configuración de la base de datos y del caché en k8s-foxids-deployment.yaml (dos lugares en el archivo).
Selecciona PostgreSQL como base de datos en lugar de MongoDb
- name: "Settings__Options__DataStorage"
# value: "MongoDb"
value: "PostgreSql" # PostgreSql database
Selecciona PostgreSQL como caché en lugar de MongoDb a menos que uses Redis
- name: "Settings__Options__Cache"
# value: "MongoDb"
value: "PostgreSql" # Cache in PostgreSql database
# value: "Redis" # Cache in Redis
Descomenta la configuración de acceso a PostgreSQL
- name: POSTGRES_USERNAME
valueFrom:
secretKeyRef:
name: postgres-secret
key: postgres-username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: postgres-password
- name: POSTGRES_SERVER
valueFrom:
configMapKeyRef:
name: postgres-configmap
key: database_url
- name: "Settings__PostgreSql__ConnectionString"
value: "Host=$(POSTGRES_SERVER);Username=$(POSTGRES_USERNAME);Password=$(POSTGRES_PASSWORD);Database=FoxIDs"
Importante si usas Redis
Cambia la configuración del caché en k8s-foxids-deployment.yaml (dos lugares en el archivo).
Selecciona Redis como caché en lugar de MongoDb
- name: "Settings__Options__Cache"
# value: "MongoDb"
# value: "PostgreSql" # Cache in PostgreSql database
value: "Redis" # Cache in Redis
Descomenta la configuración de acceso a Redis
- name: REDIS_SERVER
valueFrom:
configMapKeyRef:
name: redis-configmap
key: database_url
- name: "Settings__RedisCache__ConnectionString"
value: "$(REDIS_SERVER):6379"
Desplegar Configura el nombre de usuario con tu ID de cliente y la contraseña con tu pull secret para el registro Docker de FoxIDs. Después crea el secret del registro.
kubectl create secret docker-registry foxids-registry-secret --docker-server=www.foxids.com --docker-username=<customer-id> --docker-password=<pull-secret> -n foxids
Crear los dos sitios web de FoxIDs
kubectl apply -f k8s-foxids-deployment.yaml -n foxids
La configuración requiere un controlador Nginx. Puedes cambiar la configuración para usar otro controlador.
Requisitos previos:
- Tienes el instalador Helm.
Instala Helm en Windows con este comando CMD
winget install Helm.Helm
Instalar el controlador Ingress-Nginx con dos comandos
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx --force-update
helm -n ingress-nginx install ingress-nginx ingress-nginx/ingress-nginx --create-namespace
Verificar opcionalmente la instalación de Ingress-Nginx
kubectl get pod -n ingress-nginx
Si lo intentas de nuevo en unos minutos deberías obtener un EXTERNAL-IP
kubectl get svc -n ingress-nginx ingress-nginx-controller
Los registros DNS de los dos dominios deben apuntar a la dirección IP de la instalación para permitir la validación en línea de Let’s Encrypt. El firewall debe aceptar solicitudes en los puertos 80 y 443. Let’s Encrypt valida la propiedad del dominio en el puerto 80.
Escalar opcionalmente el controlador Ingress-Nginx
kubectl scale deployment ingress-nginx-controller -n ingress-nginx --replicas=2
Instalar Cert-manager con dos comandos
helm repo add jetstack https://charts.jetstack.io --force-update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true
Verificar opcionalmente la instalación de Cert-manager
kubectl get pods -n cert-manager
Agrega tu correo en el archivo k8s-letsencrypt-issuer.yaml (dos lugares).
Configurar Let’s Encrypt
kubectl apply -f k8s-letsencrypt-issuer.yaml -n foxids
El archivo k8s-foxids-ingress-deployment.yaml está configurado con los dominios:
- El dominio del sitio FoxIDs
id.itfoxtec.com(dos lugares en el archivo) se cambia por tu dominio -id.my-domain.com - El dominio del sitio FoxIDs Control
control.itfoxtec.com(dos lugares en el archivo) se cambia por tu dominio -control.my-domain.com
Considera comenzar con Let’s Encrypt en staging para evitar alcanzar el límite de tasa en producción (los certificados de staging no son confiables para el navegador). Opcionalmente selecciona staging o producción en el archivo
k8s-foxids-ingress-deployment.yaml, configurado por defecto para producción.
Agregar ingress con dominios enlazados a los certificados
kubectl apply -f k8s-foxids-ingress-deployment.yaml -n foxids
¡Importante! El ingress se instala con las anotaciones
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"ynginx.ingress.kubernetes.io/proxy-buffer-size: "32k"para admitir SAML 2.0 donde las respuestas HTTP pueden ser bastante grandes.
Verificar opcionalmente el ingress
kubectl get ingress -n foxids
Verificar opcionalmente el emisor de certificados
kubectl describe ClusterIssuer letsencrypt-production -n foxids
#staging
# kubectl describe ClusterIssuer letsencrypt-staging -n foxids
Verificar opcionalmente si el certificado está listo (READY debe ser True)
kubectl get certificate -n foxids
Y verificar opcionalmente el certificado
kubectl describe certificate letsencrypt-production -n foxids
#staging
# kubectl describe certificate letsencrypt-staging -n foxids
First login
Abre el dominio del sitio FoxIDs Control en un navegador.
Debería redirigir al sitio FoxIDs donde inicias sesión con el usuario administrador predeterminado admin@foxids.com y la contraseña FirstAccess! (debes cambiar la contraseña en el primer inicio de sesión).
Luego se te redirige de nuevo al sitio FoxIDs Control en el tenant master. Puedes agregar más usuarios administradores en el tenant master.
Después, haz clic en el tenant main e inicia sesión de nuevo con el mismo usuario administrador predeterminado admin@foxids.com y la contraseña FirstAccess! (de nuevo debes cambiar la contraseña).
El usuario administrador predeterminado y la contraseña son los mismos para el tenant
mastery el tenantmain, pero son dos usuarios diferentes.
Ahora has iniciado sesión en el tenant main y puedes empezar a configurar tus aplicaciones y métodos de autenticación.
Datos de inicialización
La base de datos se inicializa automáticamente según los dominios configurados. Por lo tanto, debes eliminar la base de datos si cambian los dominios. Para eliminar los datos, puedes detener el pod de la base de datos y eliminar la carpeta o los archivos físicos de la base de datos. O exponer el endpoint de la base de datos y abrirla en MongoDB Compass (descargar MongoDB Compass (GUI)) y eliminar la base de datos. Después, el pod de FoxIDs Control debe reiniciarse para iniciar un nuevo proceso de inicialización.
Opción avanzada: los dominios también se pueden cambiar manualmente en la base de datos.
Considerations
Esta sección enumera algunas consideraciones de despliegue y seguridad.
Kubernetes Service Mesh Se recomienda usar un Kubernetes Service Mesh para lograr una arquitectura de zero-trust, donde el tráfico interno esté protegido con mTLS (mutual TLS) y cifrado.
PKI interna / CA raíz Si el tráfico interno es terminado y reencriptado por un proxy o service mesh con una CA raíz interna, configura los contenedores FoxIDs para que confíen en esa CA. Ver Kubernetes internal CA.
Espacio de nombres
Esta guía generalmente usa el espacio de nombres foxids, considera cambiarlo para adaptarlo a tu entorno de Kubernetes.
Crear espacio de nombres
kubectl create namespace test
Listar espacios de nombres
kubectl get namespaces
Aplicar el espacio de nombres al crear un pod
kubectl apply -f xxx.yaml --namespace=test
Registro
Todos los registros de FoxIDs, incluidos errores, trazas y eventos, se escriben en stdout. Considera cómo gestionar los registros de la aplicación y recopilar los registros de los contenedores.
Limitación de velocidad
Configura límites de conexiones y tasas de transmisión en k8s-foxids-ingress-deployment.yaml.
MongoDB Operator Considera MongoDB Operator si necesitas varias instancias de MongoDB.
Redis varios pods / clúster Considera una configuración Redis escalada si necesitas varias instancias de Redis.
- Redis master/replica setup in Kubernetes
- Redis on Kubernetes
- Redis Enterprise cluster on Kubernetes and architecture
Copia de seguridad Considera si los datos de MongoDB deben respaldarse y a qué nivel; aquí hay tres soluciones posibles. Se considera menos importante respaldar Redis.
- Respaldar el almacenamiento físico del volumen persistente.
- Respaldo con un Cron Job de Kubernetes.
- El respaldo está soportado en MongoDB Enterprise Kubernetes Operator.
Update
FoxIDs se actualiza actualizando cada imagen de FoxIDs a una nueva versión; las dos imágenes de FoxIDs son compatibles hacia atrás. Primero actualiza la imagen foxids/foxids y luego la imagen foxids/foxids-control.
También debería ser posible actualizar las imágenes de MongoDB y Redis con datos en los volúmenes persistentes.
Useful commands
Esta es una lista de comandos que pueden ser útiles durante el despliegue para ver detalles y realizar cambios.
Crear pod
kubectl apply -f ks8-xxx.yaml
Eliminar pod
kubectl delete -f ks8-xxx.yaml
Listar pods
kubectl get pods
Obtener descripción del pod
kubectl describe pod xxx
Obtener registros del pod
kubectl logs xxx
Listar deployments
kubectl get deployments
Listar servicios
kubectl get services
Listar secretos
kubectl get secrets
Listar volúmenes persistentes
kubectl get pv
Listar persistent volume claims
kubectl get pvc
Listar ingress
kubectl get ingress
Describir ingress
kubectl describe ingress xxx