أسئلة - هل فهمت Helm والمشروع 13؟

15 دقيقة

المشروع projet13-kubernetes-helm-tp · 36 سؤال تقييم ذاتي

تخص هذه الأسئلة بدقة هذا المشروع (chart/، values.yaml، values-dev.yaml، _helpers.tpl، apps/portail، الأعطال الثلاثة). أجب قبل فتح التصحيح. الإجابات الصحيحة موزَّعة بين A و B و C و D.

جدول المحتويات


A — Helm: أفكار أساسية

1. في جملة واحدة، ماذا يفعل Helm؟

  • A) يستبدل Kubernetes: لم نعد نحتاج إلى kubectl
  • B) يولّد بيانات Kubernetes من قوالب وقيم، ثم يطبّقها كوحدة مُصدَّرة
  • C) يبني صور Docker بدل docker build
  • D) يخدم فقط لتثبيت تطبيقات من الإنترنت
التصحيح

B. يعرض Helm قوالب YAML بمتغيرات (values.yaml)، ثم يطبّق النتيجة في العنقود باسم إصدار (release). يبقى kubectl ضرورياً لمراقبة العنقود.

2. ما هي إصدار (release) Helm؟

  • A) إصدار جديد لشفرة Python للتطبيق
  • B) ملف Chart.yaml موقَّع
  • C) تثبيت ملموس لـ Chart، يُعرَّف باسم (hedge-dev، hedge-staging، hedge-prod)
  • D) نطاق Kubernetes
التصحيح

C. يمكن تثبيت الـ Chart نفسه عدة مرات. كل تثبيت إصدار. النطاق مكان العزل؛ الإصدار هو كائن Helm.

3. في هذا المشروع، أي عبارة صحيحة؟

  • A) يتغيّر {{ .Chart.Name }} في كل helm install، ويبقى {{ .Release.Name }} ثابتاً
  • B) يتغيّر {{ .Release.Name }} في كل helm install، ويبقى {{ .Chart.Name }} ثابتاً
  • C) الاثنان يبقيان ثابتين
  • D) الاثنان يتغيّران في كل helm upgrade
التصحيح

B. يُسمّى الـ Chart دائماً hedge. يتغيّر اسم الإصدار (hedge-dev، hedge-staging، hedge-prod) في كل تثبيت. هذا التباين هو ما يتيح تعدد البيئات.

4. أي أمر ينتج YAML بلا نشر أي شيء في العنقود؟

  • A) helm install
  • B) helm upgrade
  • C) helm lint
  • D) helm template
التصحيح

D. helm template عرض جاف. يتحقق helm lint من الصياغة، لكنه لا يعرض البيانات. يلمسان install و upgrade العنقود.

5. ما فائدة ملف يبدأ اسمه بـ _ في templates/ (مثال: _helpers.tpl

  • A) يطبّقه Helm أولاً، قبل كل الآخرين
  • B) ينتج بيان Kubernetes باسم _helpers
  • C) لا ينتج أي بيان: يعرّف دوالاً قابلة لإعادة الاستخدام (define / include)
  • D) يتجاهله Helm تماماً
التصحيح

C. البادئة _ تعني «مساعد فقط». تُستدعى الدوال بعد ذلك بـ {{ include "hedge.labels" ... }}.

6. في Chart.yaml، ما الفرق بين version و appVersion؟

  • A) لا فرق: هما اسمان مستعاران للحقل نفسه
  • B) version إصدار الـ Chart (تغليف Helm)؛ appVersion إصدار التطبيق المنشور
  • C) version رقم مراجعة Helm؛ appVersion وسم Docker
  • D) version يخدم Kubernetes؛ appVersion يخدم Helm
التصحيح

B. يمكن تغيير version (مثلاً 0.1.0 إلى 0.2.0) بلا تغيير الشفرة التطبيقية، والعكس. ليس رقم المراجعة (helm history)، ولا وسم الصورة تلقائياً.


