De lancering van Camunda BPM in Kubernetes.

De lancering van Camunda BPM in Kubernetes.

Gebruik je Kubernetes? Ben je klaar om je Camunda BPM-instanties van virtuele machines te verplaatsen, of wil je ze misschien gewoon op Kubernetes draaien? Laten we enkele veelvoorkomende configuraties en afzonderlijke componenten bekijken die je kunt aanpassen aan jouw specifieke behoeften.

We gaan ervan uit dat je al eerder met Kubernetes hebt gewerkt. Zo niet, waarom kijk je dan niet even op handboek en start je je eerste cluster?

Auteurs

Kortom:

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

Waarschijnlijk werkt het niet, omdat je skaffold en kustomize niet hebt geïnstalleerd. Lees dan verder!

Wat is Camunda BPM

Camunda BPM is een open-source platform voor het beheren van bedrijfsprocessen en automatisering van besluitvorming, dat zakelijke gebruikers en softwareontwikkelaars verenigt. Het is ideaal voor het coördineren en samenvoegen van mensen, (micro)services of zelfs bots! Meer informatie over verschillende gebruiksmogelijkheden vind je op de link.

Waarom Kubernetes gebruiken

Kubernetes is de de facto standaard geworden voor het draaien van moderne applicaties in Linux. Door systeemaanroepen te gebruiken in plaats van hardware-emulatie en de mogelijkheden van de kernel om geheugen en taakverdeling te beheren, worden opstarttijden en verbindingsniveaus tot een minimum beperkt. Het grootste voordeel is echter de standaard API die Kubernetes biedt voor het configureren van de infrastructuur die alle applicaties nodig hebben: opslag, netwerken en monitoring. In juni 2020 bestond het 6 jaar en het is misschien wel het grootste open-sourceproject na Linux. De laatste tijd stabiliseert het zijn functionaliteit na snelle iteraties in de afgelopen jaren, omdat dit cruciaal wordt voor productieworkloads over de hele wereld.

De Camunda BPM-engine kan eenvoudig verbinding maken met andere applicaties die in hetzelfde cluster draaien, en Kubernetes biedt uitstekende schaalbaarheid, waardoor je de kosten van infrastructuur alleen hoeft te verhogen wanneer dat echt nodig is (en ook eenvoudig kunt verlagen wanneer dat nodig is).

De kwaliteit van de monitoring verbetert ook aanzienlijk met tools zoals Prometheus, Grafana, Loki, Fluentd en Elasticsearch, die het mogelijk maken om alle workloads van het cluster centraal te bekijken. Vandaag bekijken we hoe we de Prometheus exporter kunnen implementeren in een Java (JVM) virtuele machine.

Doelen

Laten we enkele gebieden bekijken waarin we de Docker-image van Camunda BPM (github) kunnen configureren zodat deze goed samenwerkt met Kubernetes.

  1. Logs en metrics;
  2. Databaseverbindingen;
  3. Authenticatie;
  4. Sessiebeheer.

We zullen verschillende manieren bespreken om deze doelen te bereiken en het hele proces duidelijk demonstreren.

Opmerking: Gebruik je de Enterprise-versie? Bekijk hier en update indien nodig de links naar de images.

Workflowontwikkeling

In deze demo gebruiken we Skaffold om Docker-images te bouwen met Google Cloud Build. Het biedt goede ondersteuning voor verschillende tools (zoals Kustomize en Helm), CI- en buildtools, evenals infrastructuurproviders. Het bestand skaffold.yaml.tmpl bevat instellingen voor Google Cloud Build en GKE, wat een zeer gemakkelijke manier biedt om industriële niveau-infrastructuur op te zetten.

make skaffold zal de Dockerfile-context naar Cloud Build uploaden, een image maken en deze opslaan in GCR, en dan de manifesten op je cluster toepassen. Dit is wat make skaffold, maar Skaffold heeft veel andere mogelijkheden.

Voor yaml-sjablonen in Kubernetes gebruiken we kustomize voor het beheren van yaml-overlays zonder de hele manifeststructuur te splitsen, zodat je git pull --rebase voor verdere verbeteringen kunt gebruiken. Het is nu in kubectl en werkt goed voor dit soort dingen.

