Uruchamianie Camunda BPM na Kubernetesie

Uruchamianie Camunda BPM na Kubernetesie

Czy korzystasz z Kubernetesa? Chcesz przenieść swoje instancje Camunda BPM z maszyn wirtualnych, a może po prostu spróbować uruchomić je na Kubernetesie? Przyjrzyjmy się niektórym typowym konfiguracjom i indywidualnym elementom, które można dostosować do konkretnych potrzeb.

Zakłada, że ​​korzystałeś już wcześniej z Kubernetesa. Jeśli nie, dlaczego nie spojrzeć руководство i nie rozpocząć pierwszego klastra?

Autorzy

  • Alastaira Firtha (Alastair Firth) – Starszy inżynier ds. niezawodności lokalizacji w zespole Camunda Cloud;
  • Larsa Lange’a (Lars Lange) – Inżynier DevOps w Camunda.

Krótko mówiąc:

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

OK, prawdopodobnie to nie zadziałało, ponieważ nie masz zainstalowanych skaffold i kustomize. No to czytaj dalej!

Co to jest Camunda BPM

Camunda BPM to platforma typu open source do zarządzania procesami biznesowymi i automatyzacji decyzji, która łączy użytkowników biznesowych i twórców oprogramowania. Jest idealny do koordynowania i łączenia ludzi, (mikro)usług, a nawet botów! Więcej informacji na temat różnych przypadków użycia można znaleźć na stronie powiązanie.

Dlaczego warto używać Kubernetesa

Kubernetes stał się de facto standardem uruchamiania nowoczesnych aplikacji na Linuksie. Dzięki zastosowaniu wywołań systemowych zamiast emulacji sprzętowej oraz zdolności jądra do zarządzania pamięcią i przełączaniem zadań, czas rozruchu i czas uruchamiania są ograniczone do minimum. Jednak największą korzyść może przynieść standardowe API udostępniane przez Kubernetes w celu skonfigurowania infrastruktury wymaganej przez wszystkie aplikacje: pamięć masową, sieć i monitorowanie. W czerwcu 2020 roku skończył 6 lat i jest prawdopodobnie drugim co do wielkości projektem open source (po Linuksie). Niedawno aktywnie stabilizował swoją funkcjonalność po szybkich iteracjach w ciągu ostatnich kilku lat, ponieważ stała się krytyczna dla obciążeń produkcyjnych na całym świecie.

Camunda BPM Engine może łatwo łączyć się z innymi aplikacjami działającymi w tym samym klastrze, a Kubernetes zapewnia doskonałą skalowalność, pozwalając na zwiększanie kosztów infrastruktury tylko wtedy, gdy jest to naprawdę potrzebne (i łatwe ich zmniejszanie w miarę potrzeb).

Jakość monitorowania znacznie poprawiają także narzędzia takie jak Prometheus, Grafana, Loki, Fluentd i Elasticsearch, które pozwalają centralnie przeglądać wszystkie obciążenia w klastrze. Dzisiaj przyjrzymy się, jak zaimplementować eksporter Prometheus w wirtualnej maszynie Java (JVM).

Cele

Przyjrzyjmy się kilku obszarom, w których możemy dostosować obraz okna dokowanego Camunda BPM (GitHub), aby dobrze współdziałał z Kubernetesem.

  1. Dzienniki i metryki;
  2. Połączenia z bazami danych;
  3. Uwierzytelnianie;
  4. Zarządzanie sesją.

Przyjrzymy się kilku sposobom osiągnięcia tych celów i przejrzyście pokażemy cały proces.

Operacja: Czy używasz wersji Enterprise? Patrzeć tutaj i w razie potrzeby zaktualizuj łącza do obrazów.

Rozwój przepływu pracy

W tym demo użyjemy Skaffold do tworzenia obrazów Dockera przy użyciu Google Cloud Build. Zapewnia dobre wsparcie dla różnych narzędzi (takich jak Kustomize i Helm), narzędzi CI i budowania oraz dostawców infrastruktury. Plik skaffold.yaml.tmpl zawiera ustawienia dla Google Cloud Build i GKE, zapewniając bardzo prosty sposób na uruchomienie infrastruktury klasy produkcyjnej.

make skaffold załaduje kontekst pliku Dockerfile do Cloud Build, zbuduje obraz i zapisze go w GCR, a następnie zastosuje manifesty do klastra. To właśnie robi make skaffold, ale Skaffold ma wiele innych funkcji.

W przypadku szablonów YAML w Kubernetes używamy kustomize do zarządzania nakładkami YAML bez rozwidlania całego manifestu, co pozwala na użycie git pull --rebase w celu dalszych ulepszeń. Teraz jest w kubectl i działa całkiem dobrze w takich sytuacjach.

Używamy również envsubst do wypełnienia nazwy hosta i identyfikatora projektu GCP w plikach *.yaml.tmpl. Możesz zobaczyć jak to działa w makefile lub po prostu kontynuuj dalej.

Wymagania wstępne

Przepływ pracy przy użyciu manifestów

