Pokretanje Camunda BPM-a na Kubernetesu

Pokretanje Camunda BPM-a na Kubernetesu

Koristite li Kubernetes? Jeste li spremni premjestiti svoje Camunda BPM instance s virtualnih strojeva ili ih možda samo pokušati pokrenuti na Kubernetesu? Pogledajmo neke uobičajene konfiguracije i pojedinačne stavke koje se mogu prilagoditi vašim specifičnim potrebama.

Pretpostavlja se da ste prije koristili Kubernetes. Ako ne, zašto ne pogledati rukovodstvo a ne pokrenete svoj prvi klaster?

Autori

  • Alastair Firth (Alastair Firth) - viši inženjer pouzdanosti lokacije u timu Camunda Cloud;
  • 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, vjerojatno nije uspjelo jer nemate instalirane skele i kustomize. Pa onda čitajte!

Što 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. Korištenjem sistemskih poziva umjesto hardverske emulacije i mogućnosti kernela da upravlja memorijom i prebacivanjem zadataka, vrijeme podizanja i pokretanja svedeno je na minimum. Međutim, najveća korist može doći od standardnog API-ja koji Kubernetes pruža za konfiguriranje infrastrukture potrebne za sve aplikacije: pohranu, umrežavanje i nadzor. U lipnju 2020. napunio je 6 godina i možda je drugi najveći projekt otvorenog koda (nakon Linuxa). Nedavno je aktivno stabilizirao svoju funkcionalnost nakon brze iteracije u proteklih nekoliko godina jer postaje kritičan za radna opterećenja proizvodnje diljem svijeta.

Camunda BPM Engine može se lako povezati s drugim aplikacijama koje se izvode na istom klasteru, a Kubernetes pruža izvrsnu skalabilnost, omogućujući vam da povećate troškove infrastrukture samo kada je stvarno potrebno (i lako ih smanjite po potrebi).

Kvaliteta praćenja također je uvelike poboljšana s alatima kao što su Prometheus, Grafana, Loki, Fluentd i Elasticsearch, koji vam omogućuju centralni pregled svih radnih opterećenja u klasteru. Danas ćemo pogledati kako implementirati Prometheus exporter u Java Virtual Machine (JVM).

ciljevi

Pogledajmo nekoliko područja na kojima možemo prilagoditi sliku Camunda BPM Dockera (Github) tako da dobro komunicira s Kubernetesom.

  1. Dnevnici i metrika;
  2. Veze s bazom podataka;
  3. Ovjera;
  4. Upravljanje sesijom.

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

Primijetiti: Koristite li Enterprise verziju? Izgled здесь i po potrebi ažurirajte poveznice slika.

Razvoj tijeka rada

U ovoj demonstraciji koristit ćemo Skaffold za izradu Docker slika pomoću Google Cloud Build-a. Ima dobru podršku za razne alate (kao što su Kustomize i Helm), CI i alate za izgradnju te pružatelje infrastrukture. Datoteka skaffold.yaml.tmpl uključuje postavke za Google Cloud Build i GKE, pružajući vrlo jednostavan način za pokretanje infrastrukture proizvodne razine.

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 značajke.

Za yaml predloške u Kubernetesu koristimo kustomize za upravljanje yaml slojevima bez račvanja cijelog manifesta, što vam omogućuje korištenje git pull --rebase za daljnja poboljšanja. Sada je u kubectlu i prilično dobro radi za takve stvari.

Također koristimo envsubst za popunjavanje naziva hosta i GCP ID projekta u *.yaml.tmpl datotekama. Možete vidjeti kako radi u makefile ili samo nastaviti dalje.

Preduvjeti

  • Radni klaster Kubernetes
  • Prilagodite
  • skela - za stvaranje vlastitih docker slika i jednostavnu implementaciju u GKE
  • Kopija ovog koda
  • Envsubst

Tijek rada pomoću manifesta

Ako ne želite koristiti kustomize ili skaffold, možete pogledati manifeste u generated-manifest.yaml i prilagodite ih tijeku 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. Otvorenog je koda i ima moćan upitni jezik. Vizualizaciju ćemo povjeriti Grafanu - dolazi s velikim brojem nadzornih ploča dostupnih odmah po izlasku. Međusobno su povezani i s njima se relativno lako postavlja prometej-operator.

Prema zadanim postavkama, Prometheus koristi model ekstrakcije <service>/metrics, a dodavanje bočnih kontejnera za to je uobičajeno. Nažalost, JMX metrika se najbolje bilježi unutar JVM-a, tako da kontejneri s prikolicom nisu tako učinkoviti. Povežimo se jmx_izvoznik otvorenog koda iz Prometheusa u JVM dodavanjem u sliku spremnika koja će osigurati put /metrics na drugom priključku.

Dodajte Prometheus jmx_exporter u spremnik

-- 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 nadzirati tomcat i prikazati njegovu metriku u Prometheus formatu na <svc>:9404/metrics

Postavljanje izvoznika

Pažljivi čitatelj može se zapitati odakle je to došlo prometheus-jmx.yaml? Postoji mnogo različitih stvari koje se mogu izvoditi u JVM-u, a tomcat je samo jedna od njih, tako da program za izvoz treba dodatnu konfiguraciju. Dostupne su standardne konfiguracije za tomcat, wildfly, kafka i tako dalje здесь. Tomcat ćemo dodati kao ConfigMap u Kubernetesu i zatim ga montirajte kao volumen.

