المشروع projet13-kubernetes-helm-tp · 36 سؤال تقييم ذاتي
تخص هذه الأسئلة بدقة هذا المشروع (
chart/،values.yaml،values-dev.yaml،_helpers.tpl،apps/portail، الأعطال الثلاثة). أجب قبل فتح التصحيح. الإجابات الصحيحة موزَّعة بين A و B و C و D.
| الموضوع | الأسئلة |
|---|---|
| أ — Helm: أفكار أساسية | 1 إلى 6 |
| ب — تشريح Chart hedge | 7 إلى 12 |
| ج — القوالب والقيم والمساعدات | 13 إلى 20 |
| د — البيئات الثلاث | 21 إلى 26 |
| هـ — install و upgrade و rollback | 27 إلى 31 |
| و — أعطال المشروع الثلاثة | 32 إلى 36 |
| التصحيح الموجز | — |
1. في جملة واحدة، ماذا يفعل Helm؟
kubectldocker buildB. يعرض Helm قوالب YAML بمتغيرات (values.yaml)، ثم يطبّق النتيجة في العنقود باسم إصدار (release). يبقى kubectl ضرورياً لمراقبة العنقود.
2. ما هي إصدار (release) Helm؟
Chart.yaml موقَّعhedge-dev، hedge-staging، hedge-prod)C. يمكن تثبيت الـ Chart نفسه عدة مرات. كل تثبيت إصدار. النطاق مكان العزل؛ الإصدار هو كائن Helm.
3. في هذا المشروع، أي عبارة صحيحة؟
{{ .Chart.Name }} في كل helm install، ويبقى {{ .Release.Name }} ثابتاً{{ .Release.Name }} في كل helm install، ويبقى {{ .Chart.Name }} ثابتاًhelm upgradeB. يُسمّى الـ Chart دائماً hedge. يتغيّر اسم الإصدار (hedge-dev، hedge-staging، hedge-prod) في كل تثبيت. هذا التباين هو ما يتيح تعدد البيئات.
4. أي أمر ينتج YAML بلا نشر أي شيء في العنقود؟
helm installhelm upgradehelm linthelm templateD. helm template عرض جاف. يتحقق helm lint من الصياغة، لكنه لا يعرض البيانات. يلمسان install و upgrade العنقود.
5. ما فائدة ملف يبدأ اسمه بـ _ في templates/ (مثال: _helpers.tpl)؟
_helpersdefine / include)C. البادئة _ تعني «مساعد فقط». تُستدعى الدوال بعد ذلك بـ {{ include "hedge.labels" ... }}.
6. في Chart.yaml، ما الفرق بين version و appVersion؟
version إصدار الـ Chart (تغليف Helm)؛ appVersion إصدار التطبيق المنشورversion رقم مراجعة Helm؛ appVersion وسم Dockerversion يخدم Kubernetes؛ appVersion يخدم HelmB. يمكن تغيير version (مثلاً 0.1.0 إلى 0.2.0) بلا تغيير الشفرة التطبيقية، والعكس. ليس رقم المراجعة (helm history)، ولا وسم الصورة تلقائياً.
7. في هذا المشروع، ماذا يحتوي المجلد apps/؟
portail و api، لا تُعدَّلvalues-<env>.yaml الثلاثةvalider.ps1B. أنت DevOps: الشفرة التطبيقية مكتوبة مسبقاً. تعديل apps/ محظور بنظام التدريب.
8. لماذا المجلد chart/casses/ ليس داخل chart/templates/؟
casse-templates/ لمراقبة الخطأtemplates/B. يعرض Helm كل ملفات templates/ (إلا تلك المسبوقة بـ _). ترك الأعطال في casses/ يتجنّب كسر الـ Chart قبل المهمة 6.
9. في values.yaml لهذا المشروع، على أي منفذ تستمع حاوية portail؟
C. portail.service.targetPort: 5000 (هذا منفذ Flask). port: 80 منفذ الخدمة. nodePort: 30130 المنفذ المعروض على الآلة (DEV). 8000 هو targetPort لـ api.
10. في هذا المشروع، أي نوع خدمة متوقَّع لـ api في values.yaml؟
D. تبقى api داخلية للعنقود. يستدعيها البوابة عبر DNS (http://hedge-dev-api). البوابة وحدها NodePort للمتصفح.
11. كم صورة Docker يجب بناؤها مرة واحدة قبل نشر البيئات الثلاث؟
hedge:1.0)hedge-portail:1.0 و hedge-api:1.0)B. تعيد البيئات الثلاث استخدام الصور نفسها. ما يتغيّر هو القيم المحقونة (لون، نسخ، رسالة)، لا الشفرة.
12. تعرض البوابة شريطاً ملوّناً ورسالة. من أين تأتي هذه المعلومات؟
apps/portail/app.pycouleur.txt مركَّب كمجلدB. يقرأ app.py THEME_COLOR و BANNIERE_MESSAGE و ENVIRONMENT إلخ. تتكيّف الشفرة نفسها مع DEV / STAGING / PROD بلا تعديل.
13. ماذا يعرض {{ .Values.portail.replicas }} إن احتوى values-prod.yaml على portail.replicas: 3 وثبّت بـ -f values-prod.yaml؟
1 (قيمة values.yaml تفوز دائماً)3 (الملف الممرَّر بـ -f يتجاوز values.yaml)defaultB. يوفّر values.yaml الافتراضيات. كل values-<env>.yaml يتجاوز فقط ما يتغيّر. هذا مبدأ تعدد البيئات نفسه.
14. لماذا ملف values-prod.yaml يعيد تعريف portail.image.repository خطأ تربوي في هذا المشروع؟
repository غير موجودChart.yamlB. ننسخ في values-<env>.yaml فقط ما يميّز البيئة (نسخ، nodePort، لون، رسالة، environment). نسخ الباقي عودة إلى النسخ واللصق الذي يُفترض أن يستبدله Helm.
15. في هذا المشروع، يجب أن ينتج المساعد hedge.fullname، للإصدار hedge-dev والمكوّن portail:
hedge-portailportail-hedge-devhedge-dev-portailhedgeC. الصيغة <release>-<composant>. هذه البادئة تتجنّب تصادم الأسماء بين DEV و STAGING و PROD (وحتى في النطاق نفسه).
16. أي وسوم يجب أن تظهر وحدها في hedge.selectorLabels؟
name و instance و component — الثلاثة التي لن تتغيّر أبداً لهذه النسخةhedge.labels، بما فيها version و hedge/environmenthedge/environment فقطhelm.sh/chart فقطA. spec.selector.matchLabels غير قابل للتغيير. وضع version أو helm.sh/chart أو hedge/environment فيه سيفشل أول helm upgrade يغيّر هذه القيم.
17. لماذا لا يمكن أن تساوي BACKEND_URL للبوابة http://api ثابتاً؟
hedge-<release>-api (مثلاً hedge-dev-api): يعتمد اسم DNS على الإصدارB. يبني المساعد hedge.fullname hedge-dev-api و hedge-staging-api و hedge-prod-api. اسم ثابت api لا يحل شيئاً في النطاق.
18. ماذا يفعل {{ .Values.environment | quote }}؟
B. ينتج quote "dev" بدل dev. بلا علامات اقتباس، قد تكسر بعض قيم YAML (ألوان ست عشرية، رسائل) البيان.
19. لماذا replicas: "{{ .Values.portail.replicas }}" (بعلامات اقتباس حول القالب كله) خطر؟
"1" ترفضها الواجهةB. لا تضع اقتباساً حول عدد صحيح أبداً. نكتب replicas: {{ .Values.portail.replicas }}، لا replicas: "{{ ... }}".
20. ما فائدة nindent 4 في {{ include "hedge.labels" ... | nindent 4 }}؟
B. يحقن Helm كتلة متعددة الأسطر. بلا nindent تنكسر محاذاة YAML وتحصل على error converting YAML to JSON.
21. في هذا المشروع، أي nodePort محجوز لـ STAGING؟
B. DEV = 30130، STAGING = 30131، PROD = 30132. المنفذ 30500 بوابة المشروع 12، لا هذا.
22. كم نسخة portail + api يجب أن تكون لديك في PROD بعد نشر الـ Chart بشكل صحيح؟
C. PROD: 3 بوابات و 3 api. DEV: 1+1. STAGING: 2+2. المجموع 12 Pod تطبيقياً جنباً إلى جنب.
23. أي لون شريط يقابل بيئة DEV؟
#ea580c#16a34a#64748b#2563ebD. أزرق = DEV، برتقالي = STAGING، أخضر = PROD. الرمادي #64748b لون افتراضي في values.yaml (بيئة default)، ليس لون أحد ملفات البيئة الثلاثة.
24. لماذا نشر كل بيئة في نطاقها الخاص (hedge-dev، hedge-staging، hedge-prod)؟
values.yaml يفرض ذلكB. يسمح Helm بعدة إصدارات في النطاق نفسه (وهذا فخ العطل 1 إن كانت الأسماء ثابتة). تبقى النطاقات الممارسة الجيدة: عزل، حصص، RBAC، وضوح.
25. أي أمر يثبّت بيئة DEV لهذا المشروع بشكل صحيح؟
kubectl apply -f chart/environments/values-dev.yamlhelm install hedge-dev .\chart -f .\chart\environments\values-dev.yaml -n hedge-dev --create-namespacehelm template hedge-dev .\chartdocker compose up -dB. نشير إلى الـ Chart (.\chart)، نتجاوز بـ -f values-dev.yaml، نسمّي الإصدار hedge-dev، ننشئ النطاق. helm template لا ينشر شيئاً. values-dev.yaml ليس بيان kubectl.
26. إن فتحت http://localhost:30132 وكان الشريط أخضر، ماذا ترى بالضرورة في JSON /api-json؟
"env": "dev""env": "staging""env": "prod" و "backend": "ok" إن أجابت api للنطاق نفسه"env": "default"C. المنفذ 30132 هو منفذ PROD. يأتي الحقل env من .Values.environment. يثبت backend: ok أن BACKEND_URL يشير فعلاً إلى خدمة api لهذا الإصدار.
27. بعد helm install hedge-dev ... ثم helm upgrade hedge-dev ... --set portail.replicas=5، ماذا يعرض helm history hedge-dev -n hedge-dev؟
B. كل install / upgrade / rollback ينشئ مراجعة. هذا السجل هو ما يجعل الرجوع ممكناً.
28. ماذا يفعل helm rollback hedge-dev 1 -n hedge-dev؟
Rollback to 1values.yaml إلى الصفر على القرصB. لا يمحو التراجع التاريخ: يضيف مراجعة. لا يتغيّر values-dev.yaml على قرصك.
29. ما الفرق الجوهري بين helm upgrade --set portail.replicas=5 و kubectl scale deploy/hedge-dev-portail --replicas=5؟
kubectl scale أبطأhelm upgrade مُتتبَّع وقابل للإلغاء بواسطة Helm؛ يخرج kubectl scale عن سيطرة Helm وسيُطمس في الترقية التالية بلا --setkubectl scale على كائن أنشأه HelmC. يعيد Helm التقارب نحو Values في upgrade التالي. تعديل يدوي (scale، edit) دين غير مرئي. هذا سؤال التفكير في المهمة 5.
30. هل يحذف helm uninstall hedge-dev -n hedge-dev النطاق hedge-dev؟
kubectl delete namespace)B. يسحب uninstall الـ Deployment والخدمة إلخ من الإصدار. يبقى النطاق. ومن هنا أمر تنظيف README: kubectl delete namespace hedge-dev ....
31. ماذا يحدث إن نفّذت kubectl delete pod hedge-dev-portail-xxxxx -n hedge-dev على Pod أنشأه Deployment Helm؟
B. يصرّح Helm بالـ Deployment. يحافظ Kubernetes على عدد النسخ. حذف Pod إيماءة تربوية للإصلاح التلقائي، لا عطل Helm.
32. العطل 1 (casse-1-configmap.yaml): لماذا يفشل الإصدار الثاني في النطاق نفسه؟
metadata.name: hedge-config اسم ثابت: يتنازع الإصداران الكائن نفسهdatavalues-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؟
nil pointer evaluating interface {}.replicasConfigMap "hedge-config" exists and cannot be importedspec.selector: Invalid value: ...: field is immutableImagePullBackOffC. hedge/environment موجود في matchLabels. تغيير environment يغيّر المُنتقي، وهذا يرفضه Kubernetes. A و B أعراض العطلين 3 و 1.
34. في Deployment، أين يحق وضع الوسم hedge/environment؟
spec.selector.matchLabelstemplate.metadata.labels) ووسوم الكائن، ليس في matchLabelsChart.yamlB. يمكن أن تكون وسوم الـ Pod غنية ومتغيرة. يجب أن يبقى المُنتقي مجموعة فرعية مستقرة. هذا كل تمييز hedge.labels مقابل hedge.selectorLabels.
35. العطل 3 (casse-3-cache-deployment.yaml): ماذا يعني الخطأ nil pointer evaluating interface {}.replicas على .Values.portal.replicas؟
values.yaml portail (بحرف i)، لا portal — يقيّم Helm nil.replicas.Release.portal.replicasreplicas محظور في Deployment أنشأه HelmB. حرف واحد زائد. أول رد فعل: helm template --debug وقراءة المسار في رسالة الخطأ.
36. يجب إضافة بيئة رابعة pre-prod غداً. أي ملفات تنشئ، وأيها لا تلمس؟
chart/ كله وتعيد تسمية الـ Chartchart/environments/values-preprod.yaml (و helm install + نطاق)؛ تبقى القوالب و values.yaml دون تغييرtemplates/apps/portail/app.py ليتعرّف على pre-prodB. هذا وعد Helm: Chart واحد، N ملفات قيم. إن احتجت إلى لمس القوالب لبيئة جديدة، فالـ Chart سيئ التصميم.
| # | الجواب | الفكرة للتذكير |
|---|---|---|
| 1 | B | Helm = قوالب + قيم + إصدار |
| 2 | C | الإصدار = تثبيت مسمّى |
| 3 | B | يتغيّر .Release.Name، لا .Chart.Name |
| 4 | D | helm template = عرض جاف |
| 5 | C | _helpers.tpl لا ينشئ أي كائن |
| 6 | B | version = Chart؛ appVersion = تطبيق |
| 7 | B | apps/ ثابت |
| 8 | B | casses/ خارج templates/ عمداً |
| 9 | C | حاوية البوابة = المنفذ 5000 |
| 10 | D | api = ClusterIP |
| 11 | B | صورتان، ثلاث بيئات |
| 12 | B | اللون والرسالة يأتيان من متغيرات بيئة Helm |
| 13 | B | -f يتجاوز values.yaml |
| 14 | B | انسخ فقط ما يختلف |
| 15 | C | hedge-dev-portail |
| 16 | A | المُنتقي = name + instance + component |
| 17 | B | يجب أن يتضمّن BACKEND_URL اسم الإصدار |
| 18 | B | quote = علامات اقتباس YAML |
| 19 | B | لا تقتبس عدداً صحيحاً replicas أبداً |
| 20 | B | nindent ينقذ المحاذاة |
| 21 | B | STAGING = 30131 |
| 22 | C | PROD = 3 + 3 |
| 23 | D | DEV = أزرق #2563eb |
| 24 | B | نطاق لكل بيئة |
| 25 | B | helm install ... -f values-dev.yaml -n hedge-dev |
| 26 | C | 30132 = prod + backend ok |
| 27 | B | التاريخ يراكم المراجعات |
| 28 | B | التراجع = مراجعة جديدة |
| 29 | C | سيُطمس scale خارج Helm |
| 30 | B | uninstall لا يقتل النطاق |
| 31 | B | حذف pod = إصلاح تلقائي للـ Deployment |
| 32 | B | اسم ثابت = تصادم بين الإصدارات |
| 33 | C | مُنتقي غير قابل للتغيير |
| 34 | B | وسم متغير مقبول على الـ Pod، محظور في matchLabels |
| 35 | B | خطأ إملائي portal / portail |
| 36 | B | بيئة جديدة = ملف قيم |
درجة تقديرية: 30/36 أو أكثر = يمكنك شرح المشروع لزميل. دون 24/36، أعد قراءة أقسام «المفاهيم الأساسية» و «المهمة 3» و «المهمة 6» في 00-ENONCE.md.
دورة من إعداد د. هيثم رحومة — تطوير ونشر حلول البيانات