Pokretanje Camunde BPM-a na Kubernetesu

Pokretanje Camunde BPM-a na Kubernetesu

Da li koristite Kubernetes? Spremni ste da premestite svoje Camunda BPM instance iz virtuelnih mašina ili možda jednostavno pokušate da ih pokrenete na Kubernetes? Pogledajmo neke uobičajene konfiguracije i pojedinačne stavke koje se mogu prilagoditi vašim specifičnim potrebama.

Pretpostavlja se da ste ranije koristili Kubernetes. Ako ne, zašto ne pogledati vodič i ne pokrenete svoj prvi klaster?

Autori

  • Alastair Firth (Alastair Firth) - viši inženjer za pouzdanost lokacije u Camunda Cloud timu;
  • Lars Lange (Lars Lange) - DevOps inženjer u Camundi.

Ukratko:

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

U redu, vjerovatno nije uspjelo jer nemate instalirane skaffold i kustomize. Pa onda čitajte dalje!

Šta je Camunda BPM

Camunda BPM je platforma otvorenog koda za upravljanje poslovnim procesima i automatizaciju odlučivanja koja povezuje poslovne korisnike i programere softvera. Idealan je za koordinaciju i povezivanje ljudi, (mikro) servisa ili čak botova! Više o različitim slučajevima upotrebe možete pročitati na link.

Zašto koristiti Kubernetes

Kubernetes je postao de facto standard za pokretanje modernih aplikacija na Linuxu. Koristeći sistemske pozive umjesto hardverske emulacije i sposobnost kernela da upravlja memorijom i prebacivanjem zadataka, vrijeme pokretanja i vrijeme pokretanja svedeno je na minimum. Međutim, najveća korist može doći od standardnog API-ja koji Kubernetes pruža za konfigurisanje infrastrukture potrebne svim aplikacijama: skladištenje, umrežavanje i nadzor. Navršio je 2020 godina u junu 6. i možda je drugi najveći projekat otvorenog koda (nakon Linuxa). Nedavno je aktivno stabilizovao svoju funkcionalnost nakon brze iteracije u proteklih nekoliko godina jer je postao kritičan za proizvodna opterećenja širom svijeta.

Camunda BPM Engine može lako da se poveže sa drugim aplikacijama koje rade na istom klasteru, a Kubernetes pruža odličnu skalabilnost, omogućavajući vam da povećate troškove infrastrukture samo kada je zaista potrebno (i lako ih smanjite po potrebi).

Kvalitet nadzora je također uvelike poboljšan alatima kao što su Prometheus, Grafana, Loki, Fluentd i Elasticsearch, koji vam omogućavaju da centralno vidite sva radna opterećenja u klasteru. Danas ćemo pogledati kako implementirati Prometheus eksporter u Java virtuelnu mašinu (JVM).

Ciljevi

Pogledajmo nekoliko područja u kojima možemo prilagoditi Camunda BPM Docker sliku (GitHub) tako da dobro komunicira sa Kubernetesom.

  1. Dnevnici i metrika;
  2. Veze baze podataka;
  3. Authentication;
  4. Upravljanje sesijama.

Pogledat ćemo nekoliko načina za postizanje ovih ciljeva i jasno prikazati cijeli proces.

primjedba: Koristite li Enterprise verziju? Pogledaj ovdje i ažurirajte linkove slika po potrebi.

Razvoj toka posla

U ovoj demonstraciji koristit ćemo Skaffold za izradu Docker slika koristeći Google Cloud Build. Ima dobru podršku za različite alate (kao što su Kustomize i Helm), CI i alate za izgradnju, i dobavljače infrastrukture. File skaffold.yaml.tmpl uključuje postavke za Google Cloud Build i GKE, pružajući vrlo jednostavan način za pokretanje infrastrukture proizvodnog nivoa.

make skaffold će učitati Dockerfile kontekst u Cloud Build, izgraditi sliku i pohraniti je u GCR, a zatim primijeniti manifeste na vaš klaster. To je ono što radi make skaffold, ali Skaffold ima mnoge druge karakteristike.

Za yaml predloške u Kubernetesu, koristimo kustomize za upravljanje yaml preklopima bez račvanja cijelog manifesta, što vam omogućava da koristite git pull --rebase za dalja poboljšanja. Sada je u kubectlu i dosta dobro radi za takve stvari.

Također koristimo envsubst da popunimo ime hosta i ID GCP projekta u *.yaml.tmpl datoteke. Možete vidjeti kako to funkcionira u makefile ili jednostavno nastavite dalje.

Preduvjeti

  • Radni klaster Kubernet
  • Prilagodi
  • Skaffold - za kreiranje vlastitih docker slika i jednostavnu implementaciju u GKE
  • Kopija ovog koda
  • Envsubst

Tok rada koristeći manifeste

