تشغيل Camunda BPM على Kubernetes

تشغيل Camunda BPM على Kubernetes

هل تستخدم كوبيرنيتيس؟ هل أنت مستعد لنقل مثيلات Camunda BPM الخاصة بك خارج الأجهزة الافتراضية، أو ربما مجرد محاولة تشغيلها على Kubernetes؟ دعونا نلقي نظرة على بعض التكوينات الشائعة والعناصر الفردية التي يمكن تخصيصها وفقًا لاحتياجاتك الخاصة.

يفترض أنك استخدمت Kubernetes من قبل. إذا لم يكن الأمر كذلك، لماذا لا نلقي نظرة على توجيه ولم تبدأ مجموعتك الأولى؟

الكتاب

  • أليستر فيرث (ألستير فيرث) - مهندس أول لموثوقية الموقع في فريق Camunda Cloud؛
  • لارس لانج (لارس لانج) - مهندس DevOps في Camunda.

باختصار ، إذن:

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

حسنًا، ربما لم ينجح الأمر لأنك لم تقم بتثبيت سقالة وتخصيص. حسنًا، واصل القراءة!

ما هو كاموندا BPM

Camunda BPM عبارة عن منصة مفتوحة المصدر لإدارة العمليات التجارية وأتمتة القرارات التي تربط مستخدمي الأعمال ومطوري البرامج. إنه مثالي لتنسيق وربط الأشخاص أو الخدمات (الصغيرة) أو حتى الروبوتات! يمكنك قراءة المزيد عن حالات الاستخدام المختلفة على صلة.

لماذا استخدام Kubernetes

أصبح Kubernetes هو المعيار الفعلي لتشغيل التطبيقات الحديثة على Linux. باستخدام استدعاءات النظام بدلاً من محاكاة الأجهزة وقدرة kernel على إدارة الذاكرة وتبديل المهام، يتم تقليل وقت التمهيد ووقت بدء التشغيل إلى الحد الأدنى. ومع ذلك، قد تأتي الفائدة الأكبر من واجهة برمجة التطبيقات القياسية التي يوفرها Kubernetes لتكوين البنية التحتية التي تتطلبها جميع التطبيقات: التخزين والشبكات والمراقبة. بلغ عمره 2020 سنوات في يونيو 6 وربما يكون ثاني أكبر مشروع مفتوح المصدر (بعد Linux). لقد تم مؤخرًا تثبيت وظائفه بشكل نشط بعد التكرار السريع على مدار السنوات القليلة الماضية حيث أصبح أمرًا بالغ الأهمية لأعباء عمل الإنتاج حول العالم.

يمكن لـ Camunda BPM Engine الاتصال بسهولة بالتطبيقات الأخرى التي تعمل على نفس المجموعة، ويوفر Kubernetes قابلية توسع ممتازة، مما يسمح لك بزيادة تكاليف البنية التحتية فقط عند الحاجة إليها بالفعل (وتخفيضها بسهولة حسب الحاجة).

تم أيضًا تحسين جودة المراقبة بشكل كبير باستخدام أدوات مثل Prometheus وGrafana وLoki وFluentd وElasticsearch، مما يسمح لك بعرض جميع أعباء العمل في المجموعة مركزيًا. سننظر اليوم في كيفية تنفيذ مُصدِّر Prometheus في Java Virtual Machine (JVM).

الأهداف

دعونا نلقي نظرة على بعض المناطق التي يمكننا من خلالها تخصيص صورة Camunda BPM Docker (جيثب) بحيث يتفاعل بشكل جيد مع Kubernetes.

  1. السجلات والمقاييس؛
  2. اتصالات قاعدة البيانات؛
  3. المصادقة؛
  4. إدارة الجلسة.

سننظر في عدة طرق لتحقيق هذه الأهداف ونعرض العملية برمتها بوضوح.

لاحظ: هل تستخدم النسخة المؤسسة؟ ينظر هنا وتحديث روابط الصور حسب الحاجة.

تطوير سير العمل

في هذا العرض التوضيحي، سنستخدم Skaffold لإنشاء صور Docker باستخدام Google Cloud Build. إنه يتمتع بدعم جيد للعديد من الأدوات (مثل Kustomize وHelm)، وأدوات CI والبناء، وموفري البنية التحتية. ملف skaffold.yaml.tmpl يتضمن إعدادات Google Cloud Build وGKE، مما يوفر طريقة بسيطة للغاية لتشغيل البنية التحتية على مستوى الإنتاج.