B — تشريح Chart hedge

7. في هذا المشروع، ماذا يحتوي المجلد apps/؟

  • A) قوالب Helm المطلوب إكمالها
  • B) شفرة Python لـ portail و api، لا تُعدَّل
  • C) ملفات values-<env>.yaml الثلاثة
  • D) المخطوط valider.ps1
التصحيح

B. أنت DevOps: الشفرة التطبيقية مكتوبة مسبقاً. تعديل apps/ محظور بنظام التدريب.

8. لماذا المجلد chart/casses/ ليس داخل chart/templates/؟

  • A) يرفض Helm الملفات التي يبدأ اسمها بـ casse-
  • B) لكي لا يحمّلها Helm تلقائياً: تنسخها واحداً واحداً إلى templates/ لمراقبة الخطأ
  • C) لا يقبل Kubernetes أكثر من 5 ملفات في templates/
  • D) هذه الملفات صور Docker، ليست قوالب
التصحيح

B. يعرض Helm كل ملفات templates/ (إلا تلك المسبوقة بـ _). ترك الأعطال في casses/ يتجنّب كسر الـ Chart قبل المهمة 6.

9. في values.yaml لهذا المشروع، على أي منفذ تستمع حاوية portail؟

  • A) 80
  • B) 30130
  • C) 5000
  • D) 8000
التصحيح

C. portail.service.targetPort: 5000 (هذا منفذ Flask). port: 80 منفذ الخدمة. nodePort: 30130 المنفذ المعروض على الآلة (DEV). 8000 هو targetPort لـ api.

10. في هذا المشروع، أي نوع خدمة متوقَّع لـ api في values.yaml؟

  • A) NodePort
  • B) LoadBalancer
  • C) ExternalName
  • D) ClusterIP
التصحيح

D. تبقى api داخلية للعنقود. يستدعيها البوابة عبر DNS (http://hedge-dev-api). البوابة وحدها NodePort للمتصفح.

11. كم صورة Docker يجب بناؤها مرة واحدة قبل نشر البيئات الثلاث؟

  • A) واحدة (hedge:1.0)
  • B) اثنتان (hedge-portail:1.0 و hedge-api:1.0)
  • C) ثلاث (واحدة لكل بيئة)
  • D) ست (صورتان × ثلاث بيئات)
التصحيح

B. تعيد البيئات الثلاث استخدام الصور نفسها. ما يتغيّر هو القيم المحقونة (لون، نسخ، رسالة)، لا الشفرة.

12. تعرض البوابة شريطاً ملوّناً ورسالة. من أين تأتي هذه المعلومات؟

  • A) مرمَّزة ثابتة في apps/portail/app.py
  • B) تأتي من متغيرات بيئة يحقنها Helm من Values
  • C) تُقرأ من ملف couleur.txt مركَّب كمجلد
  • D) يختارها Flask عشوائياً عند التشغيل
التصحيح

B. يقرأ app.py THEME_COLOR و BANNIERE_MESSAGE و ENVIRONMENT إلخ. تتكيّف الشفرة نفسها مع DEV / STAGING / PROD بلا تعديل.


C — القوالب والقيم والمساعدات

13. ماذا يعرض {{ .Values.portail.replicas }} إن احتوى values-prod.yaml على portail.replicas: 3 وثبّت بـ -f values-prod.yaml؟

  • A) 1 (قيمة values.yaml تفوز دائماً)
  • B) 3 (الملف الممرَّر بـ -f يتجاوز values.yaml)
  • C) خطأ: لا يمكن وجود المفتاح نفسه مرتين
  • D) default
التصحيح

B. يوفّر values.yaml الافتراضيات. كل values-<env>.yaml يتجاوز فقط ما يتغيّر. هذا مبدأ تعدد البيئات نفسه.