Ook gebruiken we envsubst om de hostnaam en project-ID van GCP in de * .yaml.tmpl bestanden in te vullen. Je kunt zien hoe dit werkt in makefile of gewoon verder gaan.

Vereisten

  • Werkcluster Kubernetes
  • Kustomize
  • Skaffold — om je eigen Docker-images te maken en eenvoudig te implementeren in GKE
  • Een kopie van deze code
  • Envsubst

Workflow met manifesten

Als je kustomize of skaffold niet wilt gebruiken, kun je de manifesten bekijken in generated-manifest.yaml en ze aanpassen aan de workflow van jouw keuze.

Logs en metrics

Prometheus is de standaard geworden voor het verzamelen van metrics in Kubernetes. Het neemt dezelfde rol in als AWS Cloudwatch Metrics, Cloudwatch Alerts, Stackdriver Metrics, StatsD, Datadog, Nagios, vSphere Metrics en anderen. Het heeft een open source-code en een krachtige query-taal. Voor de visualisatie vertrouwen we op Grafana — dit wordt geleverd met een groot aantal dashboards die direct beschikbaar zijn. Ze zijn met elkaar verbonden en relatief eenvoudig te installeren met prometheus-operator.

Standaard gebruikt Prometheus een pull-model /metrics, en het toevoegen van sidecar-containers hiervoor is gebruikelijk. Helaas worden JMX-metrics het beste geregistreerd binnen de JVM, waardoor sidecar-containers minder efficiënt zijn. Laten we verbinding maken met jmx_exporter de open-source oplossing van Prometheus naar de JVM door deze toe te voegen aan de containerafbeelding, die een pad zal bieden /metrics op een andere poort.

Voeg Prometheus jmx_exporter toe aan de container

-- images/camunda-bpm/Dockerfile
VAN 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

Wel, dat was eenvoudig. De exporter zal tomcat monitoren en zijn metrics weergeven in het Prometheus-formaat op :9404/metrics

Configuratie van de exporter

De oplettende lezer vraagt zich misschien af waar prometheus-jmx.yaml? Существует много разных вещей, которые могут работать в JVM, и tomcat — это только одна из них, поэтому экспортер нуждается в некоторой дополнительной настройке. Стандартные конфигурации для tomcat, wildfly, kafka и так далее доступны hiervandaan komt. We zullen tomcat toevoegen als ConfigMap in Kubernetes, en vervolgens koppelen we het als een volume.

Allereerst voegen we het configuratiebestand van de exporter toe aan onze directory platform/config/

platform/config
└── prometheus-jmx.yaml

Vervolgens voegen we ConfigMapGenerator in kustomization.yaml.tmpl:

-- platform/kustomization.yaml.tmpl
apiVersie: kustomize.config.k8s.io/v1beta1
soort: Kustomization
[...]
configMapGenerator:
- naam: config
bestanden:
- config/prometheus-jmx.yaml

Dit zal elk item files[] toevoegen als een element van de ConfigMap-configuratie. ConfigMapGenerators zijn handig omdat ze de gegevens in de configuratie hash'en en de pod opnieuw opstarten als deze verandert. Ze verkleinen ook de configuratie in de Deployment, omdat je de hele 'map' van configuratiebestanden in één VolumeMount kunt koppelen.

Ten slotte moeten we de ConfigMap aan de pod koppelen als een volume:

-- platform/deployment.yaml
apiVersion: apps/v1
soort: Deployment
[...]
specificatie:
sjabloon:
specificatie:
[...]
volumes:
- naam: config
configMap:
naam: config
standaardmodus: 0744
containers:
- naam: camunda-bpm
volumeBevestigingen:
- montagePad: /etc/config/
naam: config
[...]

Geweldig. Als Prometheus niet is ingesteld voor volledige opruiming, moet je misschien aangeven dat hij de pods moet opruimen. Gebruikers van Prometheus Operator kunnen service-monitor.yaml gebruiken om aan de slag te gaan. Bestudeer Service-monitor.yaml, operator ontwerp en ServiceMonitorSpec voordat je begint.

