在 Kubernetes 上執行 Camunda BPM

在 Kubernetes 上執行 Camunda BPM

你在使用 Kubernetes 嗎? 準備好將 Camunda BPM 執行個體移出虛擬機,或嘗試在 Kubernetes 上執行它們嗎? 讓我們來看看一些常見的配置和可根據您的特定需求進行客製化的單獨項目。

它假設您以前使用過 Kubernetes。 如果沒有,為什麼不看一下 領導 而不是啟動你的第一個叢集?

作者

簡而言之:

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

好吧,它可能不起作用,因為你沒有安裝 skaffold 和 kustomize。 那請繼續閱讀!

什麼是卡蒙達 BPM

Camunda BPM 是一個開源業務流程管理和決策自動化平台,連接業務用戶和軟體開發人員。 它非常適合協調和連接人員、(微)服務甚至機器人! 您可以閱讀有關不同用例的更多資訊: 鏈接.

為什麼要使用 Kubernetes

Kubernetes 已成為在 Linux 上運行現代應用程式的事實上的標準。 透過使用系統呼叫而不是硬體模擬以及核心管理記憶體和任務切換的能力,引導時間和啟動時間都保持在最低限度。 然而,最大的好處可能來自 Kubernetes 提供的標準 API,用於配置所有應用程式所需的基礎架構:儲存、網路和監控。 它於 2020 年 6 月迎來了 XNUMX 歲生日,可能是第二大開源專案(僅次於 Linux)。 經過過去幾年的快速迭代,它最近一直在積極穩定其功能,因為它對世界各地的生產工作負載變得至關重要。

Camunda BPM Engine 可以輕鬆連接到同一叢集上運行的其他應用程序,並且 Kubernetes 提供出色的可擴展性,讓您僅在真正需要時增加基礎設施成本(並根據需要輕鬆減少基礎設施成本)。

透過 Prometheus、Grafana、Loki、Fluentd 和 Elasticsearch 等工具,監控品質也大大提高,讓您可以集中查看叢集中的所有工作負載。 今天我們將了解如何將 Prometheus 導出器實作到 Java 虛擬機器 (JVM) 中。

目標

讓我們來看看可以自訂 Camunda BPM Docker 映像的幾個區域(GitHub上)以便與 Kubernetes 良好互動。

  1. 日誌和指標;
  2. 資料庫連線;
  3. 驗證;
  4. 會話管理。

我們將研究實現這些目標的幾種方法,並清楚地展示整個過程。

注意: 你用的是企業版嗎? 看 這裡 並根據需要更新圖像連結。

工作流程開發

在此示範中,我們將使用 Skaffold 透過 Google Cloud Build 建立 Docker 映像。 它對各種工具(例如 Kustomize 和 Helm)、CI 和建置工具以及基礎設施供應商都有良好的支援。 文件 skaffold.yaml.tmpl 包括 Google Cloud Build 和 GKE 的設置,提供了一個非常簡單的方法來運行生產級基礎設施。

make skaffold 會將 Dockerfile 上下文載入到 Cloud Build 中,建立映像並將其儲存在 GCR 中,然後將清單套用到您的叢集。 這就是它的作用 make skaffold,但 Skaffold 還有許多其他功能。

對於 Kubernetes 中的 yaml 模板,我們使用 kustomize 來管理 yaml 覆蓋,而無需分叉整個清單,從而允許您使用 git pull --rebase 以便進一步改進。 現在它在 kubectl 中並且對於此類事情非常有效。

我們也使用 envsubst 填入 *.yaml.tmpl 檔案中的主機名稱和 GCP 專案 ID。 你可以看到它是如何工作的 makefile 或繼續進一步。

先決條件

使用清單的工作流程

如果你不想使用 kustomize 或 skaffold,你可以參考清單 generated-manifest.yaml 並使它們適應您選擇的工作流程。

日誌和指標