14. لماذا ملف values-prod.yaml يعيد تعريف portail.image.repository خطأ تربوي في هذا المشروع؟

  • A) لأن الحقل repository غير موجود
  • B) لأن الصورة متطابقة في البيئات الثلاث: لا سبب لنسخ هذا المفتاح
  • C) لأن Helm يرفض أكثر من 10 مفاتيح في ملف قيم
  • D) لأن المستودع يجب تعريفه فقط في Chart.yaml
التصحيح

B. ننسخ في values-<env>.yaml فقط ما يميّز البيئة (نسخ، nodePort، لون، رسالة، environment). نسخ الباقي عودة إلى النسخ واللصق الذي يُفترض أن يستبدله Helm.

15. في هذا المشروع، يجب أن ينتج المساعد hedge.fullname، للإصدار hedge-dev والمكوّن portail:

  • A) hedge-portail
  • B) portail-hedge-dev
  • C) hedge-dev-portail
  • D) hedge
التصحيح

C. الصيغة <release>-<composant>. هذه البادئة تتجنّب تصادم الأسماء بين DEV و STAGING و PROD (وحتى في النطاق نفسه).

16. أي وسوم يجب أن تظهر وحدها في hedge.selectorLabels؟

  • A) name و instance و component — الثلاثة التي لن تتغيّر أبداً لهذه النسخة
  • B) كل وسوم hedge.labels، بما فيها version و hedge/environment
  • C) hedge/environment فقط
  • D) helm.sh/chart فقط
التصحيح

A. spec.selector.matchLabels غير قابل للتغيير. وضع version أو helm.sh/chart أو hedge/environment فيه سيفشل أول helm upgrade يغيّر هذه القيم.

17. لماذا لا يمكن أن تساوي BACKEND_URL للبوابة http://api ثابتاً؟

  • A) لأن Flask يرفض عناوين بلا رقم منفذ
  • B) لأن الخدمة تُسمّى hedge-<release>-api (مثلاً hedge-dev-api): يعتمد اسم DNS على الإصدار
  • C) لأن api بلا خدمة
  • D) لأن البوابة لا تستدعي api أبداً
التصحيح

B. يبني المساعد hedge.fullname hedge-dev-api و hedge-staging-api و hedge-prod-api. اسم ثابت api لا يحل شيئاً في النطاق.

18. ماذا يفعل {{ .Values.environment | quote }}؟

  • A) يحوّل القيمة إلى عدد صحيح
  • B) يضيف علامات اقتباس حول القيمة المعروضة (ضروري لسلسلة YAML)
  • C) يعرض القيمة بأحرف كبيرة
  • D) يتجاهل القيمة إن كانت فارغة
التصحيح

B. ينتج quote "dev" بدل dev. بلا علامات اقتباس، قد تكسر بعض قيم YAML (ألوان ست عشرية، رسائل) البيان.

19. لماذا replicas: "{{ .Values.portail.replicas }}" (بعلامات اقتباس حول القالب كله) خطر؟

  • A) يرفض Helm علامات الاقتباس في Deployment
  • B) ينتظر Kubernetes عدداً صحيحاً؛ يصير العرض سلسلة "1" ترفضها الواجهة
  • C) ستكون القيمة دائماً 0
  • D) تضاعف علامات الاقتباس عدد النسخ
التصحيح

B. لا تضع اقتباساً حول عدد صحيح أبداً. نكتب replicas: {{ .Values.portail.replicas }}، لا replicas: "{{ ... }}".

20. ما فائدة nindent 4 في {{ include "hedge.labels" ... | nindent 4 }}؟

  • A) حصر المساعد في 4 وسوم
  • B) محاذاة YAML المعروض بشكل صحيح (وإلا يصير البيان غير مقروء أو باطلاً)
  • C) إنشاء 4 نسخ
  • D) الانتظار 4 ثوانٍ قبل العرض
التصحيح

B. يحقن Helm كتلة متعددة الأسطر. بلا nindent تنكسر محاذاة YAML وتحصل على error converting YAML to JSON.


D — البيئات الثلاث