Het uitbreiden van deze sjabloon naar andere gebruiksscenario's

Alle bestanden die we aan de ConfigMapGenerator toevoegen, zullen beschikbaar zijn in de nieuwe directory /etc/config. U kunt deze sjabloon uitbreiden om andere vereiste configuratiebestanden te mounten. U kunt zelfs een nieuw opstartscript mounten. U kunt gebruiken subPath om afzonderlijke bestanden te mounten. Voor het bijwerken van xml-bestanden kunt u overwegen xmlstarlet in plaats van sed. Dit is al opgenomen in de afbeelding.

Logboeken

Goed nieuws! Toepassingslogboeken zijn al beschikbaar op stdout, bijvoorbeeld met behulp van kubectl logs. Fluentd (het is standaard geïnstalleerd in GKE) stuurt uw logboeken door naar Elasticsearch, Loki of uw bedrijfslogboekplatform. Als u jsonify voor logboeken wilt gebruiken, kunt u de bovenstaande sjabloon volgen voor de installatie logback.

Database

Standaard heeft de afbeelding een H2-database. Dit is niet geschikt voor ons, en we zullen Google Cloud SQL met Cloud SQL Proxy gebruiken — dit is later nodig voor het oplossen van interne taken. Dit is een eenvoudige en betrouwbare optie als u geen voorkeuren heeft voor databaseconfiguratie. AWS RDS biedt een vergelijkbare dienst.

Ongeacht welke database u kiest, zolang het geen H2 is, moet u de bijbehorende omgevingsvariabelen instellen in platform/deploy.yaml. Dit ziet er ongeveer zo uit:

-- platform/deployment.yaml
apiVersion: apps/v1
soort: Deployment
[...]
specificatie:
sjabloon:
specificatie:
[...]
containers:
- naam: camunda-bpm
omgeving:
- naam: DB_DRIVER
waarde: org.postgresql.Driver
- naam: DB_URL
waarde: jdbc:postgresql://postgres-proxy.db:5432/process-engine
- naam: DB_USERNAME
waardeVan:
secretKeyRef:
naam: cambpm-db-credentials
sleutel: db_username
- naam: DB_PASSWORD
waardeVan:
secretKeyRef:
naam: cambpm-db-credentials
sleutel: db_password
[...]

Opmerking: U kunt Kustomize gebruiken voor implementatie in verschillende omgevingen met overlay: bijvoorbeeld.

Opmerking: gebruik valueFrom: secretKeyRef. Gebruik alstublieft deze functie van Kubernetes zelfs tijdens de ontwikkeling om uw geheimen veilig te houden.

Het is zeer waarschijnlijk dat u al een voorkeurs Kubernetes geheimenbeheer systeem heeft. Zo niet, hier zijn enkele opties: ze te versleutelen met KMS van uw cloudprovider en ze dan in K8S in te voegen als geheimen via de CD-pijplijn — MozillaSOPS werkt bijzonder goed samen met Kustomize geheimen. Er zijn ook andere tools, zoals dotGPG — zij vervullen vergelijkbare functies: HashiCorp Vault, Kustomize Secret Value Plugins.

Ingress

Tenzij u besluit om lokale poortdoorverwijzing te gebruiken, heeft u een Ingress Controller nodig. Als u geen ingress-nginx (Helm chart) weet u waarschijnlijk al dat u de nodige annotaties moet instellen in ingress-patch.yaml.tmpl of platform/ingress.yaml. Als je ingress-nginx gebruikt en je ziet een nginx ingress class met een load balancer die erop wijst en externe DNS of een wildcard DNS-record, dan is alles klaar. Anders moet je de Ingress Controller en DNS instellen of deze stappen overslaan en een directe verbinding met de pod behouden.

TLS

Als je gebruikt cert-manager of kube-lego en letsencrypt, worden de certificaten voor de nieuwe ingang automatisch verkregen. Anders, open ingress-patch.yaml.tmpl en stel het in naar jouw behoeften.

Starten!

Als je je aan het bovenstaande hebt gehouden, zou het commando make skaffold HOSTNAME= een toegankelijke instantie moeten starten op /camunda

