Chạy Camunda BPM trên Kubernetes

Chạy Camunda BPM trên Kubernetes

Bạn có đang sử dụng Kubernetes không? Bạn đã sẵn sàng di chuyển các phiên bản Camunda BPM của mình ra khỏi máy ảo hoặc có thể thử chạy chúng trên Kubernetes? Hãy xem xét một số cấu hình phổ biến và các mục riêng lẻ có thể được điều chỉnh theo nhu cầu cụ thể của bạn.

Nó giả định rằng bạn đã sử dụng Kubernetes trước đây. Nếu không thì tại sao không xem qua khả năng lãnh đạo và không bắt đầu cụm đầu tiên của bạn?

Tác giả

  • Alastair Firth (Alastair Firth) - Kỹ sư cấp cao về độ tin cậy của trang web trong nhóm Camunda Cloud;
  • Lars Lange (Lars Lange) - Kỹ sư DevOps tại Camunda.

Tóm lại, sau đó:

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

Được rồi, nó có thể không hoạt động vì bạn chưa cài đặt skaffold và kustomize. Vậy thì hãy đọc tiếp!

Camunda BPM là gì

Camunda BPM là một nền tảng tự động hóa quyết định và quản lý quy trình kinh doanh nguồn mở, kết nối người dùng doanh nghiệp và nhà phát triển phần mềm. Đó là lý tưởng để điều phối và kết nối mọi người, các dịch vụ (vi mô) hoặc thậm chí là bot! Bạn có thể đọc thêm về các trường hợp sử dụng khác nhau tại liên kết.

Tại sao nên sử dụng Kubernetes

Kubernetes đã trở thành tiêu chuẩn thực tế để chạy các ứng dụng hiện đại trên Linux. Bằng cách sử dụng các lệnh gọi hệ thống thay vì mô phỏng phần cứng và khả năng quản lý bộ nhớ cũng như chuyển đổi tác vụ của kernel, thời gian khởi động và thời gian khởi động được giữ ở mức tối thiểu. Tuy nhiên, lợi ích lớn nhất có thể đến từ API tiêu chuẩn mà Kubernetes cung cấp để định cấu hình cơ sở hạ tầng mà tất cả các ứng dụng yêu cầu: lưu trữ, kết nối mạng và giám sát. Nó tròn 2020 tuổi vào tháng 6 năm XNUMX và có lẽ là dự án nguồn mở lớn thứ hai (sau Linux). Gần đây, nó đã tích cực ổn định chức năng của mình sau khi lặp lại nhanh chóng trong vài năm qua vì nó trở nên quan trọng đối với khối lượng công việc sản xuất trên toàn thế giới.

Camunda BPM Engine có thể dễ dàng kết nối với các ứng dụng khác chạy trên cùng một cụm và Kubernetes cung cấp khả năng mở rộng tuyệt vời, cho phép bạn chỉ tăng chi phí cơ sở hạ tầng khi thực sự cần thiết (và dễ dàng giảm chúng khi cần).

Chất lượng giám sát cũng được cải thiện đáng kể với các công cụ như Prometheus, Grafana, Loki, Fluentd và Elaticsearch, cho phép bạn xem tập trung tất cả khối lượng công việc trong một cụm. Hôm nay chúng ta sẽ xem cách triển khai trình xuất Prometheus vào Máy ảo Java (JVM).

Mục tiêu

Hãy xem xét một số lĩnh vực mà chúng ta có thể tùy chỉnh hình ảnh Camunda BPM Docker (github) để nó tương tác tốt với Kubernetes.

  1. Nhật ký và số liệu;
  2. Kết nối cơ sở dữ liệu;
  3. Xác thực;
  4. Quản lý phiên.

Chúng tôi sẽ xem xét một số cách để đạt được những mục tiêu này và trình bày rõ ràng toàn bộ quá trình.

Ghi: Bạn có đang sử dụng phiên bản Enterprise không? Nhìn đây và cập nhật liên kết hình ảnh khi cần thiết.

Phát triển quy trình làm việc

Trong bản demo này, chúng tôi sẽ sử dụng Skaffold để xây dựng hình ảnh Docker bằng Google Cloud Build. Nó hỗ trợ tốt cho nhiều công cụ khác nhau (như Kustomize và Helm), CI và các công cụ xây dựng cũng như các nhà cung cấp cơ sở hạ tầng. Tài liệu skaffold.yaml.tmpl bao gồm các cài đặt cho Google Cloud Build và GKE, cung cấp một cách rất đơn giản để chạy cơ sở hạ tầng cấp sản xuất.

