你在使用 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 映像的几个区域(
- 日志和指标;
- 数据库连接;
- 验证;
- 会话管理。
我们将研究实现这些目标的几种方法,并清楚地展示整个过程。
注意: 你用的是企业版吗? 看
工作流程开发
在此演示中,我们将使用 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 容器效率不高。 让我们联系吧 /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等
首先,我们将导出器配置文件添加到 platform/config/ 目录中
platform/config
└── prometheus-jmx.yaml
然后我们添加 kustomization.yaml.tmp
l:
-- 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
。 您可以扩展此模板以安装您需要的任何其他配置文件。 您甚至可以安装新的启动脚本。 您可以使用
期刊
好消息! 应用程序日志已在标准输出上可用,例如 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 机密的首选系统。 如果没有,这里有一些选项:使用云提供商的 KMS 加密它们,然后通过 CD 管道将它们作为机密注入 K8S -
入口
除非您选择使用本地端口转发,否则您将需要一个已配置的入口控制器。 如果你不使用 ingress-patch.yaml.tmpl
или platform/ingress.yaml
。 如果您正在使用 ingress-nginx 并看到一个 nginx 入口类,其中有一个指向它的负载均衡器以及一个外部 DNS 或通配符 DNS 条目,那么您就可以开始了。 否则,请配置 Ingress Controller 和 DNS,或跳过这些步骤并保持与 Pod 的直接连接。
TLS
如果您正在使用 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:8080
上 localhost: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 中禁用身份验证。 你可以
会话管理
与许多其他应用程序一样,Camunda BPM 在 JVM 中处理会话,因此如果您想运行多个副本,可以启用粘性会话(
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
我们用了
缩放
如果您已经了解会话,那么扩展 Camunda BPM 的第一个(通常也是最后一个)限制可能是与数据库的连接。 部分定制已经可用”
要求和限制
В 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