21. في هذا المشروع، أي nodePort محجوز لـ STAGING؟

  • A) 30130
  • B) 30131
  • C) 30132
  • D) 30500
التصحيح

B. DEV = 30130، STAGING = 30131، PROD = 30132. المنفذ 30500 بوابة المشروع 12، لا هذا.

22. كم نسخة portail + api يجب أن تكون لديك في PROD بعد نشر الـ Chart بشكل صحيح؟

  • A) 1 + 1
  • B) 2 + 2
  • C) 3 + 3
  • D) 5 + 1
التصحيح

C. PROD: 3 بوابات و 3 api. DEV: 1+1. STAGING: 2+2. المجموع 12 Pod تطبيقياً جنباً إلى جنب.

23. أي لون شريط يقابل بيئة DEV؟

  • A) برتقالي #ea580c
  • B) أخضر #16a34a
  • C) رمادي #64748b
  • D) أزرق #2563eb
التصحيح

D. أزرق = DEV، برتقالي = STAGING، أخضر = PROD. الرمادي #64748b لون افتراضي في values.yaml (بيئة default)، ليس لون أحد ملفات البيئة الثلاثة.

24. لماذا نشر كل بيئة في نطاقها الخاص (hedge-dev، hedge-staging، hedge-prod

  • A) يرفض Helm إصدارين في النطاق نفسه، حتى بأسماء مختلفة
  • B) لعزل الكائنات، وتجنّب تصادم NodePort الداخلية، ومطابقة واقع مؤسسة (نطاق لكل بيئة)
  • C) لأن Docker Desktop لا يسمح إلا بنطاق واحد
  • D) لأن values.yaml يفرض ذلك
التصحيح

B. يسمح Helm بعدة إصدارات في النطاق نفسه (وهذا فخ العطل 1 إن كانت الأسماء ثابتة). تبقى النطاقات الممارسة الجيدة: عزل، حصص، RBAC، وضوح.

25. أي أمر يثبّت بيئة DEV لهذا المشروع بشكل صحيح؟

  • A) kubectl apply -f chart/environments/values-dev.yaml
  • B) helm install hedge-dev .\chart -f .\chart\environments\values-dev.yaml -n hedge-dev --create-namespace
  • C) helm template hedge-dev .\chart
  • D) docker compose up -d
التصحيح

B. نشير إلى الـ Chart (.\chart)، نتجاوز بـ -f values-dev.yaml، نسمّي الإصدار hedge-dev، ننشئ النطاق. helm template لا ينشر شيئاً. values-dev.yaml ليس بيان kubectl.

26. إن فتحت http://localhost:30132 وكان الشريط أخضر، ماذا ترى بالضرورة في JSON /api-json؟

  • A) "env": "dev"
  • B) "env": "staging"
  • C) "env": "prod" و "backend": "ok" إن أجابت api للنطاق نفسه
  • D) "env": "default"
التصحيح

C. المنفذ 30132 هو منفذ PROD. يأتي الحقل env من .Values.environment. يثبت backend: ok أن BACKEND_URL يشير فعلاً إلى خدمة api لهذا الإصدار.


E — install و upgrade و rollback

27. بعد helm install hedge-dev ... ثم helm upgrade hedge-dev ... --set portail.replicas=5، ماذا يعرض helm history hedge-dev -n hedge-dev؟

  • A) مراجعة واحدة: يمحو Helm التاريخ
  • B) مراجعتان على الأقل: 1 = Install، 2 = Upgrade
  • C) صفر مراجعة: التاريخ لا يوجد إلا بعد rollback
  • D) المراجعة 5 فقط، لأن replicas تساوي 5
التصحيح

B. كل install / upgrade / rollback ينشئ مراجعة. هذا السجل هو ما يجعل الرجوع ممكناً.