Jeśli nie chcesz używać kustomize ani skaffold, możesz odwołać się do manifestów w generated-manifest.yaml i dostosuj je do wybranego przepływu pracy.

Dzienniki i metryki

Prometheus stał się standardem gromadzenia metryk w Kubernetesie. Zajmuje tę samą niszę, co AWS Cloudwatch Metrics, Cloudwatch Alerts, Stackdriver Metrics, StatsD, Datadog, Nagios, vSphere Metrics i inne. Jest oprogramowaniem typu open source i ma potężny język zapytań. Wizualizację powierzymy firmie Grafana – posiada ona dużą ilość dashboardów dostępnych od razu po wyjęciu z pudełka. Są one ze sobą połączone i stosunkowo łatwe w montażu operator prometeusza.

Domyślnie Prometheus używa modelu ekstrakcji <service>/metrics, a dodawanie w tym celu kontenerów z wózkami bocznymi jest powszechne. Niestety metryki JMX najlepiej rejestrować w JVM, więc kontenery przyczepek nie są tak wydajne. Połączmy się jmx_eksporter open source z Prometheusa do JVM, dodając go do obrazu kontenera, który zapewni ścieżkę /metrics na innym porcie.

Dodaj Prometheus jmx_exporter do kontenera

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

Cóż, to było łatwe. Eksporter będzie monitorował Tomcat i wyświetlał jego wskaźniki w formacie Prometheus pod adresem <svc>:9404/metrics

Konfiguracja eksportera

Uważny czytelnik może się zastanawiać, skąd się to wzięło prometheus-jmx.yaml? Istnieje wiele różnych rzeczy, które można uruchomić w maszynie JVM, a Tomcat jest tylko jedną z nich, więc eksporter potrzebuje dodatkowej konfiguracji. Dostępne są standardowe konfiguracje dla Tomcat, Wildfly, Kafka i tak dalej tutaj. Dodamy Tomcat jako Mapa konfiguracji w Kubernetes, a następnie zamontuj go jako wolumen.

Najpierw dodajemy plik konfiguracyjny eksportera do naszego katalogu platforma/config/

platform/config
└── prometheus-jmx.yaml

Następnie dodajemy Generator ConfigMap в kustomization.yaml.tmpl:

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

Spowoduje to dodanie każdego elementu files[] jako element konfiguracji ConfigMap. ConfigMapGenerators są świetne, ponieważ mieszają dane konfiguracyjne i wymuszają ponowne uruchomienie poda, jeśli ulegną zmianie. Zmniejszają także ilość konfiguracji podczas wdrażania, ponieważ można zamontować cały „folder” plików konfiguracyjnych w jednym woluminie.

Na koniec musimy zamontować ConfigMap jako wolumin w zasobniku:

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

Wspaniały. Jeśli Prometheus nie jest skonfigurowany do pełnego czyszczenia, może być konieczne polecenie mu oczyszczenia zasobników. Z usługi mogą korzystać użytkownicy Prometheus Operator service-monitor.yaml rozpocząć. Badać Service-monitor.yaml, projekt operatora и Specyfikacja monitora usługi zanim zaczniesz.

Rozszerzanie tego wzorca na inne przypadki użycia

Wszystkie pliki, które dodamy do ConfigMapGenerator będą dostępne w nowym katalogu /etc/config. Możesz rozszerzyć ten szablon, aby zamontować inne potrzebne pliki konfiguracyjne. Możesz nawet zamontować nowy skrypt startowy. Możesz użyć podścieżka do montowania pojedynczych plików. Aby zaktualizować pliki XML, rozważ użycie xmlstarlet zamiast seda. Jest już uwzględniony w obrazie.

Czasopisma

Dobre wieści! Dzienniki aplikacji są już dostępne na stdout, na przykład za pomocą kubectl logs. Fluentd (domyślnie instalowany w GKE) przekaże Twoje logi do Elasticsearch, Loki lub Twojej korporacyjnej platformy rejestrowania. Jeśli chcesz używać jsonify do dzienników, możesz skorzystać z powyższego szablonu, aby zainstalować logback.

Baza danych

Domyślnie obraz będzie posiadał bazę danych H2. Nie jest to dla nas odpowiednie i będziemy używać Google Cloud SQL z Cloud SQL Proxy - będzie to potrzebne później do rozwiązania problemów wewnętrznych. Jest to prosta i niezawodna opcja, jeśli nie masz własnych preferencji w zakresie konfigurowania bazy danych. AWS RDS zapewnia podobną usługę.

Niezależnie od wybranej bazy danych, chyba że jest to H2, musisz ustawić odpowiednie zmienne środowiskowe platform/deploy.yaml. Wygląda to mniej więcej tak:

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

Operacja: Możesz użyć Kustomize do wdrożenia w różnych środowiskach za pomocą nakładki: przykład.

Operacja: stosowanie valueFrom: secretKeyRef. Proszę użyć tę funkcję Kubernetes nawet podczas programowania, aby chronić swoje sekrety.