make skaffold سيقوم بتحميل سياق Dockerfile في Cloud Build، وإنشاء الصورة وتخزينها في GCR، ثم تطبيق البيانات على مجموعتك. وهذا هو ما تقوم به make skaffoldلكن Skaffold لديه العديد من الميزات الأخرى.

بالنسبة لقوالب yaml في Kubernetes، نستخدم kustomize لإدارة تراكبات yaml دون تفرع البيان بالكامل، مما يسمح لك باستخدام git pull --rebase لمزيد من التحسينات. الآن هو في kubectl ويعمل بشكل جيد لمثل هذه الأشياء.

نستخدم أيضًا envsubst لملء اسم المضيف ومعرف مشروع GCP في ملفات *.yaml.tmpl. يمكنك أن ترى كيف يعمل في makefile أو مجرد الاستمرار أبعد من ذلك.

المتطلبات الأساسية

  • كتلة العمل Kubernetes
  • تخصيص
  • سكافولد - لإنشاء صور عامل الإرساء الخاصة بك ونشرها بسهولة على GKE
  • نسخة من هذا الرمز
  • Envsubst

سير العمل باستخدام البيانات

إذا كنت لا تريد استخدام kustomize أو skaffold، فيمكنك الرجوع إلى البيانات في generated-manifest.yaml وتكييفها مع سير العمل الذي تختاره.

السجلات والمقاييس

أصبح بروميثيوس هو المعيار لجمع المقاييس في Kubernetes. إنها تحتل نفس المكانة مثل AWS Cloudwatch Metrics وCloudwatch Alerts وStackdriver Metrics وStatsD وDatadog وNagios وvSphere Metrics وغيرها. إنه مفتوح المصدر ولديه لغة استعلام قوية. سنعهد بالتصور إلى Grafana - فهو يأتي مزودًا بعدد كبير من لوحات المعلومات المتوفرة خارج الصندوق. إنها متصلة ببعضها البعض ويسهل تثبيتها نسبيًا مشغل بروميثيوس.

بشكل افتراضي، يستخدم بروميثيوس نموذج الاستخراج <service>/metrics، وإضافة حاويات جانبية لهذا أمر شائع. لسوء الحظ، من الأفضل تسجيل مقاييس JMX داخل JVM، لذا فإن الحاويات الجانبية ليست فعالة. دعونا نتواصل jmx_exporter مفتوح المصدر من 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 وما إلى ذلك هنا. سوف نقوم بإضافة القط كما خريطة التكوين في Kubernetes ثم قم بتثبيته كمجلد.

أولاً، نضيف ملف تكوين المصدر إلى دليل النظام الأساسي/config/ الخاص بنا

platform/config
└── prometheus-jmx.yaml

ثم نضيف ConfigMapGenerator в 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 رائعة لأنها تقوم بتجزئة بيانات التكوين وتفرض إعادة تشغيل الكبسولة إذا تغيرت. كما أنها تقلل أيضًا من مقدار التكوين في النشر حيث يمكنك تحميل "مجلد" كامل من ملفات التكوين في VolumeMount واحد.

أخيرًا، نحتاج إلى تثبيت ConfigMap كمجلد على الكبسولة:

-- 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 لإجراء عملية تنظيف كاملة، فقد يتعين عليك إخباره بتنظيف القرون. يمكن لمستخدمي مشغل Prometheus استخدامه service-monitor.yaml للبدء. يستكشف Service-monitor.yaml, تصميم المشغل и مواصفات مراقب الخدمة قبل ان تبدا.

توسيع هذا النمط إلى حالات الاستخدام الأخرى

ستكون جميع الملفات التي نضيفها إلى ConfigMapGenerator متاحة في الدليل الجديد /etc/config. يمكنك توسيع هذا القالب لتركيب أي ملفات تكوين أخرى تحتاجها. يمكنك حتى تركيب برنامج نصي جديد لبدء التشغيل. يمكنك استخدام مسار فرعي لتحميل الملفات الفردية. لتحديث ملفات XML، فكر في استخدام com.xmlstarlet بدلاً من سيد. لقد تم تضمينه بالفعل في الصورة.

مجلات

