Lafen Camunda BPM op Kubernetes

Lafen Camunda BPM op Kubernetes

Benotzt Dir Kubernetes? Bereet fir Är Camunda BPM Instanzen aus virtuelle Maschinnen ze plënneren, oder vläicht just probéieren se op Kubernetes ze lafen? Loosst eis e puer gemeinsam Konfiguratiounen an eenzel Elementer kucken, déi op Är spezifesch Bedierfnesser ugepasst kënne ginn.

Et gëtt ugeholl datt Dir Kubernetes virdru benotzt hutt. Wann net, firwat net e Bléck op Leadership an net Ären éischte Stärekoup ufänken?

Auteuren

  • Alastair Firth (Alastair Firth) - Senior Site Reliability Engineer am Camunda Cloud Team;
  • Lars Lange (Lars Lange) - DevOps Ingenieur bei Camunda.

Kuerz gesot:

git clone https://github.com/camunda-cloud/camunda-examples.git
cd camunda-examples/camunda-bpm-demo
make skaffold

Okay, et huet wahrscheinlech net geschafft well Dir hutt net Skaffold an kustomize installéiert. Ma dann liest weider!

Wat ass Camunda BPM

Camunda BPM ass eng Open Source Geschäftsprozessmanagement an Entscheedungsautomatiséierungsplattform déi Geschäftsbenotzer a Softwareentwéckler verbënnt. Et ass ideal fir Leit ze koordinéieren an ze verbannen, (Mikro) Servicer oder souguer Bots! Dir kënnt méi iwwer déi verschidde Benotzungsfäll liesen op Link.

Firwat benotzt Kubernetes

Kubernetes ass den de facto Standard ginn fir modern Uwendungen op Linux ze lafen. Andeems Dir System Uriff benotzt anstatt Hardware Emulatioun an d'Fäegkeet vum Kernel fir Erënnerung an Taskschalter ze managen, ginn d'Bootzäit an d'Startzäit op e Minimum gehal. Wéi och ëmmer, de gréisste Virdeel kann aus der Standard API kommen déi Kubernetes ubitt fir d'Infrastruktur ze konfiguréieren déi vun all Uwendungen erfuerderlech ass: Späicheren, Netzwierker an Iwwerwaachung. Et gouf 2020 Joer al am Juni 6 an ass vläicht deen zweetgréissten Open Source Projet (no Linux). Et huet viru kuerzem seng Funktionalitéit no enger séierer Iteratioun an de leschte Joeren aktiv stabiliséiert wéi et kritesch gëtt fir d'Produktiounsaarbechtslaascht ronderëm d'Welt.

Camunda BPM Engine kann einfach mat aner Uwendungen konnektéieren, déi am selwechte Stärekoup lafen, a Kubernetes bitt exzellent Skalierbarkeet, wat Iech erlaabt d'Infrastrukturkäschte nëmmen ze erhéijen wann et wierklech néideg ass (a se einfach reduzéieren wéi néideg).

D'Qualitéit vun der Iwwerwaachung gëtt och staark verbessert mat Tools wéi Prometheus, Grafana, Loki, Fluentd an Elasticsearch, wat Iech erlaabt all Aarbechtslaascht an engem Cluster zentral ze gesinn. Haut kucke mir wéi een de Prometheus Exporter an d'Java Virtual Machine (JVM) implementéiert.

Zilsetzungen

Loosst eis e puer Beräicher kucken wou mir de Camunda BPM Docker Bild personaliséiere kënnen (github) sou datt et gutt mat Kubernetes interagéiert.

  1. Logbicher a Metriken;
  2. Datebank Verbindungen;
  3. Authentifikatioun;
  4. Sëtzung Gestioun.

Mir wäerte verschidde Weeër kucken fir dës Ziler z'erreechen an de ganze Prozess kloer ze weisen.

Remarque: Benotzt Dir d'Enterprise Versioun? Kuckt hei an update Bild Linken wéi néideg.

Workflow Entwécklung

An dëser Demo wäerte mir Skaffold benotzen fir Docker Biller mat Google Cloud Build ze bauen. Et huet gutt Ënnerstëtzung fir verschidden Tools (wéi Kustomize an Helm), CI a bauen Tools, an Infrastruktur Ubidder. Fichier skaffold.yaml.tmpl enthält Astellunge fir Google Cloud Build a GKE, e ganz einfache Wee fir Produktiounsgrad Infrastruktur ze lafen.

make skaffold lued den Dockerfile Kontext an Cloud Build, baut d'Bild an späichert et am GCR, a gëlt dann d'Manifester op Äre Cluster. Dëst ass wat et mécht make skaffold, mee Skaffold huet vill aner Funktiounen.

