Kubernetes
Wdróż FoxIDs w klastrze Kubernetes (K8s) lub w Docker Desktop z włączonym Kubernetes.
To opis sposobu wykonania domyślnego wdrożenia i pierwszego logowania, a także kilku zagadnień. Zakłada się, że będziesz musiał dostosować pliki yaml do swoich potrzeb, preferencji i środowiska.
Instalacja FoxIDs jest jak wiadro: nie ma zależności zewnętrznych i łatwo osiągnąć bardzo wysoką dostępność przy niewielkim wysiłku.
FoxIDs aktualizuje się przez aktualizację dwóch obrazów Docker www.foxids.com/foxids:x.x.x i www.foxids.com/foxidscontrol:x.x.x
na nową wersję. Nowe wydania FoxIDs są backward compatible. Przed aktualizacją sprawdź informacje o wydaniu. Znajdziesz tam również aktualną wersję obrazu Docker.
Do uzyskania dostępu do wydań FoxIDs wymagana jest ważna licencja. Stamtąd możesz wygenerować secret do uwierzytelniania w rejestrze obrazów Docker pod adresem www.foxids.com, który używa uwierzytelniania Basic.
Wymagania wstępne:
- Masz klaster Kubernetes lub Docker Desktop z włączonym Kubernetes.
- Masz podstawową wiedzę o Kubernetes.
- Masz zainstalowany
kubectl.
Na końcu tego opisu znajduje się lista przydatnych poleceń.
To wdrożenie obejmuje:
- Dwie witryny: FoxIDs oraz FoxIDs Control (admin Client i API) w dwóch obrazach Docker
www.foxids.com/foxids:x.x.xiwww.foxids.com/foxidscontrol:x.x.x. - Dwie witryny są wystawione na dwóch różnych domenach, zabezpieczone automatycznie generowanymi certyfikatami Let's Encrypt.
- MongoDB to baza NoSQL zawierająca wszystkie dane, w tym tenantów, środowiska i użytkowników. Wdrożona z oficjalnego obrazu MongoDB. Opcjonalnie możesz użyć własnej instancji PostgreSQL zamiast MongoDB.
- Domyślnie cache jest przechowywany w bazie danych. Opcjonalnie użyj Redis, jeśli instalujesz klaster FoxIDs o wysokiej przepustowości. Cache przechowuje sekwencje (np. logowanie i wylogowanie) oraz liczniki do ochrony uwierzytelniania przed różnymi atakami, a także cache danych (tylko Redis) w celu poprawy wydajności. Redis jest wdrażany z oficjalnego obrazu Redis Docker.
- Logi są zapisywane do
stdout, gdzie mogą być zbierane przez Kubernetes.
Wdrożenie
Wdrożenie jest wykonywane w opisanej kolejności.
Przygotowanie
Pobierz pliki konfiguracyjne Kubernetes yaml tutaj i umieść je w folderze na swoim komputerze, np. C:\FoxIDs\Kubernetes.
Otwórz konsolę i przejdź do folderu Kubernetes.
Wolumeny trwałe
Potrzebujesz wolumenów trwałych dla MongoDB i opcjonalnie Redis.
W klastrze Kubernetes użyj lub utwórz odpowiednie wolumeny trwałe i utwórz persistent volume claim o nazwie mongo-data-pvc dla MongoDB oraz opcjonalnie jeden dla Redis o nazwie redis-data-pvc.
Możesz użyć dynamic storage provisioning z StorageClass.
Utwórz persistent volume claim dla Mongo
kubectl apply -f k8s-mongo-pvc-dynamic.yaml
Opcjonalnie utwórz persistent volume claim dla Redis
kubectl apply -f k8s-redis-pvc-dynamic.yaml
Kubernetes w Docker Desktop
Jeśli używasz Kubernetes w Docker Desktop, możesz utworzyć wolumeny trwałe w systemie plików hosta — niezalecane dla produkcji.
Utwórz persistent volume dla MongoDB
kubectl apply -f k8s-mongo-pv-dockerdesktop.yaml
Utwórz persistent volume claim dla MongoDB
kubectl apply -f k8s-mongo-pvc-dockerdesktop.yaml
Opcjonalnie utwórz persistent volume dla Redis
kubectl apply -f k8s-redis-pv-dockerdesktop.yaml
Opcjonalnie utwórz persistent volume claim dla Redis
kubectl apply -f k8s-redis-pvc-dockerdesktop.yaml
Namespace
Ten przewodnik ogólnie używa namespace foxids, rozważ zmianę na lepszy dla Twojego środowiska Kubernetes.
Utwórz namespace
kubectl create namespace foxids
MongoDB
Zmień nazwę użytkownika i hasło dla MongoDB w k8s-mongo-secret.yaml. Nazwa użytkownika i hasło są zakodowane base64.
Zakoduj base64 „the text” w wierszu poleceń zależnie od platformy:
Windows
powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"the text\"))"
Linux / Mac
echo -n "the text" | base64
Dodaj sekret MongoDB
kubectl apply -f k8s-mongo-secret.yaml -n foxids
Utwórz MongoDB
Opcjonalnie wystaw MongoDB na porcie 27017, odkomentowując LoadBalancer
kubectl apply -f k8s-mongo-deployment.yaml -n foxids
Dodaj ConfigMap dla usługi MongoDB
kubectl apply -f k8s-mongo-configmap.yaml -n foxids
Opcjonalnie użyj PostgreSQL zamiast MongoDB
Zmień wartości postgres-username i postgres-password w k8s-postgres-secret.yaml, aby pasowały do instancji PostgreSQL. Nazwa użytkownika i hasło są zakodowane base64.
Dodaj sekret PostgreSQL
kubectl apply -f k8s-postgres-secret.yaml -n foxids
Zmień endpoint bazy PostgreSQL w postgres-db, aby pasował do Twojej instancji w k8s-postgres-configmap.yaml
Dodaj ConfigMap dla usługi PostgreSQL
kubectl apply -f k8s-postgres-configmap.yaml -n foxids
Opcjonalnie użyj Redis
Opcjonalnie utwórz Redis
kubectl apply -f k8s-redis-deployment.yaml -n foxids
Opcjonalnie dodaj ConfigMap dla usługi Redis
kubectl apply -f k8s-redis-configmap.yaml -n foxids
Witryny FoxIDs
Domeny
Dwie witryny FoxIDs są skonfigurowane do używania dwóch domen, które tworzysz i zarządzasz nimi w DNS. Skonfiguruj plik k8s-foxids-deployment.yaml z wybranymi domenami:
- Domena witryny FoxIDs
https://id.itfoxtec.com(dwa miejsca w pliku) jest zmieniona na Twoją domenę —id.my-domain.com - Domena witryny FoxIDs Control
https://control.itfoxtec.comjest zmieniona na Twoją domenę —control.my-domain.com
Dostawca e-mail Możesz opcjonalnie skonfigurować globalnego dostawcę e-maili lub później skonfigurować dostawców e-maili dla każdego środowiska. FoxIDs obsługuje wysyłanie e-maili przez SendGrid i SMTP.
Globalny dostawca e-maili jest konfigurowany w pliku k8s-foxids-deployment.yaml na kontenerze/podzie foxids w sekcji env:.
Przykład dodania Outlook / Microsoft 365 przez SMTP:
- name: "Settings__Smtp__FromEmail"
value: "my@email-address.org"
- name: "Settings__Smtp__FromName" # Opcjonalna nazwa nadawcy powiązana z adresem e-mail
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"
Ważne, jeśli używasz PostgreSQL
Zmień konfigurację bazy danych i cache w k8s-foxids-deployment.yaml (dwa miejsca w pliku).
Wybierz PostgreSQL jako bazę danych zamiast MongoDb
- name: "Settings__Options__DataStorage"
# value: "MongoDb"
value: "PostgreSql" # PostgreSql database
Wybierz PostgreSQL jako cache zamiast MongoDb, chyba że używasz Redis
- name: "Settings__Options__Cache"
# value: "MongoDb"
value: "PostgreSql" # Cache in PostgreSql database
# value: "Redis" # Cache in Redis
Odkomentuj konfigurację dostępu do 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"
Ważne, jeśli używasz Redis
Zmień konfigurację cache w k8s-foxids-deployment.yaml (dwa miejsca w pliku).
Wybierz Redis jako cache zamiast MongoDb
- name: "Settings__Options__Cache"
# value: "MongoDb"
# value: "PostgreSql" # Cache in PostgreSql database
value: "Redis" # Cache in Redis
Odkomentuj konfigurację dostępu do Redis
- name: REDIS_SERVER
valueFrom:
configMapKeyRef:
name: redis-configmap
key: database_url
- name: "Settings__RedisCache__ConnectionString"
value: "$(REDIS_SERVER):6379"
Wdrożenie Ustaw nazwę użytkownika na identyfikator klienta, a hasło na pull secret dla rejestru Docker FoxIDs. Następnie utwórz 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
Utwórz dwie witryny FoxIDs
kubectl apply -f k8s-foxids-deployment.yaml -n foxids
Ta konfiguracja wymaga kontrolera Nginx. Opcjonalnie możesz zmienić konfigurację na inny kontroler.
Wymagania wstępne:
- Masz zainstalowany Helm.
Zainstaluj Helm na Windows poleceniem CMD
winget install Helm.Helm
Zainstaluj kontroler Ingress-Nginx w dwóch poleceniach
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
Opcjonalnie zweryfikuj instalację Ingress-Nginx
kubectl get pod -n ingress-nginx
Po kilku minutach powinieneś otrzymać EXTERNAL-IP
kubectl get svc -n ingress-nginx ingress-nginx-controller
Rekordy DNS dla dwóch domen muszą wskazywać adres IP instalacji, aby umożliwić walidację online Let's Encrypt. Zapora musi akceptować żądania na portach 80 i 443. Let's Encrypt weryfikuje własność domeny na porcie 80.
Opcjonalnie skaluj kontroler Ingress-Nginx
kubectl scale deployment ingress-nginx-controller -n ingress-nginx --replicas=2
Zainstaluj Cert-manager w dwóch poleceniach
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
Opcjonalnie zweryfikuj instalację Cert-manager
kubectl get pods -n cert-manager
Dodaj swój e-mail w pliku k8s-letsencrypt-issuer.yaml (w dwóch miejscach).
Skonfiguruj Let's Encrypt
kubectl apply -f k8s-letsencrypt-issuer.yaml -n foxids
Plik k8s-foxids-ingress-deployment.yaml jest skonfigurowany z domenami:
- Domena witryny FoxIDs
id.itfoxtec.com(dwa miejsca w pliku) jest zmieniona na Twoją domenę —id.my-domain.com - Domena witryny FoxIDs Control
control.itfoxtec.com(dwa miejsca w pliku) jest zmieniona na Twoją domenę —control.my-domain.com
Rozważ rozpoczęcie od Let's Encrypt w trybie staging, aby uniknąć limitów produkcyjnych (certyfikaty staging nie są zaufane przez przeglądarkę). Opcjonalnie wybierz staging lub production w pliku
k8s-foxids-ingress-deployment.yaml, domyślnie skonfigurowane na production.
Dodaj ingress z domenami powiązanymi z certyfikatem
kubectl apply -f k8s-foxids-ingress-deployment.yaml -n foxids
Ważne! Ingress jest zainstalowany z adnotacjami
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"inginx.ingress.kubernetes.io/proxy-buffer-size: "32k"aby wspierać SAML 2.0, gdzie odpowiedzi HTTP mogą być dość duże.
Opcjonalnie zweryfikuj Ingress
kubectl get ingress -n foxids
Opcjonalnie zweryfikuj issuer certyfikatu
kubectl describe ClusterIssuer letsencrypt-production -n foxids
#staging
# kubectl describe ClusterIssuer letsencrypt-staging -n foxids
Opcjonalnie sprawdź, czy certyfikat jest gotowy (READY powinno być True)
kubectl get certificate -n foxids
I opcjonalnie zweryfikuj certyfikat
kubectl describe certificate letsencrypt-production -n foxids
#staging
# kubectl describe certificate letsencrypt-staging -n foxids
Pierwsze logowanie
Otwórz domenę witryny FoxIDs Control w przeglądarce.
Powinna przekierować do witryny FoxIDs, gdzie zalogujesz się domyślnym użytkownikiem admin admin@foxids.com i hasłem FirstAccess! (podczas pierwszego logowania musisz zmienić hasło).
Następnie zostaniesz przekierowany z powrotem do witryny FoxIDs Control w tenancie master. Możesz dodać więcej adminów w tenancie master.
Następnie kliknij tenant main i uwierzytelnij się ponownie tym samym domyślnym użytkownikiem admin admin@foxids.com i hasłem FirstAccess! (ponownie wymagane jest ustawienie nowego hasła).
Domyślny użytkownik admin i hasło są takie same dla tenanta
masteri tenantamain, ale to dwaj różni użytkownicy.
Jesteś teraz zalogowany w tenancie main i możesz rozpocząć konfigurację aplikacji i metod uwierzytelniania.
Seed data
Baza danych jest automatycznie zasiewana na podstawie skonfigurowanych domen. Dlatego, jeśli domeny zostaną zmienione, musisz usunąć bazę danych. Aby usunąć dane: możesz zatrzymać pod bazy danych i usunąć fizyczny folder lub pliki bazy. Albo wystawić endpoint bazy danych i otworzyć bazę w MongoDB Compass (download MongoDB Compass Download (GUI)) i usunąć bazę danych. Następnie pod FoxIDs Control musi zostać zrestartowany, aby zainicjować nowy proces seedowania.
Opcja zaawansowana: domeny można również ręcznie zmienić w bazie danych.
Zagadnienia
Ta sekcja zawiera kilka zagadnień dotyczących wdrożenia i bezpieczeństwa.
Kubernetes Service Mesh Zaleca się użycie Kubernetes Service Mesh, aby osiągnąć architekturę zero trust, w której ruch wewnętrzny jest zabezpieczony wzajemnym TLS (mTLS) i szyfrowaniem.
Wewnętrzny PKI / root CA Jeśli ruch wewnętrzny jest terminowany i ponownie szyfrowany przez proxy lub service mesh z wewnętrznym root CA, skonfiguruj kontenery FoxIDs, aby ufały temu CA. Zobacz Kubernetes internal CA.
Namespace
Ten przewodnik ogólnie używa namespace foxids, rozważ zmianę na lepszy dla Twojego środowiska Kubernetes.
Utwórz namespace
kubectl create namespace test
Wyświetl namespace
kubectl get namespaces
Zastosuj namespace przy tworzeniu poda
kubectl apply -f xxx.yaml --namespace=test
Logi
Wszystkie logi z FoxIDs, w tym błędy, śledzenie i zdarzenia, są zapisywane do stdout. Zastanów się, jak obsłużyć logi aplikacji i zbierać logi z kontenerów.
Rate Limiting
Skonfiguruj limity połączeń i przepustowości w k8s-foxids-ingress-deployment.yaml.
MongoDB Operator Rozważ MongoDB Operator, jeśli potrzebujesz wielu instancji MongoDB.
Redis wiele podów / klaster Rozważ skalowany setup Redis, jeśli potrzebujesz wielu instancji Redis.
- Redis master/replica setup w Kubernetes
- Redis w Kubernetes
- Redis Enterprise cluster w Kubernetes i architektura
Backup Rozważ, czy dane MongoDB powinny być backupowane i na jakim poziomie; poniżej trzy możliwe rozwiązania. Za mniej istotne uznaje się backupowanie Redis.
- Backup fizycznego magazynu danych wolumenu trwałego.
- Backup z Kubernetes Cron Job.
- Backup jest obsługiwany w MongoDB Enterprise Kubernetes Operator.
Aktualizacja
FoxIDs aktualizuje się przez aktualizację każdego obrazu FoxIDs do nowej wersji; dwa obrazy FoxIDs są wstecznie kompatybilne. Najpierw zaktualizuj obraz foxids/foxids, a następnie foxids/foxids-control.
Powinno być również możliwe zaktualizowanie obrazów MongoDB i Redis z danymi w wolumenach trwałych.
Przydatne polecenia
To lista poleceń, które mogą być przydatne podczas wdrożenia do podglądu szczegółów i wprowadzania zmian.
Utwórz pod
kubectl apply -f ks8-xxx.yaml
Usuń pod
kubectl delete -f ks8-xxx.yaml
Lista podów
kubectl get pods
Opis poda
kubectl describe pod xxx
Logi poda
kubectl logs xxx
Lista wdrożeń
kubectl get deployments
Lista usług
kubectl get services
Lista sekretów
kubectl get secrets
Lista persistent volumes
kubectl get pv
Lista persistent volume claims
kubectl get pvc
Lista ingress
kubectl get ingress
Opis ingress
kubectl describe ingress xxx