Kubernetes
Kubernetes (K8s) je platforma na orchestráciu kontajnerov, ktorá automatizuje nasadzovanie, škálovanie a správu aplikácií bežiacich v kontajneroch. Je vhodná najmä pre väčšie produkčné prostredia, kde sú žiadané vlastnosti ako vysoká dostupnosť, škálovateľnosť či load balancing. Vysoká dostupnosť je rovnako ako v prostredí mimo Kubernetes poskytovaná redundanciou systému D2000. Škálovateľnosť je v prostredí Kubernetes jednak možná presťahovaním na výkonnejší nod, no pravdepodobne zaujímavejšia je možnosť dynamicky škálovať procesy D2000. Toto je podporené pri procesoch typu Cluster Event Handler, EDA Server a SmartWeb. Load balancing je prostriedkami D2000 aj v prostredí Kubernetes možný medzi EDA Servermi, Cluster Event Handler-mi a inštančnými Archívmi. Prostriedkami platformy Kubernetes je navyše možné rozkladať záťaž medzi SmartWeb inštanciami.
Na nasadenie D2000 aplikácie do prostredia Kubernetes je k dispozícii pripravený D2000 Helm Chart (d2deploy), ktorý generuje všetky potrebné Kubernetes objekty zo zjednodušeného konfiguračného súboru values.yaml.
Predpoklady
Pred nasadením D2000 aplikácie do Kubernetes klastra je potrebné mať pripravené:
Predpoklad | Účel |
|---|---|
Kubernetes klaster v1.25+ | Cieľová platforma |
StorageClass s režimom ReadWriteMany (napr. CephFS, Longhorn, Azure Files, NFS) | Perzistentné úložisko zdieľané medzi redundantnými kernelmi |
Service typu LoadBalancer (napr. MetalB v on-prem prostredí) alebo NodePort | Vystavenie portov 3119/TCP a 3119/UDP pre klientské procesy D2000 bežiace mimo Kubernetes klastra |
Ingress Controller (nspr. NGINX) | Vystavenie SmartWeb cez HTTPS |
PostgreSQL inštancia dostupná z klastra | Databázy používané systémom D2000 |
Reprezentácia procesov
Procesy D2000 v K8s, rovnako ako v Dockeri bežia a sú reprezentované samostatnými kontajnermi. Konfigurácia K8s ale nepracuje priamo s kontajnermi ale objektami, ktoré kontajnery obalujú - Pod. O životný cyklus Pod-ov sa starajú workload objekty. Pre riadenie životného cyklu Pod-ov D2000 procesov je používaný workload objekt typu StatefulSet. Proces D2000 teda v K8s na najvyššej úrovni reprezentuje objekt typu StatefulSet. Jednotlivé Pod-y potom preberajú názov zo StatefulSet-u s doplnením poradového čísla repliky začínajúcim 0. Názvoslovie StatefulSet-ov vychádza z názvu D2000 procesu:
d2-<prípona procesu>[-<meno redundantného kernela>]-<meno procesu>[-<číslo inštancie>]
Napríklad:
StatefulSet pre "SELF.ALA" staticky pripojený ku reduntantnému kernelu "a" sa volá "d2-ala-a-self".
Pod, riadený týmto StatefulSet-om sa potom volá "d2-ala-a-self-0".Druhá inštancia inštančného Archívu "SELF.ARC", staticky pripojená na redundantný kernel "b" je reprezentovaná StatefulSet-om "d2-arc-b-self-2" a Pod-om s názvom "d2-arc-b-self-2-0".
Pod tretej repliky Cluster Event Handlera "WORKER.EVH" s pripojením vždy len na aktívny D2000 server by sa volal "d2-evh-worker-2".
Objekty K8s jednej aplikácie D2000 sú umiestnené v spoločnom Namespace. V rámci Namespace, ktoré možno chápať ako subdoménu, sa všetky kontajnery sieťovo "vidia" cez meno Pod-u alebo nadradeného workload objektu resp. služby. Meno Namespace je štandardne odvodené od mena aplikácie.
Porovnanie nasadenia dvoj-nodovej redundantnej aplikácie D2000 v prostredí virtuálnych mašín (VM) a v prostredí Kubernetes so zabalením procesov do Kubernetes objektov znázorňujú nasledovné schémy.
Sieťové prestupy
Vzhľadom na veľkú rozmanitosť v možnostiach vystavovania a konfigurácie externého prístupu, ako aj v dostupných implementáciach konfiguračných objektov medzi rôznymi Kubernetes prostrediami, D2000 Helm Chart nepokrýva konfiguráciu externých prístupov. Externé prístupy je potrebné nakonfigurovať dostupnými prostriedkami podľa konktrétneho prostredia Kubernetes.
D2000 Server
D2000 Server štandardne využíva TCP a UDP porty 3119. Predpokladá sa ich mapovanie na rovnaké porty pre externé prístupy (cez služby LoadBalancer alebo NodePort).
TCP port 3119: prístup D2000 klientov (D2000 HI, D2000 CNF, D2000 GrEditor, D2000 System Console, …).
UDP port 3119: komunikácia D2000 System Console s procesmi D2000 Server pomocou unicastov (multicasty v prostredí K8s nefungujú).
Poznámka: Na správne fungovanie ovládania redundancie z D2000 System Console je potrebné v konfigurácii služby nastavenie "externalTrafficPolicy: Local". Toto spôsobí, že UDP pakety z vonkajšieho prostredia (od D2000 System Console) majú zachované zdrojové IP adresy a teda aj odpoveď od procesu D2000 Server môže byť poslaná na korektnú (vonkajšiu) IP adresu.
# Load balancer služba v Azure Kubernetes Services pre jeden D2000 server
apiVersion: v1
kind: Service
metadata:
name: d2-knl-a-lb
namespace: d2aks
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "d2aks-lb-subnet"
service.beta.kubernetes.io/azure-load-balancer-ipv4: "100.20.30.40" # externá IP adresa D2000 Servera
service.beta.kubernetes.io/azure-load-balancer-mixed-protocols: "true"
spec:
type: LoadBalancer
externalTrafficPolicy: Local # potrebné kvôli UDP ovládaniu redundancie cez D2000 System Console
selector:
app: d2-knl-a
ports:
- name: tcp
port: 3119
targetPort: 3119
protocol: TCP
- name: udp
port: 3119
targetPort: 3119
protocol: UDPNa prístup klientských procesov D2000 k redundantnému systému D2000 z prostredia mimo clustra je potrebné vo Windows registry nakonfigurovať externé IP adresy D2000 Serverov a klientské procesy štartovať s parametrom /RF. Názov redundantnej skupiny aj názvy kernelov v registroch musia byť zhodné s názvami použitými v clustri.
Príklad:
# Štartovanie D2000 System Console
sysconsole.exe /RFd2aks# Definícia redundantnej skupiny d2aks v registryWindows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Ipesoft\D2000V70\Redundancy]
[HKEY_LOCAL_MACHINE\SOFTWARE\Ipesoft\D2000V70\Redundancy\d2aks]
[HKEY_LOCAL_MACHINE\SOFTWARE\Ipesoft\D2000V70\Redundancy\d2aks\Kernel_1]
"IpAddr1"="100.20.30.40"
"Name"="a"
[HKEY_LOCAL_MACHINE\SOFTWARE\Ipesoft\D2000V70\Redundancy\d2aks\Kernel_2]
"IpAddr1"="100.20.30.41"
"Name"="b"
Redundantná skupina zobrazená v D2000 System Console (zobrazujú sa vonkajšie IP adresy z konfigurácie redundantnej skupiny, nie vnútorné IP adresy pridelené jednotlivým Pod-om).
Poznámka: Aby D2000 System Console vedela zobraziť konzolové okno procesov, je nutné vypnúť v menu Settings položku Establish direct TCP/IP connection for remote console viewing, takže konzolové informácie idú cez proces D2000 Server a cez jeho otvorený TCP port 3119.
D2Connector
D2Connector štandardne využíva TCP port 3120. Ak sa k nemu pripájajú len procesy bežiace v clustri (ako napr. SmartWeb), tak konfigurácia externého prístupu nie je potrebná.
EDA Server
EDA server predvolene využíva TCP port 3121. Aplikácie zvyčajne využívajú viacero EDA serverov naraz, pričom tieto fungujú v load balancing režime. Tento režim je podporovaný aj v prostredi Kubernetes a jeho implementácia je možná dvoma spôsobmi:
Pevne nakonfigurovaný zoznam EDA serverov, kde každý z nich má vystavený externý prístup. Toto je tradičný prístup, ktorý sa využíva pri nasadeniach D2000 aplikácií v on-premise prostredí. Za load balancing tu zodpovedá D2000 Server.
Pre každý EDA server je potrebné nakonfigurovať službu externého prístupu (NodePort alebo LoadBalancer).Dynamicky škálovateľný cluster EDA serverov, ktorý je pre klientov dostupný cez spoločnú adresu. Prístup využívajúci výhody prostredia Kubernetes. Výsledný load balancing poskytuje Kubernetes.
Služba externého prístupu je len jedna (LoadBalancer) a je teda využívaná len jedna externá IP adresa a port.
V oboch prípadoch je potrebné štartovacím parametrom EDA servera zadať IP adresu externého prístupu (parameter /EDAH). Táto IP adresa musí mať v kontajneri EDA servera DNS záznam. Jej doplnenie je možné konfiguračným atribútom kontajnera hostAliases. Ako hostname pre DNS sa odporúča použiť DNS služby (Load balancera). Port externého prístupu musí byť zhodný s portom, na ktorom EDA server reálne počúva.
# values.yaml - časť definície procesov v D2000 Helm Charte
d2ActiveKernelProcesses:
- imageName: ipesoft/d2/edaserver_odbc
d2Cluster: true # škálovateľný cluster EDA serverov
d2Name: EDA # meno clustra EDA serverov (procesy budú podľa počtu replík pomenované EDA_0.EDS, EDA_1.EDS, EDA_2.EDS, ...)
replicas: 2 # predvolený počet replík EDA serverov
argsAdd: [ "/EDAH100.20.30.42" ] # externá IP adresa
hostAliases: # DNS záznam
- ip: 100.20.30.42
hostnames:
- d2-eds-eda-lb.d2aks.svc.cluster.local# Load balancer služba v Azure Kubernetes Services pre cluster EDA serverov (alebo jeden EDA server)
apiVersion: v1
kind: Service
metadata:
name: d2-eds-eda-lb
namespace: d2aks
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "d2aks-lb-subnet"
service.beta.kubernetes.io/azure-load-balancer-ipv4: "100.20.30.42" # externá IP adresa EDA servera/serverov
spec:
type: LoadBalancer
selector:
app: d2-eds-eda
ports:
- name: eda
port: 3121
targetPort: 3121
protocol: TCPAk sa k EDA serverom pripájajú len procesy bežiace v clustri, tak konfigurácia externého prístupu nie je potrebná a load balancing rieši len D2000 Server. Štartovací parameter /EDAH je možné vynechať - automaticky sa použije hostname resp. IP adresa Pod-u.
Vonkajšie prístupy
Do vonkajšieho prostredia sú potrebné povolenia štandardne pre porty:
TCP port 5432: Prístup procesu D2000 Server na PostgreSQL databázový server s konfiguračnou a monitorovacou databázou, prístup procesu D2000 Archív na archívnu databázu, prípadne prístup na aplikačnú a/alebo EDA databázu.
Prístup na licenčné servery. Ak sú použité verejné licenčné servery, je nutné povoliť prístup na TCP porty 443 na servery lic-v2-a.ipesoft.com a lic-v2-b.ipesoft.com.
Správa aplikácie
Spravovať D2000 aplikáciu v K8s je možné z management konzoly pomocou kubectl príkazov. Tieto príkazy nahradzujú volania service managera (napr. systemctl) pre vypnutie a zapnutie procesu a dopĺňajú napríklad škálovanie procesu, redeploy a patchovanie kontajnerov a umožňujú aj rýchly prístup k logom procesu.
Na prepnutie redundancie je stále potrebné použiť nástroj D2000 SysConsole.
Okrem správy cez management konzolu je často k dispozícii aj webová management platforma, napr. Rancher, ktorá kubectl príkazy skrýva za prehľadný webový interface.
Vypnutie/zapnutie procesu
Pretože D2000 proces je v K8s reprezentovaný objektom typu StatefulSet, vypnutie a zapnutie procesu znamená nastavenie počtu replík StatefulSet-u na 0 (vypnutie) resp. na 1 (zapnutie). Podpora viac ako jednej replík D2000 procesov prostriedkami K8s je podporená len pre procesy typu Cluster Event Handler, EDA Server a SmartWeb. U ostatných procesoch by pri vyššom počte replík vznikol D2000 proces s rovnakým menom ako už beží a preto by ho D2000 server odmietol pripojiť. Toto by spôsobilo cyklus reštartov takéhoto Pod-u.
# syntax:
kubectl scale statefulset <name> [-n <namespace>] --replicas=<count>
# príklad:
kubectl scale statefulset d2-ala-a-self --replicas=0Výpis štandardného výstupu
Pri výpise štandarného výstupu je potrebné zadať názov Pod-u, nie StatefulSet-u.
# syntax:
kubectl logs <pod-name> [-n <namespace>]
# príklad:
kubectl logs d2-clc-a-self-0Redeploy procesu
Redeploy StatefulSet-u v sebe zahŕňa ukončenie bežiacich replík Pod-ov, stiahnutie najnovších použitých image s daným tag-om, a pre každú repliku Pod-u spustenie prípadných inicializačných kontajnerov a následné spustenie kontajnerov. V prípade, že kontajner používa image bez čísla patchu, bude stiahnutý vždy najnovší patch daného D2000 procesu.
# syntax:
kubectl rollout restart statefulset <name> [-n <namespace>]
# príklad:
kubectl rollout restart statefulset d2-evh-a-selfNasadenie patchu
Odporúčaný postup - prostriedkami D2000 Helm Chartu: Upravenie atribútu imageTag (globálny default) alebo imageTag pri konkrétom procese vo values.yaml a spustiť upgrade chartu.
helm upgrade -i -f values.yaml my-d2deploy oci://registry.ipesoft.com/ipesoft/d2deploy --version <verzia>Helm prepočíta manifesty a Kubernetes postupne reštartuje dotknuté Pody. Tento postup je verziovaný (helm history, helm rollback) a reprodukovateľný.
Ad-hoc patch (napr. pre rýchle overenie jedného image bez zmeny values.yaml) - priama modifikácia image v príslušnom StatefulSet-e. Po modifikácii image K8s automaticky vykoná redeploy StatefulSet-u.
# syntax:
kubectl set image statefulset/<name> [-n <namespace>] <container-name>=<image-name>
# príklad:
kubectl set image statefulset/d2-clc-a-self -n k8s-dev d2container=registry.ipesoft.com/ipesoft/d2/calc:v26.00.082-123Pozor: ad-hoc zmena bude pri ďalšom helm upgrade prepísaná hodnotou z values.yaml.
Súvisiace stránky