Kubernetes
Déployez FoxIDs dans votre cluster Kubernetes (K8s) ou Docker Desktop avec Kubernetes activé.
Ceci décrit un déploiement par défaut et une première connexion, ainsi que quelques considérations. Il est attendu que vous deviez personnaliser les fichiers yaml pour répondre à vos besoins, préférences et environnement.
Une installation FoxIDs est comme un seau, il n’y a pas de dépendances externes et il est facile d’atteindre une très haute disponibilité avec peu d’effort.
FoxIDs se met à jour en mettant à jour les deux images Docker www.foxids.com/foxids:x.x.x et www.foxids.com/foxidscontrol:x.x.x
vers une nouvelle version. Les nouvelles versions de FoxIDs sont backward compatible. Veuillez consulter les notes de version avant de mettre à jour. Vous y trouverez également la version actuelle de l’image Docker.
Une licence valide est requise pour accéder aux versions de FoxIDs. À partir de là, vous pouvez générer un secret pour vous authentifier auprès du registre d’images Docker sur www.foxids.com, qui utilise l’authentification Basic.
Prérequis :
- Vous disposez d’un cluster Kubernetes ou de Docker Desktop avec Kubernetes activé.
- Vous avez des connaissances de base sur Kubernetes.
- Vous avez installé
kubectl.
Voici une liste de commandes utiles à la fin de cette description.
Ce déploiement inclut :
- Deux sites web, un pour FoxIDs et un pour FoxIDs Control (le client d’administration et l’API) dans deux images Docker
www.foxids.com/foxids:x.x.xetwww.foxids.com/foxidscontrol:x.x.x. - Les deux sites web sont exposés sur deux domaines différents sécurisés par des certificats Let’s Encrypt générés automatiquement.
- MongoDB est une base de données NoSQL qui contient toutes les données, y compris les tenants, environnements et utilisateurs. Déployée avec l’image Docker officielle MongoDB. Vous pouvez éventuellement utiliser votre propre instance PostgreSQL au lieu de MongoDB.
- Par défaut, le cache est stocké dans la base de données. Vous pouvez utiliser un cache Redis si vous installez un cluster FoxIDs à haut débit. Le cache conserve les séquences (par exemple, connexion et déconnexion) et gère des compteurs pour sécuriser l’authentification contre diverses attaques, ainsi qu’un cache de données (Redis uniquement) pour améliorer les performances. Redis est déployé avec l’image Docker officielle Redis.
- Les journaux sont écrits sur
stdoutoù ils peuvent être collectés par Kubernetes.
Deployment
Le déploiement est réalisé dans l’ordre décrit.
Préparer
Téléchargez les fichiers de configuration Kubernetes yaml ici et placez-les dans un dossier sur votre machine, par exemple C:\FoxIDs\Kubernetes.
Ouvrez une console et accédez au dossier Kubernetes.
Volumes persistants
Vous avez besoin de volumes persistants pour MongoDB et, éventuellement, pour Redis.
Dans un cluster Kubernetes, utilisez ou créez des volumes persistants adaptés et créez une persistent volume claim nommée mongo-data-pvc pour MongoDB et, éventuellement, une autre pour Redis nommée redis-data-pvc.
Vous pouvez utiliser le provisionnement dynamique du stockage avec une StorageClass.
Créer une persistent volume claim pour Mongo
kubectl apply -f k8s-mongo-pvc-dynamic.yaml
Créer éventuellement une persistent volume claim pour Redis
kubectl apply -f k8s-redis-pvc-dynamic.yaml
Kubernetes dans Docker Desktop
Si vous utilisez Kubernetes dans Docker Desktop, vous pouvez créer des volumes persistants sur le système de fichiers hôte - déconseillé pour la production.
Créer un persistent volume pour MongoDB
kubectl apply -f k8s-mongo-pv-dockerdesktop.yaml
Créer une persistent volume claim pour MongoDB
kubectl apply -f k8s-mongo-pvc-dockerdesktop.yaml
Créer éventuellement un persistent volume pour Redis
kubectl apply -f k8s-redis-pv-dockerdesktop.yaml
Créer éventuellement une persistent volume claim pour Redis
kubectl apply -f k8s-redis-pvc-dockerdesktop.yaml
Espace de noms
Ce guide utilise généralement l’espace de noms foxids, envisagez de le modifier en fonction de votre environnement Kubernetes.
Créer un espace de noms
kubectl create namespace foxids
MongoDB
Modifiez le nom d’utilisateur et le mot de passe de MongoDB dans k8s-mongo-secret.yaml. Le nom d’utilisateur et le mot de passe sont encodés en base64.
Vous encodez « the text » en base64 dans un invite de commandes selon votre plateforme :
Windows
powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"the text\"))"
Linux / Mac
echo -n "the text" | base64
Ajouter le secret MongoDB
kubectl apply -f k8s-mongo-secret.yaml -n foxids
Créer MongoDB
Exposez éventuellement MongoDB sur le port 27017 en décommentant LoadBalancer
kubectl apply -f k8s-mongo-deployment.yaml -n foxids
Ajouter un ConfigMap pour le service MongoDB
kubectl apply -f k8s-mongo-configmap.yaml -n foxids
Utiliser éventuellement PostgreSQL au lieu de MongoDB
Modifiez la valeur du nom d’utilisateur dans postgres-username et la valeur du mot de passe dans postgres-password pour correspondre à votre instance PostgreSQL dans k8s-postgres-secret.yaml. Le nom d’utilisateur et le mot de passe sont encodés en base64.
Ajouter le secret PostgreSQL
kubectl apply -f k8s-postgres-secret.yaml -n foxids
Modifier le point de terminaison de la base PostgreSQL dans postgres-db pour correspondre à votre instance PostgreSQL dans k8s-postgres-configmap.yaml
Ajouter un ConfigMap pour le service PostgreSQL
kubectl apply -f k8s-postgres-configmap.yaml -n foxids
Utiliser éventuellement Redis
Créer éventuellement Redis
kubectl apply -f k8s-redis-deployment.yaml -n foxids
Ajouter éventuellement un ConfigMap pour le service Redis
kubectl apply -f k8s-redis-configmap.yaml -n foxids
Sites web FoxIDs
Domaines
Les deux sites FoxIDs sont configurés pour utiliser deux domaines que vous créez et gérez dans votre DNS. Configurez le fichier k8s-foxids-deployment.yaml avec vos domaines :
- Le domaine du site FoxIDs
https://id.itfoxtec.com(deux endroits dans le fichier) doit être remplacé par votre domaine -id.my-domain.com - Le domaine du site FoxIDs Control
https://control.itfoxtec.comdoit être remplacé par votre domaine -control.my-domain.com
Fournisseur d’email Vous pouvez configurer un fournisseur d’email global ou configurer ultérieurement des fournisseurs d’email par environnement. FoxIDs prend en charge l’envoi d’emails avec SendGrid et SMTP.
Le fournisseur d’email global est configuré dans le fichier k8s-foxids-deployment.yaml sur le conteneur/pod foxids dans la section env:.
Cet exemple montre comment ajouter Outlook / Microsoft 365 avec 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"
Important si vous utilisez PostgreSQL
Modifiez la configuration de la base de données et du cache dans k8s-foxids-deployment.yaml (deux endroits dans le fichier).
Sélectionnez PostgreSQL comme base de données au lieu de MongoDb
- name: "Settings__Options__DataStorage"
# value: "MongoDb"
value: "PostgreSql" # PostgreSql database
Sélectionnez PostgreSQL comme cache au lieu de MongoDb, sauf si vous utilisez Redis
- name: "Settings__Options__Cache"
# value: "MongoDb"
value: "PostgreSql" # Cache in PostgreSql database
# value: "Redis" # Cache in Redis
Décommentez la configuration d’accès 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"
Important si vous utilisez Redis
Modifiez la configuration du cache dans k8s-foxids-deployment.yaml (deux endroits dans le fichier).
Sélectionnez Redis comme cache au lieu de MongoDb
- name: "Settings__Options__Cache"
# value: "MongoDb"
# value: "PostgreSql" # Cache in PostgreSql database
value: "Redis" # Cache in Redis
Décommentez la configuration d’accès Redis
- name: REDIS_SERVER
valueFrom:
configMapKeyRef:
name: redis-configmap
key: database_url
- name: "Settings__RedisCache__ConnectionString"
value: "$(REDIS_SERVER):6379"
Déployer Définissez le nom d’utilisateur sur votre ID client et le mot de passe sur votre pull secret pour le registre Docker de FoxIDs. Créez ensuite le secret de registre.
kubectl create secret docker-registry foxids-registry-secret --docker-server=www.foxids.com --docker-username=<customer-id> --docker-password=<pull-secret> -n foxids
Créer les deux sites web FoxIDs
kubectl apply -f k8s-foxids-deployment.yaml -n foxids
La configuration nécessite un contrôleur Nginx. Vous pouvez éventuellement modifier la configuration pour utiliser un autre contrôleur.
Prérequis :
- Vous avez l’installateur Helm.
Installer Helm sur Windows avec cette commande CMD
winget install Helm.Helm
Installer le contrôleur Ingress-Nginx avec deux commandes
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
Vérifier éventuellement l’installation d’Ingress-Nginx
kubectl get pod -n ingress-nginx
Si vous réessayez dans quelques minutes, vous devriez obtenir un EXTERNAL-IP
kubectl get svc -n ingress-nginx ingress-nginx-controller
Les enregistrements DNS des deux domaines doivent pointer vers l’adresse IP de l’installation pour permettre la validation en ligne de Let’s Encrypt. Le pare-feu doit accepter les requêtes sur les ports 80 et 443. Let’s Encrypt valide la propriété du domaine sur le port 80.
Mettre éventuellement à l’échelle le contrôleur Ingress-Nginx
kubectl scale deployment ingress-nginx-controller -n ingress-nginx --replicas=2
Installer Cert-manager avec deux commandes
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
Vérifier éventuellement l’installation de Cert-manager
kubectl get pods -n cert-manager
Ajoutez votre email dans le fichier k8s-letsencrypt-issuer.yaml (deux endroits).
Configurer Let’s Encrypt
kubectl apply -f k8s-letsencrypt-issuer.yaml -n foxids
Le fichier k8s-foxids-ingress-deployment.yaml est configuré avec les domaines :
- Le domaine du site FoxIDs
id.itfoxtec.com(deux endroits dans le fichier) doit être remplacé par votre domaine -id.my-domain.com - Le domaine du site FoxIDs Control
control.itfoxtec.com(deux endroits dans le fichier) doit être remplacé par votre domaine -control.my-domain.com
Pensez à commencer avec Let’s Encrypt en staging pour éviter de dépasser la limite de débit en production (les certificats de staging ne sont pas approuvés par le navigateur). Vous pouvez sélectionner staging ou production dans le fichier
k8s-foxids-ingress-deployment.yaml, configuré par défaut pour la production.
Ajouter l’ingress avec les domaines liés aux certificats
kubectl apply -f k8s-foxids-ingress-deployment.yaml -n foxids
Important ! L’ingress est installé avec les annotations
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"etnginx.ingress.kubernetes.io/proxy-buffer-size: "32k"pour prendre en charge SAML 2.0 où les réponses HTTP peuvent être assez volumineuses.
Vérifier éventuellement l’ingress
kubectl get ingress -n foxids
Vérifier éventuellement l’émetteur de certificats
kubectl describe ClusterIssuer letsencrypt-production -n foxids
#staging
# kubectl describe ClusterIssuer letsencrypt-staging -n foxids
Vérifier éventuellement si le certificat est prêt (READY doit être True)
kubectl get certificate -n foxids
Et vérifier éventuellement le certificat
kubectl describe certificate letsencrypt-production -n foxids
#staging
# kubectl describe certificate letsencrypt-staging -n foxids
First login
Ouvrez le domaine de votre site FoxIDs Control dans un navigateur.
Il doit rediriger vers le site FoxIDs où vous vous connectez avec l’utilisateur administrateur par défaut admin@foxids.com et le mot de passe FirstAccess! (vous devez changer le mot de passe lors de la première connexion).
Vous êtes ensuite redirigé vers le site FoxIDs Control dans le tenant master. Vous pouvez ajouter d’autres utilisateurs administrateurs dans le tenant master.
Ensuite, cliquez sur le tenant main et authentifiez-vous à nouveau avec le même utilisateur administrateur par défaut admin@foxids.com et le mot de passe FirstAccess! (vous devez à nouveau changer le mot de passe).
L’utilisateur administrateur par défaut et le mot de passe sont identiques pour le tenant
masteret le tenantmain, mais ce sont deux utilisateurs différents.
Vous êtes maintenant connecté au tenant main et pouvez commencer à configurer vos applications et méthodes d’authentification.
Données de démarrage
La base de données est automatiquement amorcée en fonction des domaines configurés. Par conséquent, vous devez supprimer la base de données si les domaines changent. Pour supprimer les données, vous pouvez soit arrêter le pod de base de données et supprimer le dossier ou les fichiers physiques de la base de données. Ou exposer le point de terminaison de la base et ouvrir la base dans MongoDB Compass (télécharger MongoDB Compass (GUI)) et supprimer la base de données. Ensuite, le pod FoxIDs Control doit être redémarré pour initier un nouveau processus d’amorçage.
Option avancée : les domaines peuvent également être modifiés manuellement dans la base de données.
Considerations
Cette section répertorie certaines considérations de déploiement et de sécurité.
Kubernetes Service Mesh Il est recommandé d’utiliser un Kubernetes Service Mesh pour obtenir une architecture zero-trust, où le trafic interne est sécurisé par mTLS (mutual TLS) et le chiffrement.
PKI interne / CA racine Si le trafic interne est terminé et ré-chiffré par un proxy ou un service mesh avec une CA racine interne, configurez les conteneurs FoxIDs pour faire confiance à cette CA. Voir Kubernetes internal CA.
Espace de noms
Ce guide utilise généralement l’espace de noms foxids, envisagez de le modifier en fonction de votre environnement Kubernetes.
Créer un espace de noms
kubectl create namespace test
Lister les espaces de noms
kubectl get namespaces
Appliquer l’espace de noms lors de la création d’un pod
kubectl apply -f xxx.yaml --namespace=test
Journalisation
Tous les journaux FoxIDs, y compris les erreurs, traces et événements, sont écrits sur stdout. Considérez comment gérer les journaux d’application et collecter les journaux des conteneurs.
Limitation de débit
Configurez des limites de connexions et de débits de transmission dans k8s-foxids-ingress-deployment.yaml.
MongoDB Operator Envisagez MongoDB Operator si vous avez besoin de plusieurs instances de MongoDB.
Redis multiple pods / cluster Envisagez une configuration Redis mise à l’échelle si vous avez besoin de plusieurs instances de Redis.
- Redis master/replica setup in Kubernetes
- Redis on Kubernetes
- Redis Enterprise cluster on Kubernetes and architecture
Sauvegarde Déterminez si les données MongoDB doivent être sauvegardées et à quel niveau, voici trois solutions possibles. Il est considéré comme moins important de sauvegarder Redis.
- Sauvegarder le stockage physique du volume persistant.
- Sauvegarde avec un Cron Job Kubernetes.
- La sauvegarde est prise en charge dans MongoDB Enterprise Kubernetes Operator.
Update
FoxIDs se met à jour en mettant à jour chaque image FoxIDs vers une nouvelle version, les deux images FoxIDs sont rétrocompatibles. Mettez d’abord à jour l’image foxids/foxids puis l’image foxids/foxids-control.
Il devrait également être possible de mettre à jour les images MongoDB et Redis avec les données dans les volumes persistants.
Useful commands
Voici une liste de commandes qui peuvent être utiles pendant le déploiement pour consulter des détails et apporter des modifications.
Créer un pod
kubectl apply -f ks8-xxx.yaml
Supprimer un pod
kubectl delete -f ks8-xxx.yaml
Lister les pods
kubectl get pods
Obtenir la description d’un pod
kubectl describe pod xxx
Obtenir les journaux d’un pod
kubectl logs xxx
Lister les déploiements
kubectl get deployments
Lister les services
kubectl get services
Lister les secrets
kubectl get secrets
Lister les volumes persistants
kubectl get pv
Lister les persistent volume claims
kubectl get pvc
Lister l’ingress
kubectl get ingress
Décrire l’ingress
kubectl describe ingress xxx