أخبار رائعة! سجلات التطبيق متاحة بالفعل على stdout، على سبيل المثال مع 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 الخاص بموفر الخدمة السحابية ثم إدخالها في K8S كأسرار عبر خط أنابيب الأقراص المضغوطة - موزيلاSOPS - سيعمل بشكل جيد جدًا مع أسرار Kustomize. هناك أدوات أخرى، مثل dotGPG، تؤدي وظائف مماثلة: مخزن HashiCorp, تخصيص المكونات الإضافية ذات القيمة السرية.

دخول

ما لم تختر استخدام إعادة توجيه المنفذ المحلي، فسوف تحتاج إلى وحدة تحكم الدخول التي تم تكوينها. إذا كنت لا تستخدم دخول-nginx (مخطط الدفة) فمن المرجح أنك تعلم بالفعل أنك بحاجة إلى تثبيت التعليقات التوضيحية الضرورية فيها ingress-patch.yaml.tmpl أو platform/ingress.yaml. إذا كنت تستخدم ingress-nginx وشاهدت فئة دخول nginx مع موازن تحميل يشير إليها وإدخال DNS خارجي أو DNS بدل، فأنت على ما يرام. بخلاف ذلك، قم بتكوين وحدة التحكم في الدخول وDNS، أو قم بتخطي هذه الخطوات واحتفظ بالاتصال المباشر بالكبسولة.

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:8080 في localhost:8080/camunda

انتظر بضع دقائق حتى يصبح القط جاهزًا تمامًا. سيستغرق مدير الشهادات بعض الوقت للتحقق من اسم المجال. يمكنك بعد ذلك مراقبة السجلات باستخدام الأدوات المتاحة مثل أداة مثل kubetail، أو ببساطة باستخدام kubectl:

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

الخطوات التالية

ترخيص

يعد هذا أكثر صلة بتكوين Camunda BPM من Kubernetes، ولكن من المهم ملاحظة أنه بشكل افتراضي، يتم تعطيل المصادقة في REST API. أنت تستطيع تمكين المصادقة الأساسية أو استخدم طريقة أخرى مثل JWT. يمكنك استخدام خرائط التكوين ووحدات التخزين لتحميل ملف xml، أو xmlstarlet (انظر أعلاه) لتحرير الملفات الموجودة في الصورة، وإما استخدام wget أو تحميلها باستخدام حاوية init ووحدة تخزين مشتركة.

إدارة الجلسة

مثل العديد من التطبيقات الأخرى، يتعامل Camunda BPM مع الجلسات في JVM، لذلك إذا كنت تريد تشغيل نسخ متماثلة متعددة، فيمكنك تمكين الجلسات الثابتة (على سبيل المثال لـ ingress-nginx)، والذي سيظل موجودًا حتى تختفي النسخة المتماثلة، أو قم بتعيين سمة 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

كنا com.twemproxy أمام Google Cloud Memorystore، مع memcached-مدير الجلسة (يدعم Redis) لتشغيله.

تدريج

إذا كنت تفهم الجلسات بالفعل، فقد يكون القيد الأول (وغالبًا الأخير) لقياس Camunda BPM هو الاتصال بقاعدة البيانات. التخصيص الجزئي متاح بالفعل "من الصندوق" لنقم أيضًا بتعطيل الحجم الأولي في ملف settings.xml. يضيف المقياس التلقائي للكبسولة الأفقية (HPA) ويمكنك بسهولة زيادة عدد القرون تلقائيًا.

الطلبات والقيود

В platform/deployment.yaml سترى أننا قمنا بترميز حقل الموارد. يعمل هذا بشكل جيد مع HPA، ولكنه قد يتطلب تكوينًا إضافيًا. التصحيح المخصص مناسب لهذا الغرض. سم. ingress-patch.yaml.tmpl и ./kustomization.yaml.tmpl

إنتاج

لذلك قمنا بتثبيت Camunda BPM على Kubernetes باستخدام مقاييس Prometheus والسجلات وقاعدة بيانات H2 وTLS وIngress. أضفنا ملفات jar وملفات التكوين باستخدام ConfigMaps وDockerfile. تحدثنا عن تبادل البيانات إلى وحدات التخزين ومباشرة إلى متغيرات البيئة من الأسرار. بالإضافة إلى ذلك، قدمنا ​​نظرة عامة حول إعداد 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

إضافة تعليق