Prometheus 已成為 Kubernetes 中收集指標的標準。 它與 AWS Cloudwatch Metrics、Cloudwatch Alerts、Stackdriver Metrics、StatsD、Datadog、Nagios、vSphere Metrics 等佔據相同的利基市場。 它是開源的並且具有強大的查詢語言。 我們將視覺化委託給 Grafana - 它配備了大量開箱即用的儀表板。 它們相互連接並且相對容易安裝 普羅米修斯操作員.

預設情況下,Prometheus 使用提取模型 <service>/metrics,為此添加邊車容器是很常見的。 不幸的是,JMX 指標最好在 JVM 內記錄,因此 sidecar 容器效率不高。 讓我們聯絡吧 jmx_匯出器 透過將 Prometheus 開源到 JVM,將其新增至容器映像中,該映像將提供路徑 /metrics 在不同的連接埠上。

將 Prometheus jmx_exporter 加入容器中

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

嗯,這很容易。 匯出器將監控 tomcat 並以 Prometheus 格式顯示其指標: <svc>:9404/metrics

出口商設定

細心的讀者可能想知道它來自哪裡 prometheus-jmx.yaml? JVM 中可以運行很多不同的東西,tomcat 只是其中之一,因此導出器需要一些額外的配置。 標準配備有tomcat、wildfly、kafka等 這裡。 我們將新增 tomcat 作為 配置映射表 在 Kubernetes 中,然後將其掛載為磁碟區。

首先,我們將匯出器設定檔新增到 platform/config/ 目錄中

platform/config
└── prometheus-jmx.yaml

然後我們添加 配置映射生成器 в kustomization.yaml.tmpl:

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

這將添加每個元素 files[] 作為 ConfigMap 配置元素。 ConfigMapGenerators 很棒,因為它們對配置資料進行哈希處理,並在配置資料變更時強制 pod 重新啟動。 它們還減少了 Deployment 中的配置量,因為您可以在一個 VolumeMount 中掛載設定檔的整個「資料夾」。

最後,我們需要將 ConfigMap 作為磁碟區掛載到 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
[...]

精彩的。 如果 Prometheus 未配置為執行完整清理,您可能必須告訴它清理 Pod。 Prometheus Operator 使用者可以使用 service-monitor.yaml 開始。 探索 Service-monitor.yaml, 算子設計 и 服務監控規範 在你開始之前。

將此模式擴展到其他用例

我們新增到 ConfigMapGenerator 的所有檔案都將在新目錄中可用 /etc/config。 您可以擴展此模板以安裝您需要的任何其他設定檔。 您甚至可以安裝新的啟動腳本。 您可以使用 子路徑 掛載單一文件。 要更新 xml 文件,請考慮使用 xmlstarlet 而不是 sed。 它已經包含在圖像中。

雜誌雜誌

好消息! 應用程式日誌已在標準輸出上可用,例如 kubectl logs。 Fluentd(GKE 中預設安裝)會將您的日誌轉送至 Elasticsearch、Loki 或您的企業日誌平台。 如果你想使用jsonify進行日誌那麼你可以按照上面的模板安裝 回溯.

數據庫

預設情況下,影像將有一個 H2 資料庫。 這不適合我們,我們將使用 Google Cloud SQL 和 Cloud SQL Proxy - 稍後將需要它來解決內部問題。 如果您在設定資料庫方面沒有自己的偏好,那麼這是一個簡單而可靠的選項。 AWS RDS 提供類似的服務。

無論您選擇哪種資料庫,除非是 H2,否則您都需要在中設定適當的環境變量 platform/deploy.yaml。 它看起來像這樣:

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

注意:您可以使用 Kustomize 使用覆蓋層部署到不同的環境: 例子.

注意: 用法 valueFrom: secretKeyRef。 請用 這個 Kubernetes 功能 即使在開發過程中也能確保您的秘密安全。

您可能已經擁有一個用於管理 Kubernetes 機密的首選系統。 如果沒有,這裡有一些選項:使用雲端提供者的 KMS 加密它們,然後透過 CD 管道將它們作為機密注入 K8S - Mozilla SOPS - 與 Kustomize 秘密結合起來效果很好。 還有其他工具,例如 dotGPG,可以執行類似的功能: HashiCorp保險庫, 自訂秘密值插件.