Ako ne želite da koristite kustomize ili skaffold, možete se obratiti na manifeste u generated-manifest.yaml i prilagodite ih toku rada po vašem izboru.

Dnevnici i metrika

Prometheus je postao standard za prikupljanje metrike u Kubernetesu. Zauzima istu nišu kao AWS Cloudwatch Metrics, Cloudwatch Alerts, Stackdriver Metrics, StatsD, Datadog, Nagios, vSphere Metrics i drugi. On je otvorenog koda i ima moćan jezik upita. Vizualizaciju ćemo povjeriti Grafani - dolazi s velikim brojem kontrolnih ploča dostupnih iz kutije. One su međusobno povezane i relativno ih je lako instalirati prometej-operator.

Po defaultu, Prometheus koristi model ekstrakcije <service>/metrics, a dodavanje bočnih kontejnera za ovo je uobičajeno. Nažalost, JMX metrike se najbolje bilježe unutar JVM-a, tako da kontejneri s prikolicom nisu toliko efikasni. Hajde da se povežemo jmx_exporter open source od Prometheusa do JVM-a dodavanjem u sliku kontejnera koja će osigurati putanju /metrics na drugom portu.

Dodajte Prometheus jmx_exporter u kontejner

-- 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

Pa, to je bilo lako. Izvoznik će pratiti tomcat i prikazati njegove metrike u Prometheus formatu na <svc>:9404/metrics

Podešavanje izvoznika

Pažljivi čitalac može se zapitati odakle je došao prometheus-jmx.yaml? Postoji mnogo različitih stvari koje se mogu pokrenuti u JVM-u, a tomcat je samo jedna od njih, tako da je izvozniku potrebna dodatna konfiguracija. Dostupne su standardne konfiguracije za mačku, mušu, kafku i tako dalje ovdje. Dodaćemo mačku kao ConfigMap u Kubernetes-u, a zatim ga montirajte kao volumen.

Prvo, dodajemo konfiguracijsku datoteku izvoznika u naš direktorij platform/config/

platform/config
└── prometheus-jmx.yaml

Zatim dodajemo ConfigMapGenerator в kustomization.yaml.tmpl:

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

Ovo će dodati svaki element files[] kao konfiguracijski element ConfigMap. ConfigMapGenerators su odlični jer heširaju konfiguracijske podatke i prisiljavaju pod ponovno pokretanje ako se promijeni. Oni također smanjuju količinu konfiguracije u Deployment-u budući da možete montirati cijelu "mapu" konfiguracijskih datoteka u jedan VolumeMount.

Konačno, moramo montirati ConfigMap kao volumen na pod:

-- 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
[...]

Divno. Ako Prometheus nije konfiguriran da izvrši potpuno čišćenje, možda ćete mu morati reći da očisti podove. Korisnici Prometheus Operatora mogu koristiti service-monitor.yaml za početak. Istražiti Service-monitor.yaml, dizajn operatera и ServiceMonitorSpec prije nego počnete.

Proširivanje ovog uzorka na druge slučajeve upotrebe

Sve datoteke koje dodamo u ConfigMapGenerator bit će dostupne u novom direktoriju /etc/config. Možete proširiti ovaj predložak da montirate sve druge konfiguracijske datoteke koje su vam potrebne. Možete čak montirati novu skriptu za pokretanje. Možeš koristiti subPath za montiranje pojedinačnih datoteka. Da biste ažurirali xml datoteke, razmislite o korištenju xmlstarlet umjesto sed. Već je uključeno u sliku.

Časopisi

Odlične vijesti! Dnevnici aplikacija su već dostupni na stdout-u, na primjer sa kubectl logs. Fluentd (podrazumevano instaliran u GKE) će proslediti vaše zapise na Elasticsearch, Loki ili platformu za evidentiranje vašeg preduzeća. Ako želite koristiti jsonify za dnevnike, možete slijediti gornji predložak za instalaciju logback.

Baza podataka

Podrazumevano, slika će imati H2 bazu podataka. Ovo nije prikladno za nas, a mi ćemo koristiti Google Cloud SQL sa Cloud SQL Proxy - ovo će biti potrebno kasnije za rješavanje internih problema. Ovo je jednostavna i pouzdana opcija ako nemate vlastite preferencije u postavljanju baze podataka. AWS RDS pruža sličnu uslugu.

Bez obzira na bazu podataka koju odaberete, osim ako nije H2, morat ćete postaviti odgovarajuće varijable okruženja u platform/deploy.yaml. To izgleda otprilike ovako:

-- 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
[...]

primjedba: Možete koristiti Kustomize za implementaciju u različita okruženja pomoću preklapanja: primer.

primjedba: upotreba valueFrom: secretKeyRef. Molim te, koristi ovu Kubernetes funkciju čak i tokom razvoja da čuvate svoje tajne na sigurnom.

