
Koristite Kubernetes? Spremni ste preseliti svoje instance Camunda BPM s virtualnih mašina ili možda samo želite probati pokrenuti ih na Kubernetesu? Pogledajmo neke uobičajene konfiguracije i pojedinačne komponente koje se mogu prilagoditi vašim specifičnim potrebama.
Pretpostavljamo da ste već koristili Kubernetes ranije. Ako niste, zašto ne biste pogledali i pokrenuli svoj prvi klaster?
Autori
- (Alastair Firth) je viši inženjer za pouzdanost sajta (Site Reliability Engineer) u Camunda Cloud timu;
- (Lars Lange) je DevOps inženjer u Camundi.
Ukratko, to je:
git clone https://github.com/camunda-cloud/camunda-examples.git
cd camunda-examples/camunda-bpm-demo
make skaffold
Dobro, vjerojatno to nije uspjelo jer nemate instalirane skaffold i kustomize. Pa, čitajte dalje!
Što je Camunda BPM
Camunda BPM je platforma s otvorenim izvorom za upravljanje poslovnim procesima i automatizaciju donošenja odluka koja povezuje poslovne korisnike i programere. Savršena je za koordinaciju i povezivanje ljudi, (mikro)servisa ili čak botova! Više o različitim mogućnostima korištenja možete pročitati na .
Zašto koristiti Kubernetes
Kubernetes je postao de facto standard za pokretanje modernih aplikacija na Linuxu. Zbog korištenja sistemskih poziva umjesto emulacije hardverskog nivoa i mogućnosti jezgre za upravljanje memorijom i prebacivanjem zadataka, vrijeme učitavanja i vrijeme pokretanja svedeni su na minimum. Međutim, najveća prednost može doći od standardnog API-ja koji Kubernetes pruža za konfiguraciju infrastrukture potrebne svim aplikacijama: pohranu, mrežu i nadzor. U junu 2020. godine napunio je 6 godina i, po svemu sudeći, to je drugi najveći projekt s otvorenim izvorom (poslije Linuxa). U posljednje vrijeme aktivno stabilizira svoju funkcionalnost nakon brze iteracije u posljednjih nekoliko godina, jer to postaje kritično važno za proizvodne opterećenja širom svijeta.
Camunda BPM Engine se lako može povezati s drugim aplikacijama koje rade unutar istog klastera, a Kubernetes osigurava izvrsnu skalabilnost, omogućujući povećanje troškova infrastrukture samo kada je to doista potrebno (i lako njihovo smanjenje kad god je potrebno).
Kvaliteta nadzora također se značajno poboljšava korištenjem alata poput Prometheusa, Grafane, Lokija, Fluentda i Elasticsearh-a, što omogućava centralizirano pregledavanje svih radnih opterećenja klastera. Danas ćemo proučiti kako implementirati Prometheus izvođača na Java virtualnom stroju (JVM).
Ciljevi
Pogledajmo nekoliko područja u kojima možemo prilagoditi Docker sliku Camunda BPM (), kako bi se dobro integrirala s Kubernetesom.
- Dnevnici i metrike;
- Povezivanje s bazom podataka;
- Autentifikacija;
- Upravljanje sesijama.
Proučit ćemo nekoliko načina za ostvarivanje ovih ciljeva i vizualno prikazati cijeli proces.
Napomena: Koristite li Enterprise verziju? Pogledajte i ažurirajte veze na slike prema potrebi.
Razvoj radnog toka
U ovoj demonstraciji koristit ćemo Skaffold za izgradnju Docker slika putem Google Cloud Builda. Ima dobru podršku za različite alate (kao što su Kustomize i Helm), CI i alate za izgradnju, kao i davatelje infrastrukture. Datoteka skaffold.yaml.tmpl sadrži postavke za Google Cloud Build i GKE, što omogućava vrlo jednostavan način pokretanja infrastrukture industrijske razine.
make skaffold učitat će Dockerfile kontekst u Cloud Build, izgraditi sliku i spremiti je u GCR, a zatim primijeniti manifeste na vašem klasteru. To je ono što radi make skaffold, ali Skaffold ima mnogo drugih mogućnosti.
Za yaml predloške u Kubernetesu koristimo kustomize za upravljanje yaml nadogradnjama bez razgranavanja cijelog manifesta, što vam omogućava da koristite git pull --rebase za dodatna poboljšanja. Sada se nalazi u kubectl i to dobro radi za takve stvari.
Također koristimo envsubst za popunjavanje imena hosta i identifikatora projekta GCP u datotekama * .yaml.tmpl. Možete vidjeti kako to funkcionira u makefile ili jednostavno nastavite dalje.
Preduvjeti
- Radni klaster
- — za izradu vlastitih docker slika i jednostavno implementiranje u GKE
- Kopija ovog koda
- Envsubst
Radni tok pomoću manifestacija
Ako ne želite koristiti kustomize ili skaffold, možete se obratiti manifestima u generated-manifest.yaml i prilagoditi ih radnom toku po svom izboru.
Dnevnici i metrike
Prometheus je postao standard za prikupljanje metrika u Kubernetesu. Zauzima istu nišu kao AWS Cloudwatch Metrics, Cloudwatch Alerts, Stackdriver Metrics, StatsD, Datadog, Nagios, vSphere Metrics i drugi. Ima otvoreni izvorni kod i moćan jezik upita. Vizualizaciju ćemo prepustiti Grafani — dolazi s velikim brojem nadzornih panela koji su dostupni odmah. Povezani su međusobno i relativno su jednostavni za instalaciju. .
Prema zadanim postavkama, Prometheus koristi model ekstrakcije /metrics, a dodavanje sidecar kontejnera za to je uobičajena praksa. Nažalost, JMX metrike najbolje se registriraju unutar JVM-a, pa sidecar kontejneri nisu tako učinkoviti. Povezimo otvoreni izvorni kod od Prometheusa s JVM-om dodajući ga u sliku kontejnera koja će osigurati put /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, bilo je lako. Egzporter će nadzirati tomcat i prikazati njegove metrike u Prometheus formatu na adresi :9404/metrics
Konfiguracija egzportera
Pažljivi čitatelj možda će se pitati odakle dolazi prometheus-jmx.yaml? Существует много разных вещей, которые могут работать в JVM, и tomcat — это только одна из них, поэтому экспортер нуждается в некоторой дополнительной настройке. Стандартные конфигурации для tomcat, wildfly, kafka и так далее доступны . Dodavat ćemo tomcat kao u Kubernetes, a zatim ćemo ga montirati kao volumen.
Prvo, dodajemo datoteku konfiguracije egzportera u našu direktoriju platform/config/
platforma/konfiguracija
└── prometheus-jmx.yaml
Zatim dodajemo u kustomization.yaml.tmpl:
-- platform/kustomization.yaml.tmpl
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
[...]
configMapGenerator:
- name: config
files:
- config/prometheus-jmx.yaml
To će dodati svaki element files[] kao element konfiguracije ConfigMap. ConfigMapGenerators su dobri po tome što hashiraju podatke u konfiguraciji i pokreću ponovno pokretanje poda ako se promijene. Također smanjuju količinu konfiguracije u Deployamentu, budući da možete montirati cijelu "mapu" konfiguracijskih datoteka u jednom VolumeMountu.
Na kraju, trebamo montirati ConfigMap kao volumen za 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
[...]
Odlično. Ako Prometheus nije podešen za 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 rada. Istražite Service-monitor.yaml, i prije nego što započnete.
Širenje ovog obrasca na druge primjene
Sve datoteke koje dodajemo u ConfigMapGenerator bit će dostupne u novom direktoriju. /etc/config. Možete proširiti ovu predložak za montiranje svih drugih konfiguracijskih datoteka koje su vam potrebne. Možete čak montirati novi startni skript. Možete koristiti za montiranje pojedinačnih datoteka. Za ažuriranje xml-datoteka razmislite o korištenju umjesto sed. Već je uključen u sliku.
Dnevnici
Sjajne vijesti! Aplikacijski dnevnici su već dostupni na stdout, na primjer, putem kubectl logs. Fluentd (koji je zadano instaliran u GKE) će preusmjeriti vaše dnevnike u Elasticsearch, Loki ili na vašu korporativnu platformu za dnevnik. Ako želite koristiti jsonify za dnevnike, možete slijediti gornji predložak za instalaciju .
Baza podataka
Zadano će slika imati H2 bazu podataka. To nam ne odgovara, a koristit ćemo Google Cloud SQL s Cloud SQL Proxy — to će biti potrebno kasnije za rješavanje internih zadataka. To je jednostavna i pouzdana opcija, ako nemate vlastite preferencije za konfiguraciju baze podataka. AWS RDS pruža sličnu uslugu.
Bez obzira na to koju bazu podataka odaberete, osim 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
[...]
Napomena: Možete koristiti Kustomize za raspoređivanje u različitim okruženjima koristeći overlay: .
Napomena: korištenje valueFrom: secretKeyRef. Molimo vas, koristite čak i tijekom razvoja kako biste sačuvali svoje tajne na sigurnom.
Vrlo je vjerojatno da već imate preferirani sustav upravljanja tajnama Kubernetes. Ako nemate, evo nekih opcija: šifriranje s KMS vašeg cloud provajdera, a zatim uvođenje u K8S kao tajne putem CD konvojera — — vrlo dobro radi u kombinaciji s tajnama Kustomize. Ima i drugih alata, poput dotGPG — oni obavljaju slične funkcije: , .
Ingress
Ako ne odlučite koristiti prosljeđivanje lokalne port, trebat će vam konfiguriran Ingress Controller. Ako ne koristite () onda vjerojatno već znate da trebate instalirati potrebne anotacije u ingress-patch.yaml.tmpl ili platform/ingress.yaml. Ako koristite ingress-nginx i vidite nginx ingress klasu s uravnoteživačem opterećenja koji na to pokazuje i vanjski DNS ili zapis podupiranja DNS-a, sve je spremno. U suprotnom, postavite Ingress Controller i DNS ili preskočite ove korake i ostavite izravnu vezu s podom.
TLS
Ako koristite ili kube-lego i letsencrypt — certifikati za novi ulaz biće automatski dobiveni. U suprotnom, otvorite ingress-patch.yaml.tmpl i prilagodite ga prema svojim potrebama.
Pokreni!
Ako ste se pridržavali svega što je navedeno gore, onda bi naredba make skaffold HOSTNAME= trebala pokrenuti dostupni primjerak u /camunda
Ako niste postavili ulaz putem javne URL adrese, možete ga preusmjeriti s localhost: kubectl port-forward -n camunda-bpm-demo svc/camunda-bpm 8080:8080 na localhost:8080/camunda
Pričekajte nekoliko minuta dok se tomcat potpuno ne spremi. Cert-manageru treba malo vremena za provjeru domena. Nakon toga možete pratiti logove pomoću dostupnih alata — na primjer, nekog alata poput kubetail, ili jednostavno pomoću kubectl:
kubectl logs -n camunda-bpm-demo $(kubectl get pods -o=name -n camunda-bpm-demo) -f
Sljedeći koraci
Autorizacija
Ovo se više odnosi na konfiguraciju Camunda BPM nego na Kubernetes, ali je važno napomenuti da je prema zadanim postavkama autentifikacija u REST API-u isključena. Možete ili koristiti neku drugu metodu, na primjer . Možete koristiti configmaps i volumene za učitavanje xml-a ili xmlstarlet (vidi gore) za uređivanje postojećih datoteka u slici, kao i ili koristiti wget, ili ih učitati pomoću init kontejnera i zajedničkog volumena.
Upravljanje sesijama
Kao i mnoge druge aplikacije, Camunda BPM upravlja sesijama u JVM-u, tako da, ako želite pokrenuti više replika, možete uključiti sticky sessions (), koje će postojati dok replikacija ne nestane, ili postaviti atribut Max-Age za kolačiće. Kao pouzdanije rješenje, možete implementirati Session Manager u Tomcat-u. Lars ima o ovoj temi, 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 '/^/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
Napomena: možete koristiti xmlstarlet umjesto sedia
Koristili smo prije Google Cloud Memorystore, s (podržava Redis) za njegovo pokretanje.
Skaliranje
Ako ste već razumjeli sesije, tada bi prvo (i često posljednje) ograničenje za skaliranje Camunda BPM mogla biti povezanost s bazom podataka. Djelomična konfiguracija je dostupna već "". Također ćemo onemogućiti intialSize u datoteci settings.xml. Dodajte i lako ćete automatski skalirati broj podova.
Zahtjevi i ograničenja
U platform/deployment.yaml vidjet ćete da smo tvrdo kodirali polje resursa. To dobro funkcionira s HPA, ali će možda biti potrebna dodatna konfiguracija. Za to je dobar patch kustomize. Vidite ingress-patch.yaml.tmpl i ./kustomization.yaml.tmpl
Izvještaj
Evo, instalirali smo Camunda BPM na Kubernetes s metrikama Prometheus, zapisima, bazom podataka H2, TLS-om i Ingress-om. Dodali smo jar datoteke i datoteke konfiguracije koristeći ConfigMaps i Dockerfile. Razgovarali smo o razmjeni podataka s volumena i izravno u varijablama okruženja iz tajni. Također smo dali pregled konfiguracije Camunda za nekoliko replika i autentificiranog API-ja.
Linkovi
github.com/camunda-cloud/camunda-examples/camunda-bpm-kubernetes
│
├── generated-manifest.yaml <- manifest za korištenje bez kustomize
├── slike
│ └── camunda-bpm
│ └── Dockerfile <- overlay docker slika
├── ingress-patch.yaml.tmpl <- specifična konfiguracija ingresa za sajt
├── kustomization.yaml.tmpl <- glavna Kustomization
├── Makefile <- make zadaci
├── namespace.yaml
├── platforma
│ ├── config
│ │ └── prometheus-jmx.yaml <- konfiguracijska datoteka za prometheus exporter
│ ├── deployment.yaml <- glavna postava
│ ├── ingress.yaml
│ ├── kustomization.yaml <- "baza" kustomization
│ ├── service-monitor.yaml <- primjer prometheus-operator konfiguracije
│ └── service.yaml
└── skaffold.yaml.tmpl <- skaffold direktive
05.08.2020, prijevod Alastair Firth, Lars Lange
Izvor: habr.com
