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

الفصل 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