Prawdopodobnie masz już preferowany system zarządzania sekretami Kubernetes. Jeśli nie, oto kilka opcji: Zaszyfrowanie ich za pomocą KMS dostawcy usług w chmurze, a następnie wstrzyknięcie ich do K8S jako kluczy tajnych za pośrednictwem potoku CD − SOPS Mozilli - będzie działać bardzo dobrze w połączeniu z sekretami Kustomize. Istnieją inne narzędzia, takie jak dotGPG, które wykonują podobne funkcje: Skarbiec korporacji Hashi, Dostosuj wtyczki tajnej wartości.

Ingres

Jeśli nie zdecydujesz się na użycie lokalnego przekierowania portów, będziesz potrzebować skonfigurowanego kontrolera ruchu przychodzącego. Jeśli nie używasz wejście-nginx (Wykres steru), to najprawdopodobniej już wiesz, że musisz zainstalować niezbędne adnotacje ingress-patch.yaml.tmpl lub platform/ingress.yaml. Jeśli używasz ingress-nginx i widzisz klasę ingresu nginx z wskazującym na nią modułem równoważenia obciążenia oraz zewnętrznym wpisem DNS lub wpisem DNS z symbolem wieloznacznym, wszystko gotowe. W przeciwnym razie skonfiguruj kontroler ruchu przychodzącego i DNS lub pomiń te kroki i zachowaj bezpośrednie połączenie z zasobnikiem.

TLS

Jeśli używasz dyrektor zarządzający lub kube-lego i letsencrypt - certyfikaty do nowego logowania zostaną uzyskane automatycznie. W przeciwnym razie otwórz ingress-patch.yaml.tmpl i dostosuj go do swoich potrzeb.

Początek!

Jeśli zastosowałeś się do wszystkiego, co napisano powyżej, to polecenie make skaffold HOSTNAME=<you.example.com> powinien uruchomić dostępną instancję w <hostname>/camunda

Jeśli nie ustawiłeś swojego loginu na publiczny adres URL, możesz go przekierować za pomocą localhost: kubectl port-forward -n camunda-bpm-demo svc/camunda-bpm 8080:8080 na localhost:8080/camunda

Poczekaj kilka minut, aż kocur będzie całkowicie gotowy. Menedżer certyfikatów zajmie trochę czasu, aby zweryfikować nazwę domeny. Następnie możesz monitorować logi za pomocą dostępnych narzędzi, takich jak narzędzie takie jak kubetail lub po prostu używając kubectl:

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

Kolejne kroki

autoryzacja

Jest to bardziej istotne w przypadku konfiguracji Camunda BPM niż Kubernetes, ale należy pamiętać, że domyślnie uwierzytelnianie w interfejsie REST API jest wyłączone. Możesz włączyć uwierzytelnianie podstawowe lub użyj innej metody, np JWT. Możesz użyć map konfiguracyjnych i woluminów do załadowania pliku XML lub xmlstarlet (patrz wyżej), aby edytować istniejące pliki w obrazie i albo użyć wget, albo załadować je przy użyciu kontenera init i woluminu współdzielonego.

Zarządzanie sesją

Podobnie jak wiele innych aplikacji, Camunda BPM obsługuje sesje w maszynie JVM, więc jeśli chcesz uruchomić wiele replik, możesz włączyć sesje trwałe (na przykład dla ingres-nginx), który będzie istniał do momentu zniknięcia repliki, lub ustaw atrybut Max-Age dla plików cookie. Aby uzyskać bardziej niezawodne rozwiązanie, możesz wdrożyć Menedżera sesji w Tomcat. Lars ma osobny wpis w tym temacie, ale coś w stylu:

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

Operacja: możesz użyć xmlstarlet zamiast sed

używaliśmy twemproxy przed Google Cloud Memorystore, z menedżer sesji memcached (obsługuje Redis), aby go uruchomić.

skalowanie

Jeśli znasz już sesje, to pierwszym (i często ostatnim) ograniczeniem skalowania Camunda BPM może być połączenie z bazą danych. Częściowa personalizacja jest już dostępna ”z pudełka" Wyłączmy także opcję intialSize w pliku settings.xml. Dodać Poziomy autoskaler podów (HPA) i możesz łatwo automatycznie skalować liczbę podów.

Żądania i ograniczenia

В platform/deployment.yaml Zobaczysz, że zakodowaliśmy pole zasobów. Działa to dobrze z HPA, ale może wymagać dodatkowej konfiguracji. Nadaje się do tego łatka kustomize. Cm. ingress-patch.yaml.tmpl и ./kustomization.yaml.tmpl

Wniosek

Zainstalowaliśmy więc Camundę BPM na Kubernetesie z metrykami Prometheus, logami, bazą danych H2, TLS i Ingress. Dodaliśmy pliki jar i pliki konfiguracyjne przy użyciu ConfigMaps i Dockerfile. Mówiliśmy o wymianie danych na woluminy i bezpośrednio na zmienne środowiskowe z sekretów. Ponadto przedstawiliśmy przegląd konfiguracji Camundy dla wielu replik i uwierzytelnionego API.

referencje

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, tłumaczenie Artykuł Alastair Firth, Lars Lange

Źródło: www.habr.com

Dodaj komentarz