الفصل 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: إذا نجح الـ hookhook-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