make skaffold sẽ tải bối cảnh Dockerfile vào Cloud Build, xây dựng hình ảnh và lưu trữ nó trong GCR, sau đó áp dụng các tệp kê khai cho cụm của bạn. Đây là những gì nó làm make skaffold, nhưng Skaffold còn có nhiều tính năng khác.

Đối với các mẫu yaml trong Kubernetes, chúng tôi sử dụng kustomize để quản lý lớp phủ yaml mà không phân tách toàn bộ tệp kê khai, cho phép bạn sử dụng git pull --rebase để cải thiện thêm. Bây giờ nó đã có trong kubectl và nó hoạt động khá tốt cho những việc như vậy.

Chúng tôi cũng sử dụng envsubst để điền tên máy chủ và ID dự án GCP vào tệp *.yaml.tmpl. Bạn có thể thấy nó hoạt động như thế nào trong makefile hoặc chỉ tiếp tục xa hơn.

Điều kiện tiên quyết

  • Cụm công việc Kubernetes
  • Tùy chỉnh
  • giàn giáo - để tạo hình ảnh docker của riêng bạn và dễ dàng triển khai lên GKE
  • Bản sao của mã này
  • Envsubst

Quy trình làm việc sử dụng bảng kê khai

Nếu bạn không muốn sử dụng kustomize hoặc skaffold, bạn có thể tham khảo bảng kê khai trong generated-manifest.yaml và điều chỉnh chúng theo quy trình làm việc bạn chọn.

Nhật ký và số liệu

Prometheus đã trở thành tiêu chuẩn để thu thập số liệu trong Kubernetes. Nó chiếm cùng vị trí với AWS Cloudwatch Metrics, Cloudwatch Alerts, Stackdriver Metrics, StatsD, Datadog, Nagios, vSphere Metrics và các sản phẩm khác. Nó là nguồn mở và có ngôn ngữ truy vấn mạnh mẽ. Chúng tôi sẽ giao phó khả năng trực quan hóa cho Grafana - nó đi kèm với một số lượng lớn trang tổng quan có sẵn ngay lập tức. Chúng được kết nối với nhau và tương đối dễ cài đặt với nhà điều hành prometheus.

Theo mặc định, Prometheus sử dụng mô hình trích xuất <service>/metricsvà việc thêm thùng chứa sidecar cho việc này là điều phổ biến. Thật không may, các số liệu JMX được ghi lại tốt nhất trong JVM, vì vậy các thùng chứa sidecar không hiệu quả bằng. Hãy kết nối jmx_exporter nguồn mở từ Prometheus đến JVM bằng cách thêm nó vào hình ảnh vùng chứa sẽ cung cấp đường dẫn /metrics trên một cổng khác.

Thêm Prometheus jmx_exporter vào vùng chứa

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

Chà, điều đó thật dễ dàng. Nhà xuất khẩu sẽ giám sát tomcat và hiển thị số liệu của nó ở định dạng Prometheus tại <svc>:9404/metrics

Thiết lập nhà xuất khẩu

Người đọc chú ý có thể tự hỏi nó đến từ đâu prometheus-jmx.yaml? Có nhiều thứ khác nhau có thể chạy trong JVM và tomcat chỉ là một trong số đó, vì vậy nhà xuất khẩu cần một số cấu hình bổ sung. Có sẵn cấu hình tiêu chuẩn cho tomcat, Wildfly, kafka, v.v. đây. Chúng tôi sẽ thêm tomcat như Bản đồ cấu hình trong Kubernetes và sau đó gắn nó dưới dạng ổ đĩa.

Đầu tiên, chúng ta thêm tệp cấu hình của nhà xuất khẩu vào thư mục platform/config/ của mình

platform/config
└── prometheus-jmx.yaml

Sau đó chúng tôi thêm ConfigMapGenerator в kustomization.yaml.tmpl:

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

Điều này sẽ thêm từng phần tử files[] dưới dạng phần tử cấu hình ConfigMap. ConfigMapGenerators rất tuyệt vời vì chúng băm dữ liệu cấu hình và buộc nhóm khởi động lại nếu nó thay đổi. Chúng cũng giảm số lượng cấu hình trong Triển khai vì bạn có thể gắn toàn bộ "thư mục" chứa các tệp cấu hình vào một VolumeMount.

Cuối cùng, chúng ta cần gắn ConfigMap dưới dạng ổ đĩa vào nhóm:

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

Tuyệt vời. Nếu Prometheus không được định cấu hình để thực hiện dọn dẹp toàn bộ, bạn có thể phải yêu cầu nó dọn dẹp nhóm. Người dùng Nhà điều hành Prometheus có thể sử dụng service-monitor.yaml để bắt đầu. Khám phá Service-monitor.yaml, thiết kế nhà điều hành и Thông số kỹ thuật màn hình dịch vụ trước khi bạn bắt đầu.

Mở rộng mẫu này sang các trường hợp sử dụng khác

Tất cả các tệp chúng tôi thêm vào ConfigMapGenerator sẽ có sẵn trong thư mục mới /etc/config. Bạn có thể mở rộng mẫu này để gắn bất kỳ tệp cấu hình nào khác mà bạn cần. Bạn thậm chí có thể gắn một tập lệnh khởi động mới. Bạn có thể dùng đường dẫn con để gắn kết các tập tin cá nhân. Để cập nhật tệp xml, hãy cân nhắc sử dụng xmlstarlet thay vì sed. Nó đã được bao gồm trong hình ảnh.

Tạp chí thời sự

Tin tốt! Nhật ký ứng dụng đã có sẵn trên thiết bị xuất chuẩn, ví dụ như với kubectl logs. Fluentd (được cài đặt mặc định trong GKE) sẽ chuyển tiếp nhật ký của bạn tới Elaticsearch, Loki hoặc nền tảng ghi nhật ký doanh nghiệp của bạn. Nếu bạn muốn sử dụng jsonify cho nhật ký thì bạn có thể làm theo mẫu trên để cài đặt đăng lại.

Cơ sở dữ liệu

Theo mặc định, hình ảnh sẽ có cơ sở dữ liệu H2. Điều này không phù hợp với chúng tôi và chúng tôi sẽ sử dụng Google Cloud SQL với Cloud SQL Proxy - điều này sẽ cần thiết sau này để giải quyết các vấn đề nội bộ. Đây là một lựa chọn đơn giản và đáng tin cậy nếu bạn không có sở thích riêng trong việc thiết lập cơ sở dữ liệu. AWS RDS cung cấp dịch vụ tương tự.

Bất kể cơ sở dữ liệu nào bạn chọn, trừ khi đó là H2, bạn sẽ cần đặt các biến môi trường thích hợp trong platform/deploy.yaml. Nó trông giống như thế này:

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

Ghi: Bạn có thể sử dụng Kustomize để triển khai tới các môi trường khác nhau bằng cách sử dụng lớp phủ: Ví dụ.

Ghi: cách sử dụng valueFrom: secretKeyRef. Xin vui lòng sử dụng tính năng Kubernetes này ngay cả trong quá trình phát triển để giữ bí mật của bạn an toàn.

Có thể bạn đã có một hệ thống ưu tiên để quản lý các bí mật Kubernetes. Nếu không, đây là một số tùy chọn: Mã hóa chúng bằng KMS của nhà cung cấp đám mây của bạn và sau đó đưa chúng vào K8S dưới dạng bí mật thông qua đường dẫn CD − SOPS của Mozilla - sẽ hoạt động rất tốt khi kết hợp với bí mật Kustomize. Có những công cụ khác, chẳng hạn như dotGPG, thực hiện các chức năng tương tự: Kho tiền HashiCorp, Tùy chỉnh các plugin giá trị bí mật.

Sự đi vào

Trừ khi bạn chọn sử dụng chuyển tiếp cổng cục bộ, bạn sẽ cần Bộ điều khiển xâm nhập được định cấu hình. Nếu bạn không sử dụng ingress-nginx (biểu đồ mũ lái) thì rất có thể bạn đã biết rằng mình cần cài đặt các chú thích cần thiết trong ingress-patch.yaml.tmpl hoặc platform/ingress.yaml. Nếu bạn đang sử dụng ingress-nginx và thấy một lớp ingress nginx có bộ cân bằng tải trỏ đến nó và một mục nhập DNS bên ngoài hoặc ký tự đại diện, thì bạn nên tiếp tục. Nếu không, hãy định cấu hình Bộ điều khiển Ingress và DNS hoặc bỏ qua các bước này và để kết nối trực tiếp với nhóm.

