
تحدثنا عن حلم والعمل معه "بشكل عام" في
مقال سابق . الآن دعونا نقترب من الممارسة من الجانب الآخر - من وجهة نظر منشئ الرسوم البيانية (أي حزم هيلم). وعلى الرغم من أن هذا المقال جاء من عالم الاستغلال ، إلا أنه اتضح أنه أكثر تشابهًا مع المواد حول لغات البرمجة - مثل مصير مؤلفي الرسوم البيانية. إذن ، الرسم البياني عبارة عن مجموعة من الملفات ...
يمكن تقسيم ملفات المخططات إلى مجموعتين:
- الملفات المطلوبة لإنشاء قوائم موارد Kubernetes. تتضمن هذه القوالب من دليل
templates
والملفات ذات القيم (يتم تخزين القيم الافتراضية في قيم. values.yaml
). يوجد أيضًا في هذه المجموعة ملف requirements.yaml
charts
ودليل charts
- كل هذا يُستخدم لتنظيم المخططات المتداخلة. - الملفات المرفقة التي تحتوي على معلومات قد تكون مفيدة في العثور على الرسوم البيانية والتعرف عليها واستخدامها. معظم الملفات في هذه المجموعة اختيارية.
مزيد من المعلومات حول ملفات المجموعتين:
Chart.yaml
- ملف يحتوي على معلومات حول المخطط ؛LICENSE
- ملف نصي اختياري بترخيص مخطط ؛README.md
- ملف اختياري مع وثائق ؛requirements.yaml
. requirements.yaml
- ملف اختياري يحتوي على قائمة مخططات التبعية ؛values.yaml
. values.yaml
- ملف بقيم افتراضية للقوالب ؛charts/
- دليل اختياري مع المخططات المتداخلة ؛templates/
- دليل مع قوالب بيانات مورد Kubernetes ؛templates/NOTES.txt
- ملف نصي اختياري مع ملاحظة يتم عرضها للمستخدم أثناء التثبيت والتحديث.
لفهم محتويات هذه الملفات بشكل أفضل ، يمكنك الرجوع إلى
دليل مطور المخططات الرسمي أو البحث عن الأمثلة ذات الصلة في
المستودع الرسمي .
يأتي إنشاء مخطط بشكل عام لتنظيم مجموعة من الملفات المصممة بشكل صحيح. والصعوبة الرئيسية في هذا "التصميم" هي استخدام نظام قالب متقدم إلى حد ما لتحقيق النتيجة المرجوة. لعرض بيانات مورد Kubernetes ،
يتم استخدام محرك قالب Go قياسي ، يتم توسيعه بواسطة وظائف Helm .
تذكير : أعلن مطورو Helm أنه في الإصدار الرئيسي التالي من المشروع - Helm 3 - سيكون هناك دعم لنصوص Lua ، والتي يمكن استخدامها في وقت واحد مع قوالب Go. لن أتطرق إلى هذه النقطة بمزيد من التفصيل - يمكن قراءة هذا (والتغييرات الأخرى في Helm 3) هنا .على سبيل المثال ، إليك كيفية ظهور Helm 2 كنموذج بيان
نشر Kubernetes الخاص بمدونة WordPress من
مقالة سابقة :
نشر. yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: {{ template "fullname" . }} labels: app: {{ template "fullname" . }} chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" spec: replicas: {{ .Values.replicaCount }} template: metadata: labels: app: {{ template "fullname" . }} chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" release: "{{ .Release.Name }}" spec: {{- if .Values.image.pullSecrets }} imagePullSecrets: {{- range .Values.image.pullSecrets }} - name: {{ . }} {{- end}} {{- end }} containers: - name: {{ template "fullname" . }} image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy | quote }} env: - name: ALLOW_EMPTY_PASSWORD {{- if .Values.allowEmptyPassword }} value: "yes" {{- else }} value: "no" {{- end }} - name: MARIADB_HOST {{- if .Values.mariadb.enabled }} value: {{ template "mariadb.fullname" . }} {{- else }} value: {{ .Values.externalDatabase.host | quote }} {{- end }} - name: MARIADB_PORT_NUMBER {{- if .Values.mariadb.enabled }} value: "3306" {{- else }} value: {{ .Values.externalDatabase.port | quote }} {{- end }} - name: WORDPRESS_DATABASE_NAME {{- if .Values.mariadb.enabled }} value: {{ .Values.mariadb.db.name | quote }} {{- else }} value: {{ .Values.externalDatabase.database | quote }} {{- end }} - name: WORDPRESS_DATABASE_USER {{- if .Values.mariadb.enabled }} value: {{ .Values.mariadb.db.user | quote }} {{- else }} value: {{ .Values.externalDatabase.user | quote }} {{- end }} - name: WORDPRESS_DATABASE_PASSWORD valueFrom: secretKeyRef: {{- if .Values.mariadb.enabled }} name: {{ template "mariadb.fullname" . }} key: mariadb-password {{- else }} name: {{ printf "%s-%s" .Release.Name "externaldb" }} key: db-password {{- end }} - name: WORDPRESS_USERNAME value: {{ .Values.wordpressUsername | quote }} - name: WORDPRESS_PASSWORD valueFrom: secretKeyRef: name: {{ template "fullname" . }} key: wordpress-password - name: WORDPRESS_EMAIL value: {{ .Values.wordpressEmail | quote }} - name: WORDPRESS_FIRST_NAME value: {{ .Values.wordpressFirstName | quote }} - name: WORDPRESS_LAST_NAME value: {{ .Values.wordpressLastName | quote }} - name: WORDPRESS_BLOG_NAME value: {{ .Values.wordpressBlogName | quote }} - name: WORDPRESS_TABLE_PREFIX value: {{ .Values.wordpressTablePrefix | quote }} - name: SMTP_HOST value: {{ .Values.smtpHost | quote }} - name: SMTP_PORT value: {{ .Values.smtpPort | quote }} - name: SMTP_USER value: {{ .Values.smtpUser | quote }} - name: SMTP_PASSWORD valueFrom: secretKeyRef: name: {{ template "fullname" . }} key: smtp-password - name: SMTP_USERNAME value: {{ .Values.smtpUsername | quote }} - name: SMTP_PROTOCOL value: {{ .Values.smtpProtocol | quote }} ports: - name: http containerPort: 80 - name: https containerPort: 443 livenessProbe: httpGet: path: /wp-login.php {{- if not .Values.healthcheckHttps }} port: http {{- else }} port: https scheme: HTTPS {{- end }} {{ toYaml .Values.livenessProbe | indent 10 }} readinessProbe: httpGet: path: /wp-login.php {{- if not .Values.healthcheckHttps }} port: http {{- else }} port: https scheme: HTTPS {{- end }} {{ toYaml .Values.readinessProbe | indent 10 }} volumeMounts: - mountPath: /bitnami/apache name: wordpress-data subPath: apache - mountPath: /bitnami/wordpress name: wordpress-data subPath: wordpress - mountPath: /bitnami/php name: wordpress-data subPath: php resources: {{ toYaml .Values.resources | indent 10 }} volumes: - name: wordpress-data {{- if .Values.persistence.enabled }} persistentVolumeClaim: claimName: {{ .Values.persistence.existingClaim | default (include "fullname" .) }} {{- else }} emptyDir: {} {{ end }} {{- if .Values.nodeSelector }} nodeSelector: {{ toYaml .Values.nodeSelector | indent 8 }} {{- end -}} {{- with .Values.affinity }} affinity: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{ toYaml . | indent 8 }} {{- end }}
الآن - حول المبادئ والميزات الأساسية للتوحيد القياسي في هيلم. معظم الأمثلة الواردة أدناه مأخوذة من مخططات
المستودع الرسمي .
قوالب
القوالب: {{ }}
كل ما يتعلق بالتصميم ملفوف في أقواس متعرجة مزدوجة. النص خارج الأقواس المتعرجة يبقى دون تغيير أثناء التقديم.
قيمة السياق :.
عند عرض ملف أو جزئي
(لمزيد من المعلومات حول إعادة استخدام القوالب ، راجع الأقسام التالية من المقالة) ، وهي القيمة التي يمكن الوصول إليها داخليًا من خلال متغير السياق - يتم طرح النقطة. عند تمريرها كوسيطة لبنية ، يتم استخدام النقطة للوصول إلى حقول وأساليب هذه البنية.
تتغير قيمة المتغير أثناء عملية التقديم
اعتمادًا على السياق الذي يتم استخدامه فيه. تتجاوز معظم عبارات الكتلة متغير السياق داخل الكتلة الرئيسية.
سيتم مناقشة العوامل الرئيسية وخصائصها أدناه ، بعد التعرف على هيكل هيلم الأساسي.الهيكل الأساسي هيلم
عند العرض ، يتم إلقاء بنية مع الحقول التالية في القوالب:
.Values
الميدانية - للوصول إلى المعلمات التي يتم تحديدها أثناء التثبيت وتحديث الإصدار. يتضمن ذلك قيم الخيارات - --set
، --set-string
--set-file
، بالإضافة إلى معلمات الملفات ذات القيم ، ملف القيم. values.yaml
والملفات المقابلة لقيم الخيارات - --values
:
containers: - name: main image: "{{ .Values.image }}:{{ .Values.imageTag }}" imagePullPolicy: {{ .Values.imagePullPolicy }}
.Release
- لاستخدام بيانات الإصدار حول الطرح أو التثبيت أو التحديث واسم الإصدار ومساحة الاسم وقيم عدة حقول أخرى قد تكون مفيدة عند إنشاء البيانات:
metadata: labels: heritage: "{{ .Release.Service }}" release: "{{ .Release.Name }}" subjects: - namespace: {{ .Release.Namespace }}
.Chart
- للوصول إلى معلومات الرسم البياني . تتوافق الحقول مع محتويات ملف Chart.yaml
:
labels: chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
- الهيكل.
.Files
- للعمل مع الملفات المخزنة في دليل الرسم البياني ؛ يمكن العثور على الهيكل والأساليب المتاحة هنا . أمثلة:
data: openssl.conf: | {{ .Files.Get "config/openssl.conf" | indent 4 }}
data: {{ (.Files.Glob "files/docker-entrypoint-initdb.d/*").AsConfig | indent 2 }}
.Capabilities
- للوصول إلى معلومات حول الكتلة التي يتم تنفيذ .Capabilities
:
{{- if .Capabilities.APIVersions.Has "apps/v1beta2" }} apiVersion: apps/v1beta2 {{- else }} apiVersion: extensions/v1beta1 {{- end }}
{{- if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion }} apiVersion: apps/v1 {{- else }}
عوامل التشغيل
نبدأ ، بالطبع ،
else
if
و
else if
و
else
:
{{- if .Values.agent.image.tag }} image: "{{ .Values.agent.image.repository }}:{{ .Values.agent.image.tag }}" {{- else }} image: "{{ .Values.agent.image.repository }}:v{{ .Chart.AppVersion }}" {{- end }}
تم تصميم عامل
range
للعمل مع المصفوفات والخرائط. إذا تم تمرير مصفوفة كوسيطة وتحتوي على عناصر ، فسيتم تنفيذ كتلة لكل عنصر على التوالي (في هذه الحالة ، تصبح القيمة داخل الكتلة متاحة من خلال متغير السياق):
{{- range .Values.ports }} - name: {{ .name }} port: {{ .containerPort }} targetPort: {{ .containerPort}} {{- else }} ... {{- end}}
{{ range .Values.tolerations -}} - {{ toYaml . | indent 8 | trim }} {{ end }}
للعمل مع الخرائط ، يتم توفير بناء الجملة مع المتغيرات:
{{- range $key, $value := .Values.credentials.secretContents }} {{ $key }}: {{ $value | b64enc | quote }} {{- end }}
يوجد سلوك مماثل
with
عامل التشغيل: في حالة وجود الوسيطة التي تم تمريرها ، يتم تنفيذ الكتلة ، ويقابل متغير السياق في الكتلة قيمة الوسيطة. على سبيل المثال:
{{- with .config }} config: {{- with .region }} region: {{ . }} {{- end }} {{- with .s3ForcePathStyle }} s3ForcePathStyle: {{ . }} {{- end }} {{- with .s3Url }} s3Url: {{ . }} {{- end }} {{- with .kmsKeyId }} kmsKeyId: {{ . }} {{- end }} {{- end }}
لإعادة استخدام القوالب ، يمكن استخدام حزمة من
define [name]
template [name] [variable]
، حيث يتم توفير القيمة التي تم تمريرها من خلال متغير السياق في كتلة التعريف:
apiVersion: v1 kind: ServiceAccount metadata: name: {{ template "kiam.serviceAccountName.agent" . }} ... {{- define "kiam.serviceAccountName.agent" -}} {{- if .Values.serviceAccounts.agent.create -}} {{ default (include "kiam.agent.fullname" .) .Values.serviceAccounts.agent.name }} {{- else -}} {{ default "default" .Values.serviceAccounts.agent.name }} {{- end -}} {{- end -}}
هناك بعض الميزات التي يجب مراعاتها عند استخدام
define
، أو ببساطة أكثر جزئيًا:
- part'y المعلن عنها عامة ويمكن استخدامها في جميع ملفات دليل
templates
. - يتم تجميع المخطط الرئيسي جنبًا إلى جنب مع المخططات التابعة ، لذلك إذا كان هناك اسمان جزئيان جزئيان من نفس النوع ، فسيتم استخدام آخر تحميل تم تحميله. عند تسمية جزء ، من المعتاد إضافة اسم مخطط لتجنب مثل هذه التعارضات: قم
define "chart_name.partial_name"
.
المتغيرات: $
بالإضافة إلى العمل مع السياق ، يمكنك تخزين البيانات وتعديلها وإعادة استخدامها باستخدام المتغيرات:
{{ $provider := .Values.configuration.backupStorageProvider.name }} ... {{ if eq $provider "azure" }} envFrom: - secretRef: name: {{ template "ark.secretName" . }} {{ end }}
عند عرض ملف أو جزئي ، يكون لـ
$
نفس معنى النقطة. ولكن على عكس متغير السياق (النقطة) ،
لا تتغير قيمة
$
في سياق عبارات الكتلة ، والتي تتيح لك العمل في وقت واحد مع قيمة السياق لبيان الكتلة وبنية Helm الأساسية (أو القيمة التي تم تمريرها إلى جزئي ، إذا تحدثنا عن استخدام
$
داخل part'a) . توضيح الفرق:
context: {{ . }} dollar: {{ $ }} with: {{- with .Chart }} context: {{ . }} dollar: {{ $ }} {{- end }} template: {{- template "flant" .Chart -}} {{ define "flant" }} context: {{ . }} dollar: {{ $ }} with: {{- with .Name }} context: {{ . }} dollar: {{ $ }} {{- end }} {{- end -}}
نتيجة لمعالجة هذا القالب ، سيظهر ما يلي (للتوضيح ، في إخراج الهيكل يتم استبداله بالأسماء الزائفة المقابلة):
context: # helm dollar: # helm with: context: #.Chart dollar: # helm template: context: #.Chart dollar: #.Chart with: context: habr dollar: #.Chart
وإليك مثال حقيقي لاستخدام هذه الميزة:
{{- if .Values.ingress.enabled -}} {{- range .Values.ingress.hosts }} apiVersion: extensions/v1beta1 kind: Ingress metadata: name: {{ template "nats.fullname" $ }}-monitoring labels: app: "{{ template "nats.name" $ }}" chart: "{{ template "nats.chart" $ }}" release: {{ $.Release.Name | quote }} heritage: {{ $.Release.Service | quote }} annotations: {{- if .tls }} ingress.kubernetes.io/secure-backends: "true" {{- end }} {{- range $key, $value := .annotations }} {{ $key }}: {{ $value | quote }} {{- end }} spec: rules: - host: {{ .name }} http: paths: - path: {{ default "/" .path }} backend: serviceName: {{ template "nats.fullname" $ }}-monitoring servicePort: monitoring {{- if .tls }} tls: - hosts: - {{ .name }} secretName: {{ .tlsSecret }} {{- end }} --- {{- end }} {{- end }}
المسافة البادئة
عند تطوير النماذج ، قد تبقى هوامش إضافية: مسافات ، علامات تبويب ، خلاصات سطر. معهم ، يبدو الملف أكثر سهولة للقراءة. يمكنك إما التخلي عنها ، أو استخدام بناء جملة خاص لإزالة المسافة البادئة حول الأنماط المستخدمة:
{{- variable }}
باقتطاع المسافات السابقة ؛{{ variable -}}
يقتطع المسافات اللاحقة ؛{{- variable -}}
كلا الخيارين.
مثال على ملف ، ستتم معالجته من خلال خط
habr flant helm
:
habr {{- " flant " -}} helm
وظائف مدمجة
يمكن العثور على جميع الوظائف المضمنة في القالب على
الرابط التالي . هنا سأقول فقط عن بعضها.
تم تصميم وظيفة
index
للوصول إلى عناصر مصفوفة أو خرائط:
definitions.json: | { "users": [ { "name": "{{ index .Values "rabbitmq-ha" "rabbitmqUsername" }}", "password": "{{ index .Values "rabbitmq-ha" "rabbitmqPassword" }}", "tags": "administrator" } ] }
تأخذ الدالة عددًا عشوائيًا من الوسيطات ، مما يسمح لك بالعمل مع العناصر المتداخلة:
$map["key1"]["key2"]["key3"] => index $map "key1" "key2" "key3"
على سبيل المثال:
httpGet: {{- if (index .Values "pushgateway" "extraArgs" "web.route-prefix") }} path: /{{ index .Values "pushgateway" "extraArgs" "web.route-prefix" }}/#/status {{- end }}
يتم تنفيذ
العمليات المنطقية في محرك القالب كوظائف (
وليس كعوامل). يتم تقييم جميع الحجج الخاصة بهم عند تمرير:
{{ if and (index .Values field) (eq (len .Values.field) 10) }} ... {{ end }}
إذا لم يكن هناك حقل
field
فسوف تفشل عملية عرض القالب (
error calling len: len of untyped nil
): يتم التحقق من الشرط الثاني ، على الرغم من حقيقة عدم تحقيق الأول. يجدر تدوين ملاحظة وحل مثل هذه الاستعلامات عن طريق التقسيم إلى عدة عمليات تحقق:
{{ if index . field }} {{ if eq (len .field) 10 }} ... {{ end }} {{ end }}
Pipeline هي ميزة فريدة في قوالب Go التي تسمح لك بتعريف التعبيرات التي يتم تنفيذها مثل خط الأنابيب في غلاف. رسمياً ، خط الأنابيب هو سلسلة من الأوامر مفصولة بالرمز
|
. يمكن أن يكون الأمر
قيمة بسيطة
أو استدعاء دالة . يتم تمرير نتيجة كل أمر
كوسيطة أخيرة للأمر التالي ، وتكون نتيجة الأمر النهائي في خط الأنابيب هي قيمة خط الأنابيب بالكامل. أمثلة:
data: openssl.conf: | {{ .Files.Get "config/openssl.conf" | indent 4 }}
data: db-password: {{ .Values.externalDatabase.password | b64enc | quote }}
وظائف إضافية
Sprig هي مكتبة من
70 ميزة مفيدة لحل مجموعة واسعة من المهام. لأسباب أمنية ، يستثني هيلم وظائف
env
و
expandenv
التي توفر الوصول إلى متغيرات بيئة Tiller.
يتم استخدام وظيفة
include
، مثل وظيفة
template
القياسي ، لإعادة استخدام القوالب. على عكس
template
، يمكن استخدام الوظيفة في خط الأنابيب ، أي تمرير النتيجة إلى وظيفة أخرى:
metadata: labels: {{ include "labels.standard" . | indent 4 }} {{- define "labels.standard" -}} app: {{ include "hlf-couchdb.name" . }} heritage: {{ .Release.Service | quote }} release: {{ .Release.Name | quote }} chart: {{ include "hlf-couchdb.chart" . }} {{- end -}}
تسمح الوظيفة
required
للمطورين بالإعلان عن القيم الإلزامية اللازمة لعرض القالب: في حالة وجود قيمة ، يتم استخدامها عند عرض القالب ، وإلا ينتهي العرض برسالة الخطأ التي يشير إليها المطور:
sftp-user: {{ required "Please specify the SFTP user name at .Values.sftp.user" .Values.sftp.user | b64enc | quote }} sftp-password: {{ required "Please specify the SFTP user password at .Values.sftp.password" .Values.sftp.password | b64enc | quote }} {{- end }} {{- if .Values.svn.enabled }} svn-user: {{ required "Please specify the SVN user name at .Values.svn.user" .Values.svn.user | b64enc | quote }} svn-password: {{ required "Please specify the SVN user password at .Values.svn.password" .Values.svn.password | b64enc | quote }} {{- end }} {{- if .Values.webdav.enabled }} webdav-user: {{ required "Please specify the WebDAV user name at .Values.webdav.user" .Values.webdav.user | b64enc | quote }} webdav-password: {{ required "Please specify the WebDAV user password at .Values.webdav.password" .Values.webdav.password | b64enc | quote }} {{- end }}
تتيح لك وظيفة
tpl
تقديم سلسلة كقالب. على عكس
template
include
، تسمح لك الوظيفة بتنفيذ القوالب التي يتم تمريرها في المتغيرات ، بالإضافة إلى عرض القوالب المخزنة ليس فقط في دليل
templates
. كيف تبدو؟
تشغيل القوالب من المتغيرات:
containers: {{- with .Values.keycloak.extraContainers }} {{ tpl . $ | indent 2 }} {{- end }}
... وفي
values.yaml
لدينا القيمة التالية:
keycloak: extraContainers: | - name: cloudsql-proxy image: gcr.io/cloudsql-docker/gce-proxy:1.11 command: - /cloud_sql_proxy args: - -instances={{ .Values.cloudsql.project }}:{{ .Values.cloudsql.region }}:{{ .Values.cloudsql.instance }}=tcp:5432 - -credential_file=/secrets/cloudsql/credentials.json volumeMounts: - name: cloudsql-creds mountPath: /secrets/cloudsql readOnly: true
تقديم ملف مخزن خارج دليل
templates
:
apiVersion: batch/v1 kind: Job metadata: name: {{ template "mysqldump.fullname" . }} labels: app: {{ template "mysqldump.name" . }} chart: {{ template "mysqldump.chart" . }} release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" spec: backoffLimit: 1 template: {{ $file := .Files.Get "files/job.tpl" }} {{ tpl $file . | indent 4 }}
... على المخطط ، على طول المسار
files/job.tpl
، يوجد القالب التالي:
spec: containers: - name: xtrabackup image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy | quote }} command: ["/bin/bash", "/scripts/backup.sh"] envFrom: - configMapRef: name: "{{ template "mysqldump.fullname" . }}" - secretRef: name: "{{ template "mysqldump.fullname" . }}" volumeMounts: - name: backups mountPath: /backup - name: xtrabackup-script mountPath: /scripts restartPolicy: Never volumes: - name: backups {{- if .Values.persistentVolumeClaim }} persistentVolumeClaim: claimName: {{ .Values.persistentVolumeClaim }} {{- else -}} {{- if .Values.persistence.enabled }} persistentVolumeClaim: claimName: {{ template "mysqldump.fullname" . }} {{- else }} emptyDir: {} {{- end }} {{- end }} - name: xtrabackup-script configMap: name: {{ template "mysqldump.fullname" . }}-script
هذا هو المكان الذي انتهت فيه مقدمة أساسيات التقييس في حلم ...
الخلاصة
تصف المقالة هيكل مخططات هيلم وتفحص بالتفصيل الصعوبة الرئيسية في إنشائها - قالب: المبادئ الأساسية ، وبناء الجملة ، والوظائف ومشغلي Go-template ، ووظائف إضافية.
كيف تبدأ العمل مع كل هذا؟ نظرًا لأن Helm هو بالفعل نظام بيئي كامل ، يمكنك دائمًا إلقاء نظرة على أمثلة الرسوم البيانية لحزم مماثلة. على سبيل المثال ، إذا كنت تريد حزم قائمة انتظار رسائل جديدة ،
فألق نظرة على
المخطط العام RabbitMQ . بالطبع ، لا أحد يعدك بتنفيذ مثالي في الحزم الموجودة ، لكنها مثالية كنقطة بداية. يأتي الباقي مع الممارسة ، حيث سيساعدك
helm template
helm lint
وأوامر تصحيح أخطاء helm lint
، بالإضافة إلى بدء التثبيت باستخدام خيار
--dry-run
.
لفهم أوسع لتطوير مخططات Helm وأفضل الممارسات والتقنيات المستخدمة ، أقترح أن تتعرف على المواد على الروابط التالية (كلها باللغة الإنجليزية):
وفي نهاية مادة Helm التالية ، أرفق مسحًا سيساعد على فهم أفضل لمقالات أخرى حول Helm التي ينتظرها قراء Habr (أو لا ينتظرونها؟). شكرا لكم على اهتمامكم!
ملاحظة
اقرأ أيضا في مدونتنا: