在 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 或者继续进一步。

先决条件

  • 工作集群 Kubernetes
  • 自定义
  • 脚手架 - 用于创建您自己的 docker 映像并轻松部署到 GKE
  • 此代码的副本
  • 环境子集

使用清单的工作流程

如果你不想使用 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 文件,请考虑使用 小明星 而不是 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.tmpl или platform/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, 翻译 文章 阿拉斯泰尔·弗斯、拉尔斯·兰格

来源: habr.com

添加评论