28. ماذا يفعل helm rollback hedge-dev 1 -n hedge-dev؟

  • A) يحذف الإصدار
  • B) يعيد تطبيق حالة المراجعة 1 وينشئ مراجعة جديدة (غالباً رقم 3) موصوفة كـ Rollback to 1
  • C) يعود إلى شفرة Git لأول commit
  • D) يعيد values.yaml إلى الصفر على القرص
التصحيح

B. لا يمحو التراجع التاريخ: يضيف مراجعة. لا يتغيّر values-dev.yaml على قرصك.

29. ما الفرق الجوهري بين helm upgrade --set portail.replicas=5 و kubectl scale deploy/hedge-dev-portail --replicas=5؟

  • A) لا فرق: يفعلان الشيء نفسه تماماً
  • B) kubectl scale أبطأ
  • C) helm upgrade مُتتبَّع وقابل للإلغاء بواسطة Helm؛ يخرج kubectl scale عن سيطرة Helm وسيُطمس في الترقية التالية بلا --set
  • D) Kubernetes يحظر kubectl scale على كائن أنشأه Helm
التصحيح

C. يعيد Helm التقارب نحو Values في upgrade التالي. تعديل يدوي (scale، edit) دين غير مرئي. هذا سؤال التفكير في المهمة 5.

30. هل يحذف helm uninstall hedge-dev -n hedge-dev النطاق hedge-dev؟

  • A) نعم، دائماً
  • B) لا: يسحب كائنات الإصدار، لا النطاق (إلا إن حذفته بعد ذلك بـ kubectl delete namespace)
  • C) نعم، لكن فقط إن كان النطاق فارغاً
  • D) لا، وتبقى عمليات النشر في مكانها
التصحيح

B. يسحب uninstall الـ Deployment والخدمة إلخ من الإصدار. يبقى النطاق. ومن هنا أمر تنظيف README: kubectl delete namespace hedge-dev ....

31. ماذا يحدث إن نفّذت kubectl delete pod hedge-dev-portail-xxxxx -n hedge-dev على Pod أنشأه Deployment Helm؟

  • A) يختفي الـ Pod نهائياً؛ يعرض Helm خطأ
  • B) يعيد الـ Deployment إنشاء Pod فوراً؛ لا شيء لـ Helm أن «يعرفه»: يدير الـ Deployment، لا كل Pod
  • C) تُقتل كل Pods النطاق
  • D) يشغّل Helm تراجعاً تلقائياً
التصحيح

B. يصرّح Helm بالـ Deployment. يحافظ Kubernetes على عدد النسخ. حذف Pod إيماءة تربوية للإصلاح التلقائي، لا عطل Helm.


F — أعطال المشروع الثلاثة

32. العطل 1 (casse-1-configmap.yaml): لماذا يفشل الإصدار الثاني في النطاق نفسه؟

  • A) لأن Helm لا يسمح إلا بإصدار واحد لكل عنقود
  • B) لأن metadata.name: hedge-config اسم ثابت: يتنازع الإصداران الكائن نفسه
  • C) لأن ConfigMap بلا data
  • D) لأن values-staging.yaml باطل
التصحيح

B. التصحيح بادئة الاسم بالإصدار: ينتج {{ include "hedge.fullname" (dict "root" . "composant" "config") }} الاسمين hedge-dev-config و hedge-staging-config.

33. العطل 2 (casse-2-worker-deployment.yaml): أي رسالة Kubernetes تراها عند helm upgrade --set environment=recette؟

  • A) nil pointer evaluating interface {}.replicas
  • B) ConfigMap "hedge-config" exists and cannot be imported
  • C) spec.selector: Invalid value: ...: field is immutable
  • D) ImagePullBackOff
التصحيح

C. hedge/environment موجود في matchLabels. تغيير environment يغيّر المُنتقي، وهذا يرفضه Kubernetes. A و B أعراض العطلين 3 و 1.

34. في Deployment، أين يحق وضع الوسم hedge/environment؟

  • A) فقط في spec.selector.matchLabels
  • B) في وسوم الـ Pod (template.metadata.labels) ووسوم الكائن، ليس في matchLabels
  • C) لا مكان: هذا الوسم محظور من Kubernetes
  • D) فقط في Chart.yaml