Vjerovatno već imate preferirani sistem za upravljanje Kubernetes tajnama. Ako ne, evo nekoliko opcija: Šifriranje pomoću KMS-a vašeg provajdera oblaka i zatim ubacivanje u K8S kao tajne putem CD-a – Mozilla SOPS - će raditi vrlo dobro u kombinaciji sa Kustomize secrets. Postoje i drugi alati, kao što je dotGPG, koji obavljaju slične funkcije: HashiCorp trezor, Prilagodite dodatke tajne vrijednosti.

Ulaz

Osim ako ne odlučite koristiti prosljeđivanje lokalnog porta, trebat će vam konfigurirani Ingress Controller. Ako ne koristite ingress-nginx (Helm chart) tada najvjerovatnije već znate da trebate instalirati potrebne napomene ingress-patch.yaml.tmpl ili platform/ingress.yaml. Ako koristite ingress-nginx i vidite ulaznu klasu nginx sa balansatorom opterećenja koji pokazuje na nju i vanjskim DNS ili zamjenskim DNS unosom, spremni ste za početak. U suprotnom, konfigurišite Ingress Controller i DNS ili preskočite ove korake i zadržite direktnu vezu sa podom.

TLS

Ako koristite cert-manager ili kube-lego i letsencrypt - sertifikati za novu prijavu će se dobiti automatski. Inače, otvori ingress-patch.yaml.tmpl i prilagodite ga svojim potrebama.

Pokreni!

Ako ste pratili sve gore napisano, onda naredbu make skaffold HOSTNAME=<you.example.com> treba pokrenuti dostupnu instancu u <hostname>/camunda

Ako niste postavili svoju prijavu na javni URL, možete ga preusmjeriti sa localhost: kubectl port-forward -n camunda-bpm-demo svc/camunda-bpm 8080:8080 na localhost:8080/camunda

Pričekajte nekoliko minuta dok mačak nije potpuno spreman. Cert-manageru će trebati neko vrijeme da potvrdi naziv domene. Zatim možete pratiti zapisnike koristeći dostupne alate, kao što je alat kao što je kubetail, ili jednostavno koristeći kubectl:

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

Sljedeći koraci

Autorizacija

Ovo je relevantnije za konfigurisanje Camunda BPM-a nego Kubernetes-a, ali je važno napomenuti da je po defaultu autentifikacija onemogućena u REST API-ju. Možeš omogućite osnovnu autentifikaciju ili koristite neku drugu metodu kao npr J.W.T.. Možete koristiti configmape i volumene za učitavanje xml-a, ili xmlstarlet (pogledajte gore) za uređivanje postojećih datoteka na slici, ili koristiti wget ili ih učitati koristeći init kontejner i dijeljeni volumen.

Upravljanje sesijama

Kao i mnoge druge aplikacije, Camunda BPM upravlja sesijama u JVM-u, tako da ako želite pokrenuti više replika, možete omogućiti ljepljive sesije (na primjer za ingress-nginx), koji će postojati dok replika ne nestane, ili postavite atribut Max-Age za kolačiće. Za robusnije rješenje, možete implementirati Session Manager u Tomcat. Lars ima zaseban post na ovu temu, ali nesto kao:

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

primjedba: možete koristiti xmlstarlet umjesto sed

Koristili smo twemproxy ispred Google Cloud Memorystore-a, sa memcached-session-manager (podržava Redis) za pokretanje.

Skaliranje

Ako već razumijete sesije, onda prvo (i često posljednje) ograničenje za skaliranje Camunda BPM-a može biti veza s bazom podataka. Djelomično prilagođavanje je već dostupno "iz kutije" Deaktivirajmo i intialSize u datoteci settings.xml. Dodati Horizontal Pod Autoscaler (HPA) i lako možete automatski skalirati broj mahuna.

Zahtjevi i ograničenja

В platform/deployment.yaml Vidjet ćete da smo čvrsto kodirali polje resursa. Ovo dobro funkcionira s HPA, ali može zahtijevati dodatnu konfiguraciju. Za to je prikladan kustomize flaster. Cm. ingress-patch.yaml.tmpl и ./kustomization.yaml.tmpl

zaključak

Tako smo instalirali Camunda BPM na Kubernetes sa Prometheus metrikama, logovima, H2 bazom podataka, TLS-om i Ingressom. Dodali smo jar datoteke i konfiguracijske datoteke koristeći ConfigMaps i Dockerfile. Razgovarali smo o razmjeni podataka na volumene i direktno na varijable okruženja iz tajni. Osim toga, dali smo pregled podešavanja Camunde za više replika i autentificirani API.

reference

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, prevod članci Alastair Firth, Lars Lange

izvor: www.habr.com

Dodajte komentar