入口

除非您選擇使用本機連接埠轉發,否則您將需要一個已配置的入口控制器。 如果你不使用 入口-nginx (舵圖)那麼您很可能已經知道您需要在中安裝必要的註釋 ingress-patch.yaml.tmplplatform/ingress.yaml。 如果您正在使用 ingress-nginx 並看到一個 nginx 入口類,其中有一個指向它的負載平衡器以及一個外部 DNS 或通配符 DNS 項目,那麼您就可以開始了。 否則,請設定 Ingress Controller 和 DNS,或跳過這些步驟並保持與 Pod 的直接連線。

TLS

如果您正在使用 證書經理 或 kube-lego 和 Letsencrypt - 將自動取得新登入的憑證。 否則,打開 ingress-patch.yaml.tmpl 並根據您的需求進行客製化。

發射!

如果您遵循上面所寫的所有內容,那麼命令 make skaffold HOSTNAME=<you.example.com> 應該啟動一個可用的實例 <hostname>/camunda

如果您尚未將登入設定為公共 URL,則可以使用以下命令重新導向它 localhost: kubectl port-forward -n camunda-bpm-demo svc/camunda-bpm 8080:8080localhost:8080/camunda

等待幾分鐘,直到 tomcat 完全準備就緒。 證書管理器將需要一些時間來驗證網域名稱。 然後,您可以使用可用的工具(例如 kubetail 等工具)或僅使用 kubectl 來監控日誌:

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

下一步

授權

這與配置 Camunda BPM 比 Kubernetes 更相關,但需要注意的是,預設情況下,REST API 中會停用驗證。 你可以 啟用基本身份驗證 或使用另一種方​​法,例如 智威湯遜。 您可以使用 configmaps 和磁碟區來載入 xml,或使用 xmlstarlet(請參閱上文)來編輯映像中的現有文件,並使用 wget 或使用 init 容器和共用磁碟區來載入它們。

會話管理

與許多其他應用程式一樣,Camunda BPM 在 JVM 中處理會話,因此如果您想執行多個副本,可以啟用黏性會話(例如對於 ingress-nginx),它會一直存在,直到副本消失,或為cookie設定Max-Age屬性。 要獲得更強大的解決方案,您可以在 Tomcat 中部署會話管理器。 拉斯有 單獨的帖子 關於這個主題,但類似:

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

注意:您可以使用 xmlstarlet 來代替 sed

我們用了 特溫代理 在 Google Cloud Memorystore 前面, memcached 會話管理器 (支援Redis)來運行它。

縮放

如果您已經了解會話,那麼擴展 Camunda BPM 的第一個(通常也是最後一個)限制可能是與資料庫的連線。 部分定制已經可用”從盒子裡」 我們也可以在 settings.xml 檔案中停用 intialSize。 添加 水平 Pod 自動縮放器 (HPA) 並且您可以輕鬆地自動縮放 Pod 數量。

要求和限制

В platform/deployment.yaml 您會看到我們已經對資源欄位進行了硬編碼。 這與 HPA 配合良好,但可能需要額外的配置。 kustomize 補丁適合於此。 厘米。 ingress-patch.yaml.tmpl и ./kustomization.yaml.tmpl

產量

因此,我們在 Kubernetes 上安裝了 Camunda BPM,其中包含 Prometheus 指標、日誌、H2 資料庫、TLS 和 Ingress。 我們使用 ConfigMaps 和 Dockerfile 新增了 jar 檔案和設定檔。 我們討論了將資料交換到磁碟區並直接從秘密交換到環境變數。 此外,我們還概述瞭如何為多個副本和經過身份驗證的 API 設定 Camunda。

引用

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, 翻譯 文章 阿拉斯泰爾·弗斯、拉爾斯·蘭格

來源: www.habr.com

添加評論