التصحيح

B. يمكن أن تكون وسوم الـ Pod غنية ومتغيرة. يجب أن يبقى المُنتقي مجموعة فرعية مستقرة. هذا كل تمييز hedge.labels مقابل hedge.selectorLabels.

35. العطل 3 (casse-3-cache-deployment.yaml): ماذا يعني الخطأ nil pointer evaluating interface {}.replicas على .Values.portal.replicas؟

  • A) نفدت ذاكرة العنقود
  • B) المسار خاطئ: يعرّف values.yaml portail (بحرف i)، لا portal — يقيّم Helm nil.replicas
  • C) يلزم كتابة .Release.portal.replicas
  • D) الحقل replicas محظور في Deployment أنشأه Helm
التصحيح

B. حرف واحد زائد. أول رد فعل: helm template --debug وقراءة المسار في رسالة الخطأ.

36. يجب إضافة بيئة رابعة pre-prod غداً. أي ملفات تنشئ، وأيها لا تلمس؟

  • A) تنسخ مجلد chart/ كله وتعيد تسمية الـ Chart
  • B) تنشئ فقط chart/environments/values-preprod.yamlhelm install + نطاق)؛ تبقى القوالب و values.yaml دون تغيير
  • C) تضيف Deployment رابعاً ثابتاً في templates/
  • D) تعدّل apps/portail/app.py ليتعرّف على pre-prod
التصحيح

B. هذا وعد Helm: Chart واحد، N ملفات قيم. إن احتجت إلى لمس القوالب لبيئة جديدة، فالـ Chart سيئ التصميم.


التصحيح الموجز

#الجوابالفكرة للتذكير
1BHelm = قوالب + قيم + إصدار
2Cالإصدار = تثبيت مسمّى
3Bيتغيّر .Release.Name، لا .Chart.Name
4Dhelm template = عرض جاف
5C_helpers.tpl لا ينشئ أي كائن
6Bversion = Chart؛ appVersion = تطبيق
7Bapps/ ثابت
8Bcasses/ خارج templates/ عمداً
9Cحاوية البوابة = المنفذ 5000
10Dapi = ClusterIP
11Bصورتان، ثلاث بيئات
12Bاللون والرسالة يأتيان من متغيرات بيئة Helm
13B-f يتجاوز values.yaml
14Bانسخ فقط ما يختلف
15Chedge-dev-portail
16Aالمُنتقي = name + instance + component
17Bيجب أن يتضمّن BACKEND_URL اسم الإصدار
18Bquote = علامات اقتباس YAML
19Bلا تقتبس عدداً صحيحاً replicas أبداً
20Bnindent ينقذ المحاذاة
21BSTAGING = 30131
22CPROD = 3 + 3
23DDEV = أزرق #2563eb
24Bنطاق لكل بيئة
25Bhelm install ... -f values-dev.yaml -n hedge-dev
26C30132 = prod + backend ok
27Bالتاريخ يراكم المراجعات
28Bالتراجع = مراجعة جديدة
29Cسيُطمس scale خارج Helm
30Buninstall لا يقتل النطاق
31Bحذف pod = إصلاح تلقائي للـ Deployment
32Bاسم ثابت = تصادم بين الإصدارات
33Cمُنتقي غير قابل للتغيير
34Bوسم متغير مقبول على الـ Pod، محظور في matchLabels
35Bخطأ إملائي portal / portail
36Bبيئة جديدة = ملف قيم

درجة تقديرية: 30/36 أو أكثر = يمكنك شرح المشروع لزميل. دون 24/36، أعد قراءة أقسام «المفاهيم الأساسية» و «المهمة 3» و «المهمة 6» في 00-ENONCE.md.


دورة من إعداد د. هيثم رحومة — تطوير ونشر حلول البيانات