Als je de ingang niet exposeert via een publiekelijk URL, kun je het doorsturen met localhost: kubectl port-forward -n camunda-bpm-demo svc/camunda-bpm 8080:8080 en een werkende opdracht krijgen. localhost:8080/camunda

Wacht enkele minuten totdat tomcat volledig is opgestart. Cert-manager heeft enige tijd nodig om de domeinnaam te verifiëren. Daarna kun je de logs volgen met behulp van beschikbare tools, zoals kubetail, of gewoon met kubectl:

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

Volgende stappen

Autorisatie

Dit is meer gerelateerd aan het instellen van Camunda BPM dan aan Kubernetes, maar het is belangrijk op te merken dat authenticatie in de REST API standaard is uitgeschakeld. Je kunt basisauthenticatie inschakelen of een andere methode gebruiken, zoals JWT. Je kunt configmaps en volumes gebruiken om xml te laden, of xmlstarlet (zie hierboven) voor het bewerken van bestaande bestanden in de afbeelding, evenals wget gebruiken of ze uploaden met behulp van een init-container en een gedeeld volume.

Sessiebeheer

Net als veel andere applicaties beheert Camunda BPM sessies in de JVM, zodat als je meerdere replicas wilt draaien, je sticky sessions kunt inschakelen (bijvoorbeeld voor ingress-nginx), die zullen bestaan totdat de replica verdwijnt, of je kunt de Max-Age-attribuut voor cookies instellen. Als een betrouwbaardere oplossing kun je een Session Manager in Tomcat implementeren. Lars heeft daar apart bericht geschreven iets over, maar zoiets als:

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

Opmerking: je kunt xmlstarlet gebruiken in plaats van sed

We hebben gebruikt twemproxy voor Google Cloud Memorystore, met memcached-session-manager (ondersteunt Redis) voor zijn werking.

Schaalbaarheid

Als je al bekend bent met sessies, kan de eerste (en vaak de laatste) beperking voor de opschaling van Camunda BPM de verbinding met de database zijn. Een gedeeltelijke configuratie is al beschikbaaruit de doos. Laten we ook initialSize in het settings.xml-bestand uitschakelen. Voeg HorizontalPodAutoscaler (HPA) toe en je kunt eenvoudig het aantal pods automatisch schalen.

Verzoeken en limieten

In platform/deployment.yaml zie je dat we het veld resources hardcoded hebben. Dit werkt goed met HPA, maar kan extra instellingen vereisen. Hiervoor is een kustomize patch geschikt. Zie ingress-patch.yaml.tmpl en ./kustomization.yaml.tmpl

Uitslag

Zo hebben we Camunda BPM op Kubernetes geïnstalleerd met Prometheus-metrics, logs, een H2-database, TLS en Ingress. We hebben jar-bestanden en configuratiebestanden toegevoegd met behulp van ConfigMaps en Dockerfile. We hebben gesproken over gegevensuitwisseling met volumes en rechtstreeks in omgevingsvariabelen vanuit geheimen. Daarnaast hebben we een overzicht gegeven van de configuratie van Camunda voor meerdere replica's en een geauthenticeerde API.

Links

github.com/camunda-cloud/camunda-examples/camunda-bpm-kubernetes
│
├── generated-manifest.yaml <- manifest voor gebruik zonder kustomize
├── afbeeldingen
│ └── camunda-bpm
│ └── Dockerfile <- overlay docker afbeelding
├── ingress-patch.yaml.tmpl <- site-specifieke ingress configuratie
├── kustomization.yaml.tmpl <- hoofdkustomisatie
├── Makefile <- make-doelen
├── namespace.yaml
├── platform
│ ├── configuratie
│ │ └── prometheus-jmx.yaml <- configuratiebestand voor prometheus exporter
│ ├── deployment.yaml <- hoofddistributie
│ ├── ingress.yaml
│ ├── kustomization.yaml <- "basis" kustomisatie
│ ├── service-monitor.yaml <- voorbeeld configuratie voor prometheus-operator
│ └── service.yaml
└── skaffold.yaml.tmpl <- skaffold richtlijnen

05-08-2020, vertaald artikel Alastair Firth, Lars Lange

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster