Kubernetes
Deploy FoxIDs i din Kubernetes (K8s) klynge eller Docker Desktop med Kubernetes aktiveret.
Dette er en beskrivelse af hvordan du laver en standard deployment og logger ind første gang samt nogle overvejelser. Det forventes at du skal tilpasse yaml filer efter dine behov, præferencer og miljø.
En FoxIDs installation er som en bucket, der er ingen eksterne dependencies og det er let at opnå meget høj oppetid med lille indsats.
FoxIDs opdateres ved at opdatere de to docker images www.foxids.com/foxids:x.x.x og www.foxids.com/foxidscontrol:x.x.x
til en ny version. Nye FoxIDs releases er backward compatible. Gennemgå release notes før du opdaterer. Du kan også finde den aktuelle Docker image version der.
En gyldig licens kræves for at få adgang til FoxIDs releases. Herfra kan du generere en secret til at autentificere mod Docker image registriet på www.foxids.com, som bruger Basic authentication.
Forudsætninger:
- Du har en Kubernetes klynge eller Docker Desktop med Kubernetes aktiveret.
- Du har grundlæggende viden om Kubernetes.
- Du har
kubectlinstalleret.
Dette er en liste over nyttige kommandoer i slutningen af denne beskrivelse.
Denne deployment omfatter:
- To websites en til FoxIDs og en til FoxIDs Control (admin Client og API) i to docker images
www.foxids.com/foxids:x.x.xogwww.foxids.com/foxidscontrol:x.x.x. - De to websites eksponeres på to forskellige domæner sikret med automatisk genererede Let's Encrypt certifikater.
- MongoDB er en NoSQL database og indeholder alle data inklusive tenants, miljøer og brugere. Deployet med det officielle MongoDB Docker image. Du kan valgfrit bruge din egen PostgreSQL instance i stedet for MongoDB.
- Standard gemmer cache i databasen. Brug valgfrit en Redis cache hvis du installerer en FoxIDs klynge med høj throughput. Cache indeholder sekvenser (fx login og logout) og håndterer tællere til at sikre autentifikation mod forskellige angreb og data cache (kun Redis) for at forbedre performance. Redis deployes med det officielle Redis Docker image.
- Logs skrives til
stdouthvor Kubernetes kan opsamle dem.
Deployment
Deploymenten udføres i den beskrevne rækkefølge.
Gør klar
Download Kubernetes yaml konfigurationsfiler her og placer dem i en mappe på din maskine, f.eks. C:\FoxIDs\Kubernetes.
Åbn en konsol og naviger til mappen Kubernetes.
Persistente volumes
Du har brug for persistente volumes til MongoDB og valgfrit Redis.
I en Kubernetes klynge brug eller opret passende persistente volumes og opret en persistent volume claim med navnet mongo-data-pvc til MongoDB og valgfrit en til Redis med navnet redis-data-pvc.
Du kan muligvis bruge dynamisk storage provisioning med StorageClass.
Opret persistent volume claim til Mongo
kubectl apply -f k8s-mongo-pvc-dynamic.yaml
Opret valgfrit persistent volume claim til Redis
kubectl apply -f k8s-redis-pvc-dynamic.yaml
Kubernetes i Docker Desktop
Hvis du bruger Kubernetes i Docker Desktop kan du oprette persistente volumes på host file systemet - ikke anbefalet til produktion.
Opret persistent volume til MongoDB
kubectl apply -f k8s-mongo-pv-dockerdesktop.yaml
Opret persistent volume claim til MongoDB
kubectl apply -f k8s-mongo-pvc-dockerdesktop.yaml
Opret valgfrit persistent volume til Redis
kubectl apply -f k8s-redis-pv-dockerdesktop.yaml
Opret valgfrit persistent volume claim til Redis
kubectl apply -f k8s-redis-pvc-dockerdesktop.yaml
Namespace
Denne guide bruger generelt namespace foxids, overvej at ændre namespace til at passe til dit Kubernetes miljø.
Opret namespace
kubectl create namespace foxids
MongoDB
Ændr brugernavn og adgangskode til MongoDB i k8s-mongo-secret.yaml. Brugernavn og adgangskode er base64 kodet.
Du base64 koder "teksten" i en command prompt afhængigt af din platform:
Windows
powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"the text\"))"
Linux / Mac
echo -n "the text" | base64
Tilføj MongoDB secret
kubectl apply -f k8s-mongo-secret.yaml -n foxids
Opret MongoDB
Eksponér valgfrit MongoDB på port 27017 ved at uncomment LoadBalancer
kubectl apply -f k8s-mongo-deployment.yaml -n foxids
Tilføj en ConfigMap til MongoDB servicen
kubectl apply -f k8s-mongo-configmap.yaml -n foxids
Brug valgfrit PostgreSQL i stedet for MongoDB
Ændr brugernavn værdien i postgres-username og adgangskode værdien i postgres-password så de matcher din PostgreSQL instance i k8s-postgres-secret.yaml. Brugernavn og adgangskode er base64 kodet.
Tilføj PostgreSQL secret
kubectl apply -f k8s-postgres-secret.yaml -n foxids
Ændr PostgreSQL database endpoint i postgres-db så det matcher din PostgreSQL instance i k8s-postgres-configmap.yaml
Tilføj en ConfigMap til PostgreSQL servicen
kubectl apply -f k8s-postgres-configmap.yaml -n foxids
Brug valgfrit Redis
Opret valgfrit Redis
kubectl apply -f k8s-redis-deployment.yaml -n foxids
Tilføj valgfrit en ConfigMap til Redis servicen
kubectl apply -f k8s-redis-configmap.yaml -n foxids
FoxIDs websites
Domæner
De to FoxIDs websites er konfigureret til at bruge to domæner som du opretter og administrerer i din DNS. Konfigurer k8s-foxids-deployment.yaml filen med dine valgte domæner:
- FoxIDs site domænet
https://id.itfoxtec.com(to steder i filen) ændres til dit domæne -id.my-domain.com - FoxIDs Control site domænet
https://control.itfoxtec.comændres til dit domæne -control.my-domain.com
Email provider
Du kan valgfrit konfigurere en global email provider eller senere konfigurere email providers per miljø. FoxIDs understøtter at sende e-mails med SendGrid og SMTP.
Den globale email provider konfigureres i k8s-foxids-deployment.yaml filen på foxids container/pod i env: sektionen.
Dette eksempel viser hvordan du tilføjer Outlook / Microsoft 365 med SMTP:
- name: "Settings__Smtp__FromEmail"
value: "my@email-address.org"
- name: "Settings__Smtp__FromName" # Valgfrit afsendernavn knyttet til e-mailadressen
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"
Vigtigt hvis du bruger PostgreSQL
Ændr database og cache konfigurationen i k8s-foxids-deployment.yaml (to steder i filen).
Vælg PostgreSQL som database i stedet for MongoDb
- name: "Settings__Options__DataStorage"
# value: "MongoDb"
value: "PostgreSql" # PostgreSql database
Vælg PostgreSQL som cache i stedet for MongoDb medmindre du bruger Redis
- name: "Settings__Options__Cache"
# value: "MongoDb"
value: "PostgreSql" # Cache i PostgreSql database
# value: "Redis" # Cache i Redis
Uncomment PostgreSQL access konfigurationen
- 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"
Vigtigt hvis du bruger Redis
Ændr cache konfigurationen i k8s-foxids-deployment.yaml (to steder i filen).
Vælg Redis som cache i stedet for MongoDb
- name: "Settings__Options__Cache"
# value: "MongoDb"
# value: "PostgreSql" # Cache i PostgreSql database
value: "Redis" # Cache i Redis
Uncomment Redis access konfigurationen
- name: REDIS_SERVER
valueFrom:
configMapKeyRef:
name: redis-configmap
key: database_url
- name: "Settings__RedisCache__ConnectionString"
value: "$(REDIS_SERVER):6379"
Deploy
Sæt brugernavnet til dit kunde-ID og adgangskoden til din pull secret for FoxIDs Docker registriet. Opret derefter registry secret.
kubectl create secret docker-registry foxids-registry-secret --docker-server=www.foxids.com --docker-username=<customer-id> --docker-password=<pull-secret> -n foxids
Opret de to FoxIDs websites
kubectl apply -f k8s-foxids-deployment.yaml -n foxids
Konfigurationen kræver en Nginx controller. Du kan valgfrit ændre konfigurationen til at bruge en anden controller.
Forudsætninger:
- Du har Helm installeret.
Installer Helm på Windows med denne CMD kommandowinget install Helm.Helm
Installer Ingress-Nginx controller med to kommandoer
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
Valgfrit verificér Ingress-Nginx installation
kubectl get pod -n ingress-nginx
Hvis du prøver igen efter et par minutter bør du få en EXTERNAL-IP
kubectl get svc -n ingress-nginx ingress-nginx-controller
DNS records til de to domæner skal pege på installationens IP adresse for at aktivere Let's Encrypt online validering.
Firewallen skal acceptere requests på port 80 og 443. Let's Encrypt validerer domæneejerskab på port 80.
Valgfrit skalér Ingress-Nginx controller
kubectl scale deployment ingress-nginx-controller -n ingress-nginx --replicas=2
Installer Cert-manager med to kommandoer
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
Valgfrit verificér Cert-manager installation
kubectl get pods -n cert-manager
Tilføj din e-mail i k8s-letsencrypt-issuer.yaml (to steder) filen.
Konfigurer Let's Encrypt
kubectl apply -f k8s-letsencrypt-issuer.yaml -n foxids
k8s-foxids-ingress-deployment.yaml filen er konfigureret med domænerne:
- FoxIDs site domænet
id.itfoxtec.com(to steder i filen) ændres til dit domæne -id.my-domain.com - FoxIDs Control site domænet
control.itfoxtec.com(to steder i filen) ændres til dit domæne -control.my-domain.com
Overvej at starte med Let's Encrypt i staging for at undgå at ramme Let's Encrypt production rate limit (staging certifikater er ikke betroet af browseren).
Du kan valgfrit vælge staging eller production ik8s-foxids-ingress-deployment.yamlfilen, standard er production.
Tilføj ingress med certificate bound domæner
kubectl apply -f k8s-foxids-ingress-deployment.yaml -n foxids
Vigtigt! Ingress er installeret med annoteringerne
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"ognginx.ingress.kubernetes.io/proxy-buffer-size: "32k"for at understøtte SAML 2.0 hvor HTTP svar kan være ret store.
Valgfrit verificér Ingress
kubectl get ingress -n foxids
Valgfrit verificér certificate issuer
kubectl describe ClusterIssuer letsencrypt-production -n foxids
#staging
# kubectl describe ClusterIssuer letsencrypt-staging -n foxids
Valgfrit tjek om certifikatet er klar (READY bør være True)
kubectl get certificate -n foxids
Og valgfrit verificér certifikatet
kubectl describe certificate letsencrypt-production -n foxids
#staging
# kubectl describe certificate letsencrypt-staging -n foxids
Første login
Åbn dit FoxIDs Control site domæne i en browser.
Det bør videresende til FoxIDs site hvor du logger ind med standard admin brugeren admin@foxids.com og adgangskoden FirstAccess! (du skal ændre adgangskoden ved første login).
Du bliver derefter videresendt tilbage til FoxIDs Control site i master tenant. Du kan tilføje flere admin brugere i master tenant.
Klik derefter på main tenant og autentificér igen med samme standard admin bruger admin@foxids.com og adgangskoden FirstAccess! (igen, du skal ændre adgangskoden).
Standard admin bruger og adgangskode er den samme for både
mastertenant ogmaintenant, men det er to forskellige brugere.
Du er nu logget ind på main tenant og kan begynde at konfigurere dine applikationer og autentifikationsmetoder.
Seed data
Databasen seedes automatisk baseret på de konfigurerede domæner. Derfor skal du slette databasen hvis domænerne ændres.
For at slette data; du kan enten stoppe database pod og slette den fysiske database mappe eller filer.
Eller eksponér database endpointet og åbn databasen i MongoDB Compass (download MongoDB Compass Download (GUI)) og slet databasen.
Derefter skal FoxIDs Control pod genstartes for at starte en ny seed proces.
Avanceret mulighed: domænerne kan også ændres manuelt i databasen.
Overvejelser
Denne sektion lister nogle deployment- og sikkerhedsovervejelser.
Kubernetes Service Mesh
Det anbefales at bruge et Kubernetes Service Mesh for at opnå en zero-trust arkitektur, hvor intern trafik er sikret med mutual TLS (mTLS) og kryptering.
Intern PKI / root CA
Hvis intern trafik termineres og genkrypteres af en proxy eller service mesh med en intern root CA, konfigurer FoxIDs containere til at stole på den CA. Se Kubernetes internal CA.
Namespace
Denne guide bruger generelt namespace foxids, overvej at ændre namespace til at passe til dit Kubernetes miljø.
Opret namespace
kubectl create namespace test
List namespaces
kubectl get namespaces
Anvend namespace ved pod oprettelse
kubectl apply -f xxx.yaml --namespace=test
Log
Alle logs fra FoxIDs inklusiv fejl, trace og events skrives til stdout. Overvej hvordan du håndterer application logs og indsamler logs fra containerne.
Rate Limiting
Konfigurer begrænsninger på forbindelser og transmissionshastigheder i k8s-foxids-ingress-deployment.yaml.
MongoDB Operator
Overvej MongoDB Operator hvis du har brug for flere instanser af MongoDB.
Redis multiple pods / cluster
Overvej en skaleret Redis opsætning hvis du har brug for flere instanser af Redis.
- Redis master/replica setup i Kubernetes
- Redis på Kubernetes
- Redis Enterprise cluster på Kubernetes og arkitektur
Backup
Overvej om MongoDB data skal sikkerhedskopieres og på hvilket niveau, her er tre mulige løsninger. Det anses som mindre vigtigt at backuppe Redis.
- Backup den fysiske data store for det persistente volume.
- Backup med en Kubernetes Cron Job.
- Backup understøttes i MongoDB Enterprise Kubernetes Operator.
Update
FoxIDs opdateres ved at opdatere hvert FoxIDs image til en ny version, de to FoxIDs images er backwards compatible. Opdater først foxids/foxids image og derefter foxids/foxids-control image.
Det bør ligeledes være muligt at opdatere MongoDB image og Redis images med data i persistente volumes.
Nyttige kommandoer
Dette er en liste over kommandoer som kan være nyttige under deployment for at se detaljer og lave deployment ændringer.
Opret pod
kubectl apply -f ks8-xxx.yaml
Nedtag pod
kubectl delete -f ks8-xxx.yaml
List pods
kubectl get pods
Hent pod beskrivelse
kubectl describe pod xxx
Hent pod logs
kubectl logs xxx
List deployments
kubectl get deployments
List services
kubectl get services
List secrets
kubectl get secrets
List persistente volumes
kubectl get pv
List persistente volume claims
kubectl get pvc
List ingress
kubectl get ingress
Beskriv ingress
kubectl describe ingress xxx