Prvo dodajemo konfiguracijsku datoteku izvoznika u 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 izvrsni jer hashiraju podatke o konfiguraciji i prisiljavaju na ponovno pokretanje modula ako se promijeni. Oni također smanjuju količinu konfiguracije u Deploymentu budući da možete montirati cijelu "mapu" konfiguracijskih datoteka u jednom VolumeMount-u.

Na kraju, 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
[...]

Predivno. Ako Prometheus nije konfiguriran za potpuno čišćenje, možda ćete mu morati reći da očisti kapsule. Prometheus Operator korisnici mogu koristiti service-monitor.yaml započeti. Istražiti Service-monitor.yaml, dizajn operatera и ServiceMonitorSpec prije nego počnete.

Proširenje 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 za montiranje bilo koje druge konfiguracijske datoteke koje trebate. Možete čak montirati novu skriptu za pokretanje. Možeš koristiti podput 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

Super vijest! Dnevnici aplikacija već su dostupni na stdout-u, na primjer s kubectl logs. Fluentd (instaliran prema zadanim postavkama u GKE-u) proslijedit će vaše zapise na Elasticsearch, Loki ili platformu za evidentiranje vašeg poduzeća. Ako želite koristiti jsonify za zapisnike, možete slijediti gornji predložak za instalaciju povratna prijava.

Baza podataka

Prema zadanim postavkama, slika će imati H2 bazu podataka. Ovo nam ne odgovara i koristit ćemo Google Cloud SQL s Cloud SQL proxyjem - to ć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. 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
[...]

Primijetiti: Možete koristiti Kustomize za implementaciju u različitim okruženjima pomoću sloja: primjer.

Primijetiti: korištenje valueFrom: secretKeyRef. Molimo, koristite ova Kubernetes značajka čak i tijekom razvoja kako bi vaše tajne bile sigurne.

Vjerojatno već imate preferirani sustav za upravljanje Kubernetes tajnama. Ako ne, evo nekoliko opcija: Šifriranje pomoću KMS-a vašeg pružatelja usluga oblaka i njihovo ubacivanje u K8S kao tajne putem CD cjevovoda − Mozilla SOPS - radit će vrlo dobro u kombinaciji s Kustomize tajnama. Postoje i drugi alati, kao što je dotGPG, koji obavljaju slične funkcije: HashiCorp trezor, Prilagodite dodatke Secret Value.

Ulaz

Osim ako ne odaberete prosljeđivanje lokalnog porta, trebat će vam konfigurirani ulazni kontroler. Ako ne koristite ingress-nginx (Shema kormila) onda vjerojatno već znate da morate instalirati potrebne bilješke ingress-patch.yaml.tmpl ili platform/ingress.yaml. Ako koristite ingress-nginx i vidite nginx ulaznu klasu s balanserom opterećenja koji pokazuje na nju i vanjski DNS ili DNS unos sa zamjenskim znakom, spremni ste. U suprotnom, konfigurirajte Ingress Controller i DNS ili preskočite ove korake i zadržite izravnu vezu s modulom.

TLS

Ako koristite cert-menadžer ili kube-lego i letsencrypt - automatski će se dobiti certifikati za novu prijavu. U protivnom otvorite ingress-patch.yaml.tmpl i prilagodite ga svojim potrebama.

Pokreni!

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

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

Pričekajte nekoliko minuta dok tomcat ne bude potpuno spreman. Cert-manager-u će trebati neko vrijeme da potvrdi naziv domene. Zatim možete nadzirati zapisnike pomoću dostupnih alata kao što je alat poput kubetaila 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 konfiguriranje Camunda BPM-a nego Kubernetesa, ali važno je napomenuti da je prema zadanim postavkama provjera autentičnosti onemogućena u REST API-ju. Možeš omogućiti osnovnu autentifikaciju ili upotrijebite drugu metodu poput J.W.T.. Možete koristiti configmape i volumene za učitavanje xml-a ili xmlstarlet (vidi gore) za uređivanje postojećih datoteka na slici, i koristiti wget ili ih učitati pomoću init spremnika i zajedničkog volumena.

Upravljanje sesijom

Kao i mnoge druge aplikacije, Camunda BPM upravlja sesijama u JVM-u, pa 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 postaviti 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 nešto poput:

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

Primijetiti: možete koristiti xmlstarlet umjesto sed-a

Koristili smo twemproxy ispred Google Cloud Memorystorea, sa memcached-session-manager (podržava Redis) da biste ga pokrenuli.

Skaliranje

Ako već razumijete sesije, tada prvo (a često i posljednje) ograničenje za skaliranje Camunda BPM-a može biti veza s bazom podataka. Djelomična prilagodba je već dostupna "iz kutije" Također onemogućimo intialSize u datoteci settings.xml. Dodati Horizontalni pod Autoscaler (HPA) i možete jednostavno automatski skalirati broj mahuna.

Zahtjevi i ograničenja

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

Izlaz

Tako smo instalirali Camunda BPM na Kubernetes s Prometheus metrikom, zapisnicima, H2 bazom podataka, TLS-om i Ingressom. Dodali smo jar datoteke i konfiguracijske datoteke koristeći ConfigMaps i Dockerfile. Razgovarali smo o razmjeni podataka u volumene i izravno u varijable okoline iz tajni. Osim toga, dali smo pregled postavljanja Camunde za višestruke replike 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/XNUMX/XNUMX, prijevod Članak Alastair Firth, Lars Lange

Izvor: www.habr.com

Dodajte komentar