Fir Yaml Templates a Kubernetes benotze mir kustomize fir Yaml Iwwerlager ze managen ouni de ganze Manifest ze forckelen, wat Iech erlaabt Iech ze benotzen git pull --rebase fir weider Verbesserungen. Elo ass et am kubectl an et funktionnéiert ganz gutt fir sou Saachen.

Mir benotzen och envsubst fir den Hostnumm an den GCP Projet ID an den *.yaml.tmpl Dateien ze populéieren. Dir kënnt gesinn wéi et funktionnéiert an makefile oder einfach weider fueren.

Viraussetzunge viraus

Workflow mat Manifestatiounen

Wann Dir net wëllt kustomize oder skaffold benotzen, kënnt Dir op d'Manifester bezéien an generated-manifest.yaml an adaptéieren se un de Workflow vun Ärer Wiel.

Logbicher a Metriken

Prometheus ass de Standard ginn fir Metriken a Kubernetes ze sammelen. Et besetzt déiselwecht Nisch wéi AWS Cloudwatch Metrics, Cloudwatch Alerts, Stackdriver Metrics, StatsD, Datadog, Nagios, vSphere Metrics an anerer. Et ass Open Source an huet eng mächteg Ufrosprooch. Mir wäerten d'Visualiséierung u Grafana uvertraut - et kënnt mat enger grousser Zuel vun Dashboards verfügbar aus der Këscht. Si si matenee verbonnen a si relativ einfach ze installéieren prometheus-Operateur.

Par défaut benotzt Prometheus den Extraktiounsmodell <service>/metrics, a Sidecar Container fir dëst ze addéieren ass heefeg. Leider sinn JMX Metriken am beschten am JVM protokolléiert, sou datt Sidecar Container net sou effizient sinn. Loosst eis konnektéieren jmx_exporter Open Source vum Prometheus op de JVM andeems se se an d'Containerbild bäigefüügt deen de Wee ubitt /metrics op engem aneren Hafen.

Füügt Prometheus jmx_exporter an de Container

-- images/camunda-bpm/Dockerfile
FROM camunda/camunda-bpm-platform:tomcat-7.11.0

## Add prometheus exporter
RUN wget https://repo1.maven.org/maven2/io/prometheus/jmx/
jmx_prometheus_javaagent/0.11.0/jmx_prometheus_javaagent-0.11.0.jar -P lib/
#9404 is the reserved prometheus-jmx port
ENV CATALINA_OPTS -javaagent:lib/
jmx_prometheus_javaagent-0.11.0.jar=9404:/etc/config/prometheus-jmx.yaml

Gutt, dat war einfach. Den Exportateur iwwerwaacht den Tomcat a weist seng Metriken am Prometheus Format op <svc>:9404/metrics

Exporter Setup

Den opmierksam Lieser freet sech vläicht wou et hierkënnt prometheus-jmx.yaml? Et gi vill verschidde Saachen, déi am JVM lafen kënnen, an Tomcat ass just ee vun hinnen, sou datt den Exportateur eng zousätzlech Konfiguratioun brauch. Standard Konfiguratiounen fir Tomcat, Wildfly, Kafka a sou weider sinn verfügbar hei. Mir wäerten Tomcat als ConfigMap an Kubernetes an dann Montéierung et als Volume.

Als éischt fügen mir d'Exporter Konfiguratiounsdatei op eis Plattform/config/ Verzeichnis

platform/config
└── prometheus-jmx.yaml

Dann addéiere mer ConfigMapGenerator в kustomization.yaml.tmpl:

-- platform/kustomization.yaml.tmpl
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
[...] configMapGenerator:
- name: config
files:
- config/prometheus-jmx.yaml

Dëst wäert all Element derbäi files[] als ConfigMap Konfiguratiounselement. ConfigMapGenerators si super well se d'Konfiguratiounsdaten hashéieren an e Pod Neistart forcéieren wann et ännert. Si reduzéieren och d'Quantitéit vun der Konfiguratioun am Deployment well Dir e ganze "Dossier" vu Konfiguratiounsdateien an engem VolumeMount montéiere kënnt.

Schlussendlech musse mir de ConfigMap als Volume op de Pod montéieren:

-- platform/deployment.yaml
apiVersion: apps/v1
kind: Deployment
[...] spec:
template:
spec:
[...] volumes:
- name: config
configMap:
name: config
defaultMode: 0744
containers:
- name: camunda-bpm
volumeMounts:
- mountPath: /etc/config/
name: config
[...]

Wonnerbar. Wann de Prometheus net konfiguréiert ass fir eng voll Botz ze maachen, musst Dir et vläicht soen fir d'Pods ze botzen. Prometheus Operator Benotzer kënne benotzen service-monitor.yaml unzefänken. Entdeckt Service-monitor.yaml, Bedreiwer Design и ServiceMonitorSpec ier Dir ufänken.

