انتقل إلى المحتوى الرئيسي

الفصل 10.3 - القوالب المتقدمة و Hooks

أهداف التعلم​

في نهاية هذا الفصل، ستكون قادرًا على:

  • استخدام الوظائف المتقدمة لقوالب Go
  • تنفيذ الشروط والحلقات
  • استخدام Hooks Helm
  • إدارة التبعيات بين الموارد
  • إنشاء قوالب قابلة لإعادة الاستخدام
  • تحسين Charts

مقدمة​

تسمح قوالب Helm بإنشاء تكوينات Kubernetes ديناميكية وقابلة لإعادة الاستخدام. تسمح Hooks بتنفيذ الإجراءات في لحظات محددة من دورة الحياة.


الوظائف المتقدمة للقوالب​

الشروط​

{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}-ingress
spec:
...
{{- end }}

الحلقات​

{{- range .Values.env }}
- name: {{ .name }}
value: {{ .value }}
{{- end }}

القيم الافتراضية​

replicas: {{ .Values.replicaCount | default 3 }}
image: {{ .Values.image.repository | default "nginx" }}

الدمج​

name: {{ printf "%s-%s" .Release.Name .Chart.Name }}

تضمين​

{{- include "my-chart.labels" . | nindent 4 }}

Hooks Helm​

تسمح Hooks بتنفيذ Jobs أو Pods في لحظات محددة.

أنواع Hooks​

  • pre-install: قبل التثبيت
  • post-install: بعد التثبيت
  • pre-upgrade: قبل الترقية
  • post-upgrade: بعد الترقية
  • pre-delete: قبل الحذف
  • post-delete: بعد الحذف
  • pre-rollback: قبل التراجع
  • post-rollback: بعد التراجع

مثال: Pre-install Hook​

apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-pre-install
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": before-hook-creation
spec:
template:
spec:
containers:
- name: pre-install
image: busybox:1.35
command: ["/bin/sh", "-c", "echo 'Pre-install hook'"]
restartPolicy: Never

مثال: Post-install Hook​

apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-post-install
annotations:
"helm.sh/hook": post-install
"helm.sh/hook-weight": "5"
spec:
template:
spec:
containers:
- name: post-install
image: busybox:1.35
command: ["/bin/sh", "-c", "echo 'Post-install hook'"]
restartPolicy: Never

تعليقات Hooks​

hook-weight​

التحكم في ترتيب التنفيذ:

"helm.sh/hook-weight": "-5"  # يُنفذ أولاً
"helm.sh/hook-weight": "5" # يُنفذ أخيرًا

hook-delete-policy​

متى يتم حذف الـ Hook:

  • before-hook-creation: قبل إنشاء hook جديد
  • hook-succeeded: إذا نجح الـ hook
  • hook-failed: إذا فشل الـ hook
"helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded"

مثال كامل: ترحيل قاعدة البيانات​

Pre-upgrade Hook: النسخ الاحتياطي​

apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-pre-upgrade-backup
annotations:
"helm.sh/hook": pre-upgrade
"helm.sh/hook-weight": "-10"
spec:
template:
spec:
containers:
- name: backup
image: postgres:14
command:
- /bin/bash
- -c
- |
pg_dump -h {{ .Release.Name }}-postgres mydb > /backup/backup-$(date +%Y%m%d).sql
aws s3 cp /backup/backup-$(date +%Y%m%d).sql s3://backups/
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: {{ .Release.Name }}-postgres-secret
key: password
volumeMounts:
- name: backup
mountPath: /backup
volumes:
- name: backup
emptyDir: {}
restartPolicy: Never

Post-upgrade Hook: الترحيل​

apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-post-upgrade-migrate
annotations:
"helm.sh/hook": post-upgrade
"helm.sh/hook-weight": "10"
spec:
template:
spec:
containers:
- name: migrate
image: my-app:{{ .Values.appVersion }}
command: ["/app/migrate.sh"]
env:
- name: DATABASE_URL
value: postgresql://postgres:5432/mydb
restartPolicy: OnFailure

قوالب قابلة لإعادة الاستخدام​

_helpers.tpl متقدم​

{{/*
Labels communs
*/}}
{{- define "my-chart.labels" -}}
app.kubernetes.io/name: {{ include "my-chart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "my-chart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "my-chart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/*
Nom du Chart
*/}}
{{- define "my-chart.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Nom complet
*/}}
{{- define "my-chart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

ممارسات جيدة​

1. استخدام الـ Helpers​

إنشاء helpers قابلة لإعادة الاستخدام في _helpers.tpl.

2. الشروط المناسبة​

استخدام الشروط لجعل القوالب مرنة.

3. Hooks حكيمة​

استخدام الـ hooks فقط عند الضرورة (الترحيلات، النسخ الاحتياطية).

4. التوثيق​

توثيق الـ hooks وهدفها.

5. الاختبارات​

اختبار الـ hooks باستخدام --dry-run.


ملخص​

في هذا الفصل، تعلمت:

الوظائف المتقدمة: الشروط، الحلقات، القيم الافتراضية، الدمج
Hooks: Pre/post install/upgrade/delete/rollback
التعليقات: hook-weight، hook-delete-policy
حالات الاستخدام: الترحيلات، النسخ الاحتياطية، التهيئة
القوالب القابلة لإعادة الاستخدام: Helpers في _helpers.tpl
الممارسات الجيدة: Helpers، الشروط، hooks حكيمة، الاختبارات


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

الوحدة 11: المراقبة والملاحظة
مختبر 10.4: Helmfile والبيئات المتعددة


الفصل تم إنشاؤه في: ديسمبر 2024