Kubernetes
Deploy FoxIDs in je Kubernetes (K8s) cluster of Docker Desktop met Kubernetes ingeschakeld.
Dit is een beschrijving van hoe je een standaard deployment uitvoert en voor het eerst inlogt, evenals enkele overwegingen. Er wordt verwacht dat je de yaml bestanden aanpast aan je behoeften, voorkeuren en omgeving.
Een FoxIDs installatie is als een bucket, er zijn geen externe dependencies en het is eenvoudig om met weinig moeite een zeer hoge uptime te bereiken.
FoxIDs wordt geüpdatet door de twee Docker images www.foxids.com/foxids:x.x.x en www.foxids.com/foxidscontrol:x.x.x
naar een nieuwe versie te updaten. Nieuwe FoxIDs releases zijn backward compatible. Bekijk de release notes voordat je update. Daar vind je ook de huidige Docker image versie.
Een geldige licentie is vereist om toegang te krijgen tot de FoxIDs releases. Van daaruit kun je een secret genereren om te authenticeren bij het Docker image register op www.foxids.com, dat Basic authentication gebruikt.
Voorwaarden:
- Je hebt een Kubernetes cluster of Docker Desktop met Kubernetes ingeschakeld.
- Je hebt basiskennis van Kubernetes.
- Je hebt
kubectlgeïnstalleerd.
Dit is een lijst met handige commando's aan het einde van deze beschrijving.
Deze deployment omvat:
- Twee websites: één voor FoxIDs en één voor FoxIDs Control (de admin Client en API) in twee Docker images
www.foxids.com/foxids:x.x.xenwww.foxids.com/foxidscontrol:x.x.x. - De twee websites worden op twee verschillende domeinen blootgesteld en beveiligd met automatisch gegenereerde Let's Encrypt certificaten.
- MongoDB is een NoSQL database en bevat alle data inclusief tenants, omgevingen en gebruikers. Gedeployed met het officiële MongoDB Docker image. Je kunt optioneel je eigen PostgreSQL instance gebruiken in plaats van MongoDB.
- Standaard wordt de cache in de database bewaard. Gebruik optioneel een Redis cache als je een FoxIDs cluster met hoge throughput installeert. De cache bevat sequenties (bijv. login en logout) en counters om authenticatie te beveiligen tegen verschillende aanvallen en data cache (alleen Redis) om performance te verbeteren. Redis wordt gedeployed met het officiële Redis Docker image.
- Logs worden naar
stdoutgeschreven waar Kubernetes ze kan oppakken.
Deployment
De deployment wordt in de beschreven volgorde uitgevoerd.
Voorbereiden
Download de Kubernetes yaml configuratiebestanden hier en plaats ze in een map op je machine, bijvoorbeeld C:\FoxIDs\Kubernetes.
Open een console en navigeer naar de map Kubernetes.
Persistente volumes
Je hebt persistente volumes nodig voor MongoDB en optioneel Redis.
Gebruik of maak geschikte persistente volumes in een Kubernetes cluster en maak een persistent volume claim met de naam mongo-data-pvc voor MongoDB en optioneel één voor Redis met de naam redis-data-pvc.
Je kunt mogelijk dynamische storage provisioning gebruiken met StorageClass.
Maak persistent volume claim voor Mongo
kubectl apply -f k8s-mongo-pvc-dynamic.yaml
Maak optioneel persistent volume claim voor Redis
kubectl apply -f k8s-redis-pvc-dynamic.yaml
Kubernetes in Docker Desktop
Als je Kubernetes in Docker Desktop gebruikt, kun je persistente volumes op het host file system maken - niet aanbevolen voor productie.
Maak persistent volume voor MongoDB
kubectl apply -f k8s-mongo-pv-dockerdesktop.yaml
Maak persistent volume claim voor MongoDB
kubectl apply -f k8s-mongo-pvc-dockerdesktop.yaml
Maak optioneel persistent volume voor Redis
kubectl apply -f k8s-redis-pv-dockerdesktop.yaml
Maak optioneel persistent volume claim voor Redis
kubectl apply -f k8s-redis-pvc-dockerdesktop.yaml
Namespace
Deze gids gebruikt doorgaans de namespace foxids, overweeg om de namespace te wijzigen zodat deze past bij je Kubernetes omgeving.
Maak namespace
kubectl create namespace foxids
MongoDB
Wijzig de gebruikersnaam en het wachtwoord voor MongoDB in k8s-mongo-secret.yaml. De gebruikersnaam en het wachtwoord zijn base64 gecodeerd.
Je base64 encodeert "de tekst" in een command prompt afhankelijk van je platform:
Windows
powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"the text\"))"
Linux / Mac
echo -n "the text" | base64
Voeg de MongoDB secret toe
kubectl apply -f k8s-mongo-secret.yaml -n foxids
Maak MongoDB
Exposeer optioneel MongoDB op poort 27017 door de LoadBalancer te uncommenten
kubectl apply -f k8s-mongo-deployment.yaml -n foxids
Voeg een ConfigMap toe voor de MongoDB service
kubectl apply -f k8s-mongo-configmap.yaml -n foxids
Optioneel PostgreSQL gebruiken in plaats van MongoDB
Wijzig de username waarde in postgres-username en de password waarde in postgres-password zodat deze overeenkomen met je PostgreSQL instance in k8s-postgres-secret.yaml. De gebruikersnaam en het wachtwoord zijn base64 gecodeerd.
Voeg de PostgreSQL secret toe
kubectl apply -f k8s-postgres-secret.yaml -n foxids
Wijzig het PostgreSQL database endpoint in postgres-db zodat dit overeenkomt met je PostgreSQL instance in k8s-postgres-configmap.yaml
Voeg een ConfigMap toe voor de PostgreSQL service
kubectl apply -f k8s-postgres-configmap.yaml -n foxids
Optioneel Redis gebruiken
Maak optioneel Redis
kubectl apply -f k8s-redis-deployment.yaml -n foxids
Voeg optioneel een ConfigMap toe voor de Redis service
kubectl apply -f k8s-redis-configmap.yaml -n foxids
FoxIDs websites
Domeinen
De twee FoxIDs websites zijn geconfigureerd om twee domeinen te gebruiken die je in je DNS beheert. Configureer het k8s-foxids-deployment.yaml bestand met je gekozen domeinen:
- Het FoxIDs site domein
https://id.itfoxtec.com(twee plekken in het bestand) wordt aangepast naar je domein -id.my-domain.com - Het FoxIDs Control site domein
https://control.itfoxtec.comwordt aangepast naar je domein -control.my-domain.com
Email provider
Je kunt optioneel een globale email provider configureren of later per omgeving email providers configureren. FoxIDs ondersteunt het verzenden van e-mails met SendGrid en SMTP.
De globale email provider wordt geconfigureerd in het k8s-foxids-deployment.yaml bestand op de foxids container/pod in de env: sectie.
Dit voorbeeld laat zien hoe je Outlook / Microsoft 365 met SMTP toevoegt:
- name: "Settings__Smtp__FromEmail"
value: "my@email-address.org"
- name: "Settings__Smtp__FromName" # Optionele afzendernaam geassocieerd met het e-mailadres
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"
Belangrijk als je PostgreSQL gebruikt
Wijzig de database- en cacheconfiguratie in k8s-foxids-deployment.yaml (twee plekken in het bestand).
Selecteer PostgreSQL als database in plaats van MongoDb
- name: "Settings__Options__DataStorage"
# value: "MongoDb"
value: "PostgreSql" # PostgreSql database
Selecteer PostgreSQL als cache in plaats van MongoDb tenzij je Redis gebruikt
- name: "Settings__Options__Cache"
# value: "MongoDb"
value: "PostgreSql" # Cache in PostgreSql database
# value: "Redis" # Cache in Redis
Uncomment de PostgreSQL access configuratie
- 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"
Belangrijk als je Redis gebruikt
Wijzig de cacheconfiguratie in k8s-foxids-deployment.yaml (twee plekken in het bestand).
Selecteer Redis als cache in plaats van MongoDb
- name: "Settings__Options__Cache"
# value: "MongoDb"
# value: "PostgreSql" # Cache in PostgreSql database
value: "Redis" # Cache in Redis
Uncomment de Redis access configuratie
- name: REDIS_SERVER
valueFrom:
configMapKeyRef:
name: redis-configmap
key: database_url
- name: "Settings__RedisCache__ConnectionString"
value: "$(REDIS_SERVER):6379"
Deploy
Stel de gebruikersnaam in op je klant-ID en het wachtwoord op je pull secret voor het FoxIDs Docker register. Maak daarna de registry secret aan.
kubectl create secret docker-registry foxids-registry-secret --docker-server=www.foxids.com --docker-username=<customer-id> --docker-password=<pull-secret> -n foxids
Maak de twee FoxIDs websites aan
kubectl apply -f k8s-foxids-deployment.yaml -n foxids
De configuratie vereist een Nginx controller. Je kunt de configuratie optioneel aanpassen om een andere controller te gebruiken.
Voorwaarden:
- Je hebt Helm geïnstalleerd.
Installeer Helm op Windows met dit CMD commandowinget install Helm.Helm
Installeer Ingress-Nginx controller met twee commando's
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
Optioneel de Ingress-Nginx installatie verifiëren
kubectl get pod -n ingress-nginx
Als je het na enkele minuten opnieuw probeert, krijg je een EXTERNAL-IP
kubectl get svc -n ingress-nginx ingress-nginx-controller
DNS records naar de twee domeinen moeten verwijzen naar het IP adres van de installatie om Let's Encrypt online validatie te kunnen uitvoeren.
De firewall moet requests op poort 80 en 443 accepteren. Let's Encrypt valideert het domeineigendom op poort 80.
Optioneel de Ingress-Nginx controller schalen
kubectl scale deployment ingress-nginx-controller -n ingress-nginx --replicas=2
Installeer Cert-manager met twee commando's
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
Optioneel de Cert-manager installatie verifiëren
kubectl get pods -n cert-manager
Voeg je e-mailadres toe in het k8s-letsencrypt-issuer.yaml (twee plekken) bestand.
Configureer Let's Encrypt
kubectl apply -f k8s-letsencrypt-issuer.yaml -n foxids
Het k8s-foxids-ingress-deployment.yaml bestand is geconfigureerd met de domeinen:
- Het FoxIDs site domein
id.itfoxtec.com(twee plekken in het bestand) wordt aangepast naar je domein -id.my-domain.com - Het FoxIDs Control site domein
control.itfoxtec.com(twee plekken in het bestand) wordt aangepast naar je domein -control.my-domain.com
Overweeg om te starten met Let's Encrypt in staging om de Let's Encrypt productie rate limit niet te raken (staging certificaten worden door de browser niet vertrouwd).
Je kunt optioneel staging of productie kiezen in hetk8s-foxids-ingress-deployment.yamlbestand, standaard geconfigureerd voor productie.
Voeg ingress toe met certificate bound domeinen
kubectl apply -f k8s-foxids-ingress-deployment.yaml -n foxids
Belangrijk! Ingress is geïnstalleerd met de annotaties
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"ennginx.ingress.kubernetes.io/proxy-buffer-size: "32k"om SAML 2.0 te ondersteunen waar HTTP responses behoorlijk groot kunnen zijn.
Optioneel Ingress verifiëren
kubectl get ingress -n foxids
Optioneel certificate issuer verifiëren
kubectl describe ClusterIssuer letsencrypt-production -n foxids
#staging
# kubectl describe ClusterIssuer letsencrypt-staging -n foxids
Optioneel controleren of het certificaat klaar is (READY moet True zijn)
kubectl get certificate -n foxids
En optioneel het certificaat verifiëren
kubectl describe certificate letsencrypt-production -n foxids
#staging
# kubectl describe certificate letsencrypt-staging -n foxids
First login
Open je FoxIDs Control site domein in een browser.
Deze zou moeten doorsturen naar de FoxIDs site waar je inlogt met de standaard admin gebruiker admin@foxids.com en wachtwoord FirstAccess! (je moet het wachtwoord wijzigen bij de eerste login).
Je wordt daarna teruggeleid naar de FoxIDs Control site in de master tenant. Je kunt meer admin users toevoegen in de master tenant.
Klik vervolgens op de main tenant en authenticeer opnieuw met dezelfde standaard admin gebruiker admin@foxids.com en wachtwoord FirstAccess! (ook hier moet je het wachtwoord wijzigen).
De standaard admin gebruiker en het wachtwoord zijn hetzelfde voor zowel de
mastertenant als demaintenant, maar het zijn twee verschillende gebruikers.
Je bent nu ingelogd op de main tenant en kunt starten met het configureren van je applicaties en authenticatiemethoden.
Seed data
De database wordt automatisch geseed op basis van de geconfigureerde domeinen. Daarom moet je de database verwijderen als de domeinen wijzigen.
Om de data te verwijderen; je kunt de database pod stoppen en de fysieke database map of bestanden verwijderen.
Of het database endpoint exposen en de database openen in MongoDB Compass (download MongoDB Compass Download (GUI)) en de database verwijderen.
Daarna moet de FoxIDs Control pod worden herstart om een nieuw seed proces te starten.
Geavanceerde optie: de domeinen kunnen ook handmatig in de database worden gewijzigd.
Overwegingen
Deze sectie bevat enkele deployment- en securityoverwegingen.
Kubernetes Service Mesh
Het wordt aanbevolen om een Kubernetes Service Mesh te gebruiken om een zero-trust architectuur te bereiken, waarbij intern verkeer met mutual TLS (mTLS) en encryptie is beveiligd.
Interne PKI / root CA
Als intern verkeer wordt beëindigd en opnieuw versleuteld door een proxy of service mesh met een interne root CA, configureer dan de FoxIDs containers om die CA te vertrouwen. Zie Kubernetes internal CA.
Namespace
Deze gids gebruikt doorgaans de namespace foxids, overweeg om de namespace te wijzigen zodat deze past bij je Kubernetes omgeving.
Maak namespace
kubectl create namespace test
Lijst namespaces
kubectl get namespaces
Namespace toepassen bij pod creation
kubectl apply -f xxx.yaml --namespace=test
Log
Alle logs van FoxIDs inclusief errors, trace en events worden naar stdout geschreven. Overweeg hoe je application logs afhandelt en logs van de containers verzamelt.
Rate Limiting
Configureer limieten op verbindingen en transmissiesnelheden in k8s-foxids-ingress-deployment.yaml.
MongoDB Operator
Overweeg MongoDB Operator als je meerdere instances van MongoDB nodig hebt.
Redis meerdere pods / cluster
Overweeg een geschaalde Redis setup als je meerdere instances van Redis nodig hebt.
- Redis master/replica setup in Kubernetes
- Redis on Kubernetes
- Redis Enterprise cluster op Kubernetes en architectuur
Backup
Overweeg of MongoDB data geback-upt moet worden en op welk niveau, hier zijn drie mogelijke oplossingen. Het is minder belangrijk om Redis te back-uppen.
- Backup de fysieke data store van het persistente volume.
- Backup met een Kubernetes Cron Job.
- Backup wordt ondersteund in MongoDB Enterprise Kubernetes Operator.
Update
FoxIDs wordt geüpdatet door elk FoxIDs image naar een nieuwe versie te updaten, de twee FoxIDs images zijn backwards compatible. Update eerst het foxids/foxids image en daarna het foxids/foxids-control image.
Het zou ook mogelijk moeten zijn om het MongoDB image en Redis images te updaten met data in persistente volumes.
Handige commando's
Dit is een lijst met commando's die handig kunnen zijn tijdens de deployment om details te bekijken en wijzigingen door te voeren.
Pod maken
kubectl apply -f ks8-xxx.yaml
Pod verwijderen
kubectl delete -f ks8-xxx.yaml
Pods tonen
kubectl get pods
Pod beschrijving ophalen
kubectl describe pod xxx
Pod logs ophalen
kubectl logs xxx
Deployments tonen
kubectl get deployments
Services tonen
kubectl get services
Secrets tonen
kubectl get secrets
Persistente volumes tonen
kubectl get pv
Persistente volume claims tonen
kubectl get pvc
Ingress tonen
kubectl get ingress
Ingress beschrijven
kubectl describe ingress xxx