Dëst Muster op aner Benotzungsfäll ausdehnen

All Dateien, déi mir op ConfigMapGenerator addéieren, sinn am neie Verzeechnes verfügbar /etc/config. Dir kënnt dës Schabloun verlängeren fir all aner Konfiguratiounsdateien ze montéieren déi Dir braucht. Dir kënnt souguer en neie Startup Skript montéieren. Dir kënnt benotzen subPath fir eenzel Dateien ze montéieren. Fir xml Dateien ze aktualiséieren, betruecht d'Benotzung xmlstarlet amplaz seed. Et ass schonn am Bild abegraff.

Zäitschrëften

Flott Neiegkeet! Applikatioun Logbicher sinn schonn op stdout sinn, zum Beispill mat kubectl logs. Fluentd (installéiert par défaut am GKE) wäert Är Logbicher op Elasticsearch, Loki, oder Är Enterprise Log Plattform weiderginn. Wann Dir jsonify fir Logbicher benotze wëllt, da kënnt Dir déi uewe genannte Schabloun verfollegen fir ze installéieren logback.

Datebank

Par défaut wäert d'Bild eng H2 Datebank hunn. Dëst ass net gëeegent fir eis, a mir wäerte Google Cloud SQL mat Cloud SQL Proxy benotzen - dëst wäert spéider gebraucht ginn fir intern Probleemer ze léisen. Dëst ass eng einfach an zouverlässeg Optioun wann Dir keng eege Virléiften hutt fir d'Datebank opzestellen. AWS RDS bitt en ähnlechen Service.

Onofhängeg vun der Datebank déi Dir gewielt hutt, ausser et ass H2, musst Dir déi entspriechend Ëmfeldvariablen astellen platform/deploy.yaml. Et gesäit sou eppes aus:

-- platform/deployment.yaml
apiVersion: apps/v1
kind: Deployment
[...] spec:
template:
spec:
[...] containers:
- name: camunda-bpm
env:
- name: DB_DRIVER
value: org.postgresql.Driver
- name: DB_URL
value: jdbc:postgresql://postgres-proxy.db:5432/process-engine
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: cambpm-db-credentials
key: db_username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: cambpm-db-credentials
key: db_password
[...]

Remarque: Dir kënnt Kustomize benotze fir op verschidden Ëmfeld mat engem Iwwerlager ze deployéieren: Beispill.

Remarque: Gebrauch valueFrom: secretKeyRef. Weg, benotzen dëser Kubernetes Fonktioun och während der Entwécklung fir Är Geheimnisser sécher ze halen.

Et ass méiglech datt Dir schonn e bevorzugt System fir d'Gestioun vu Kubernetes Geheimnisser hutt. Wann net, hei sinn e puer Optiounen: Verschlësselt se mat Ärem Cloud Provider KMS an injizéiert se dann an K8S als Geheimnisser iwwer d'CD Pipeline - Mozilla SOPS - wäert ganz gutt a Kombinatioun mat Kustomize Geheimnisser Aarbecht. Et ginn aner Tools, wéi dotGPG, déi ähnlech Funktiounen ausféieren: HashiCorp Vault, Personnaliséieren Secret Value Plugins.

Ingress

Ausser Dir wielt lokal Port Forwarding ze benotzen, braucht Dir e konfiguréierten Ingress Controller. Wann Dir net benotzt ingress-nginx (Helm Chart) da wësst Dir wahrscheinlech schonn datt Dir déi néideg Annotatiounen installéiere musst ingress-patch.yaml.tmpl oder platform/ingress.yaml. Wann Dir Ingress-nginx benotzt an eng nginx Ingress Klass gesitt mat engem Lastbalancer deen drop weist an en externen DNS oder Wildcard DNS Entrée, sidd Dir gutt fir ze goen. Soss, konfiguréieren den Ingress Controller an DNS, oder sprangen dës Schrëtt a behalen déi direkt Verbindung zum Pod.

TLS

Wann Dir benotzt cert-Manager oder kube-lego a letsencrypt - Certificaten fir den neie Login ginn automatesch kritt. Soss, oppen ingress-patch.yaml.tmpl a personaliséiere se fir Äre Besoinen ze passen.

Lancéiere!

Wann Dir alles hei uewen geschriwwen hutt, dann de Kommando make skaffold HOSTNAME=<you.example.com> soll eng verfügbar Instanz lancéieren an <hostname>/camunda

Wann Dir Äre Login net op eng ëffentlech URL gesat hutt, kënnt Dir se mat weiderleeden localhost: kubectl port-forward -n camunda-bpm-demo svc/camunda-bpm 8080:8080 op localhost:8080/camunda

Waart e puer Minutten bis Tomcat komplett fäerdeg ass. Cert-Manager wäert e bëssen Zäit huelen fir den Domain Numm z'iwwerpréiwen. Dir kënnt dann d'Logbicher iwwerwaachen mat verfügbaren Tools wéi e Tool wéi kubetail, oder einfach mat kubectl:

kubectl logs -n camunda-bpm-demo $(kubectl get pods -o=name -n camunda-bpm-demo) -f

Nächst Schrëtt

Autorisatioun

Dëst ass méi relevant fir Camunda BPM ze konfiguréieren wéi Kubernetes, awer et ass wichteg ze bemierken datt Par défaut d'Authentifikatioun an der REST API deaktivéiert ass. Du kanns Basis Authentifikatioun aktivéieren oder benotzt eng aner Method wéi J.W.T.. Dir kënnt Configmaps a Volumen benotze fir xml ze lueden, oder xmlstarlet (kuckt hei uewen) fir existent Dateien am Bild z'änneren, an entweder wget benotzen oder se lueden mat engem Init Container an engem gemeinsame Volumen.

Sëtzung Gestioun

Wéi vill aner Uwendungen, handhabt Camunda BPM Sessiounen am JVM, also wann Dir méi Repliken wëllt lafen, kënnt Dir Sticky Sessiounen aktivéieren (zum Beispill fir ingress-nginx), déi existéieren bis d'Replika verschwënnt, oder de Max-Age Attribut fir Cookien setzen. Fir eng méi robust Léisung kënnt Dir Session Manager am Tomcat ofsetzen. Lars huet separat Post iwwer dëst Thema, awer eppes wéi:

wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/
2.3.2/memcached-session-manager-2.3.2.jar -P lib/ &&
wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc9/
2.3.2/memcached-session-manager-tc9-2.3.2.jar -P lib/ &&

sed -i '/^</Context>/i
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="redis://redis-proxy.db:22121"
sticky="false"
sessionBackupAsync="false"
storageKeyPrefix="context"
lockingMode="auto"
/>' conf/context.xml

Remarque: Dir kënnt xmlstarlet benotzen amplaz sed

Mir benotzt zweemproxy virun Google Cloud Memorystore, mat memcached-Sessioun-Manager (ënnerstëtzt Redis) fir et ze lafen.

Skaléieren

Wann Dir scho Sessiounen versteet, da kann déi éischt (an dacks déi lescht) Begrenzung fir d'Skaléierung vu Camunda BPM d'Verbindung mat der Datebank sinn. Deelweis Personnalisatioun ass scho verfügbar "aus der Këscht" Loosst eis och intialSize an der Settings.xml Datei ausschalten. Addéieren Horizontal Pod Autoscaler (HPA) an Dir kënnt d'Zuel vun de Pods einfach automatesch skaléieren.

Ufroen a Restriktiounen

В platform/deployment.yaml Dir gesitt datt mir d'Ressource Feld schwéier kodéiert hunn. Dëst funktionnéiert gutt mat HPA, awer kann zousätzlech Konfiguratioun erfuerderen. De kustomize Patch ass gëeegent fir dëst. Cm. ingress-patch.yaml.tmpl и ./kustomization.yaml.tmpl

Konklusioun

Also hu mir Camunda BPM op Kubernetes installéiert mat Prometheus Metriken, Logbicher, H2 Datebank, TLS an Ingress. Mir hunn Jar Dateien a Konfiguratiounsdateien bäigefüügt mat ConfigMaps an Dockerfile. Mir hunn iwwer d'Austausch vun Daten op Bänn geschwat an direkt un Ëmweltvariablen aus Geheimnisser. Zousätzlech hu mir en Iwwerbléck iwwer d'Opstelle vu Camunda fir verschidde Repliken an eng authentifizéiert API geliwwert.

Referenze

github.com/camunda-cloud/camunda-examples/camunda-bpm-kubernetes

├── generated-manifest.yaml <- manifest for use without kustomize
├── images
│ └── camunda-bpm
│ └── Dockerfile <- overlay docker image
├── ingress-patch.yaml.tmpl <- site-specific ingress configuration
├── kustomization.yaml.tmpl <- main Kustomization
├── Makefile <- make targets
├── namespace.yaml
├── platform
│ ├── config
│ │ └── prometheus-jmx.yaml <- prometheus exporter config file
│ ├── deployment.yaml <- main deployment
│ ├── ingress.yaml
│ ├── kustomization.yaml <- "base" kustomization
│ ├── service-monitor.yaml <- example prometheus-operator config
│ └── service.yaml
└── skaffold.yaml.tmpl <- skaffold directives

05.08.2020/XNUMX/XNUMX, Iwwersetzung Artikelen Alastair Firth, Lars Lange

Source: will.com

Setzt e Commentaire