TLS

Nếu bạn đang sử dụng quản lý chứng chỉ hoặc kube-lego và letsencrypt - chứng chỉ cho lần đăng nhập mới sẽ được nhận tự động. Ngược lại thì mở ingress-patch.yaml.tmpl và tùy chỉnh nó cho phù hợp với nhu cầu của bạn.

Phóng!

Nếu bạn làm theo mọi thứ được viết ở trên, thì lệnh make skaffold HOSTNAME=<you.example.com> nên khởi chạy một phiên bản có sẵn trong <hostname>/camunda

Nếu bạn chưa đặt thông tin đăng nhập của mình thành một URL công khai, bạn có thể chuyển hướng nó bằng localhost: kubectl port-forward -n camunda-bpm-demo svc/camunda-bpm 8080:8080 trên localhost:8080/camunda

Đợi vài phút cho đến khi tomcat hoàn toàn sẵn sàng. Người quản lý chứng chỉ sẽ mất một thời gian để xác minh tên miền. Sau đó, bạn có thể theo dõi nhật ký bằng các công cụ có sẵn như kubetail hoặc đơn giản là sử dụng kubectl:

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

Bước tiếp theo

Ủy quyền

Điều này phù hợp hơn với việc định cấu hình Camunda BPM so với Kubernetes, nhưng điều quan trọng cần lưu ý là theo mặc định, xác thực bị tắt trong API REST. Bạn có thể kích hoạt xác thực cơ bản hoặc sử dụng một phương pháp khác như J.W.T.. Bạn có thể sử dụng sơ đồ cấu hình và ổ đĩa để tải xml hoặc xmlstarlet (xem bên trên) để chỉnh sửa các tệp hiện có trong hình ảnh và sử dụng wget hoặc tải chúng bằng cách sử dụng bộ chứa init và ổ đĩa chung.

Quản lý phiên

Giống như nhiều ứng dụng khác, Camunda BPM xử lý các phiên trong JVM, vì vậy nếu muốn chạy nhiều bản sao, bạn có thể kích hoạt các phiên cố định (ví dụ cho ingress-nginx), sẽ tồn tại cho đến khi bản sao biến mất hoặc đặt thuộc tính Max-Age cho cookie. Để có giải pháp mạnh mẽ hơn, bạn có thể triển khai Trình quản lý phiên trong Tomcat. Lars có bài riêng biệt về chủ đề này, nhưng đại loại như:

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

Ghi: bạn có thể sử dụng xmlstarlet thay vì sed

Chúng tôi đã sử dụng temproxy trước Google Cloud Memorystore, với memcached-session-manager (hỗ trợ Redis) để chạy nó.

Mở rộng quy mô

Nếu bạn đã hiểu phiên thì hạn chế đầu tiên (và thường là cuối cùng) đối với việc mở rộng Camunda BPM có thể là kết nối với cơ sở dữ liệu. Tùy chỉnh một phần đã có sẵn "từ chiếc hộp" Chúng ta cũng hãy tắt intialSize trong tệp settings.xml. Thêm vào Bộ chia tỷ lệ tự động Pod ngang (HPA) và bạn có thể dễ dàng tự động chia tỷ lệ số lượng nhóm.

Yêu cầu và hạn chế

В platform/deployment.yaml Bạn sẽ thấy rằng chúng tôi đã mã hóa cứng trường tài nguyên. Tính năng này hoạt động tốt với HPA nhưng có thể yêu cầu cấu hình bổ sung. Bản vá tùy chỉnh phù hợp cho việc này. Cm. ingress-patch.yaml.tmpl и ./kustomization.yaml.tmpl

Đầu ra

Vì vậy, chúng tôi đã cài đặt Camunda BPM trên Kubernetes với các số liệu, nhật ký, cơ sở dữ liệu H2, TLS và Ingress của Prometheus. Chúng tôi đã thêm các tệp jar và tệp cấu hình bằng ConfigMaps và Dockerfile. Chúng ta đã nói về việc trao đổi dữ liệu thành các khối và trực tiếp đến các biến môi trường từ các bí mật. Ngoài ra, chúng tôi còn cung cấp thông tin tổng quan về cách thiết lập Camunda cho nhiều bản sao và API được xác thực.

tài liệu tham khảo

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, dịch thuật Điều Alastair Firth, Lars Lange

Nguồn: www.habr.com

Thêm một lời nhận xét