الفصل 10.2 - Helm Charts
أهداف التعلم
في نهاية هذا الفصل، ستكون قادرًا على:
- فهم هيكل Chart Helm
- إنشاء Chart من الصفر
- استخدام قوالب Go
- التخصيص باستخدام values.yaml
- إدارة التبعيات
- نشر Chart
مقدمة
Chart Helm هو حزمة تحتوي على جميع الملفات اللازمة لنشر تطبيق في Kubernetes. يستخدم القوالب لجعل ملفات YAML ديناميكية.
هيكل Chart
الهيكل الكامل
my-chart/
├── Chart.yaml # البيانات الوصفية للـ Chart
├── Chart.lock # قفل التبعيات
├── values.yaml # القيم الافتراضية
├── values.schema.json # مخطط التحقق (اختياري)
├── templates/ # قوالب Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # مساعدات قابلة لإعادة الاستخدام
│ └── NOTES.txt # ملاحظات تظهر بعد التثبيت
├── charts/ # Charts التابعة (اختياري)
└── README.md # الوثائق
إنشاء Chart
إنشاء Chart أساسي
# إنشاء Chart جديد
helm create my-chart
# الهيكل الذي تم إنشاؤه
my-chart/
├── Chart.yaml
├── values.yaml
└── templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── _helpers.tpl
└── NOTES.txt
Chart.yaml
apiVersion: v2
name: my-chart
description: A Helm chart for my application
type: application
version: 0.1.0
appVersion: "1.0.0"
keywords:
- web
- application
maintainers:
- name: John Doe
email: john@example.com
قوالب Go
بناء الجملة الأساسي
تستخدم القوالب بناء جملة قوالب Go:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
المتغيرات المتاحة
.Release.Name: اسم الإصدار.Release.Namespace: النطاق.Chart.Name: اسم الـ Chart.Values.*: القيم من values.yaml.Capabilities.*: معلومات عن العنقود
values.yaml
مثال على values.yaml
# عدد النسخ
replicaCount: 3
# الصورة
image:
repository: nginx
tag: "1.20"
pullPolicy: IfNotPresent
# الخدمة
service:
type: ClusterIP
port: 80
# Ingress
ingress:
enabled: true
className: nginx
hosts:
- host: example.com
paths:
- path: /
pathType: Prefix
tls: []
# الموارد
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
مثال كامل: Chart تطبيق ويب
Chart.yaml
apiVersion: v2
name: web-app
description: A simple web application
type: application
version: 0.1.0
appVersion: "1.0.0"
values.yaml
replicaCount: 2
image:
repository: myapp
tag: "1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: nginx
hosts:
- host: myapp.example.com
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "web-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "web-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8080
name: http
resources:
{{- toYaml .Values.resources | nindent 10 }}
templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "web-app.selectorLabels" . | nindent 4 }}
templates/_helpers.tpl
{{/*
Labels communs
*/}}
{{- define "web-app.labels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "web-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Nom complet
*/}}
{{- define "web-app.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name }}
{{- end }}
تثبيت Chart محلي
التثبيت
# من دليل محلي
helm install my-release ./my-chart
# مع قيم مخصصة
helm install my-release ./my-chart -f custom-values.yaml
# مع قيم مضمنة
helm install my-release ./my-chart \
--set replicaCount=5 \
--set image.tag=1.1.0
التحديث
# التحديث
helm upgrade my-release ./my-chart
# مع قيم جديدة
helm upgrade my-release ./my-chart -f new-values.yaml
التبعيات
Chart.yaml مع التبعيات
apiVersion: v2
name: my-app
dependencies:
- name: postgresql
version: "12.0.0"
repository: "https://charts.bitnami.com/bitnami"
- name: redis
version: "17.0.0"
repository: "https://charts.bitnami.com/bitnami"
تثبيت التبعيات
# تحميل التبعيات
helm dependency update
# عرض التبعيات
helm dependency list
التغليف والتوزيع
إنشاء حزمة
# إنشاء حزمة .tgz
helm package ./my-chart
# النتيجة: my-chart-0.1.0.tgz
النشر في مستودع
# إضافة إلى المستودع
helm repo index . --url https://charts.example.com
# رفع الحزمة
# (حسب طريقة التخزين الخاصة بك)
أوامر مفيدة
التحقق
# المدقق
helm lint ./my-chart
# القالب مع dry-run
helm install my-release ./my-chart --dry-run --debug
# عرض القيم المحسوبة
helm template my-release ./my-chart
الاختبار
# التثبيت في وضع الاختبار
helm install my-release ./my-chart --dry-run
# عرض المانيفست الناتج
helm get manifest my-release
أفضل الممارسات
1. هيكل واضح
تنظيم القوالب بطريقة منطقية.
2. المساعدات
استخدام _helpers.tpl للكود القابل لإعادة الاستخدام.
3. التوثيق
توثيق جميع القيم في values.yaml.
4. التحقق
استخدام values.schema.json للتحقق من القيم.
5. إدارة الإصدارات
اتباع إدارة الإصدارات الدلالية للـ Charts.
ملخص
في هذا الفصل، تعلمت:
الهيكل: Chart.yaml، values.yaml، templates/، charts/
قوالب Go: بناء الجملة مع الأقواس المزدوجة، المتغيرات المتاحة
values.yaml: قيم افتراضية قابلة للتخصيص
المساعدات: _helpers.tpl للكود القابل لإعادة الاستخدام
التبعيات: الإدارة عبر Chart.yaml
التغليف: helm package لإنشاء .tgz
التثبيت: helm install من محلي أو مستودع
أفضل الممارسات: الهيكل، المساعدات، التوثيق، إدارة الإصدارات
الخطوات التالية
الفصل 10.3: القوالب المتقدمة وHooks
مختبر 10.2: التخصيص باستخدام values.yaml
مختبر 10.3: إنشاء Chart مخصص
تم إنشاء الفصل في: ديسمبر 2024