مسار واضح يشرح المنصة خطوة خطوة: إزاي الكود بيتبني، GitOps بيوصله للكلاستر، وازاي نراقب الخدمة ونحافظ على بياناتها.
3 عُقدControl Plane وWorker معًا
مسار واحدGitHub Actions ثم Argo CD
بالعربيشرح ومصطلحات وأسئلة مراجعة
ابدأ هنا
اقرأ بالترتيب، وارسم الرحلة على ورقة. بعد كل درس حاول تشرح الفكرة بصوتك من غير حفظ أسماء الأدوات. الهدف إنك تعرف ليه كل مكوّن موجود، وإيه الدليل إن شغله تم.
قاعدة بسيطة: Git يصف الحالة المطلوبة، وKubernetes يحاول يوصل للحالة دي. لو اختلفوا، نعرف مين صاحب القرار في كل نوع من الموارد قبل ما نصلح.
١. قصة المشروع في دقيقة
ده معمل DevOps على ثلاث آلات افتراضية تشغّل Kubernetes. فيه تطبيقان صغيران، واحد بـGo وواحد بـNode.js. المطور يغيّر الكود ويرفعه إلى GitHub. GitHub Actions يفحص ويبني صورة حاوية، يختبرها، وينشرها في registry. بعد كده يسجل tag الصورة الجديدة في إعدادات Helm داخل Git. Argo CD يلاحظ التغيير ويطلب من Kubernetes تشغيل النسخة المطلوبة.
Traefik يستقبل طلبات HTTPS ويوصلها للتطبيق. MetalLB يعطي خدمة الدخول عنوانًا ثابتًا. Cilium يدير شبكة الـPods والسياسات. Longhorn يوفر أقراصًا دائمة. Prometheus يجمع المقاييس وGrafana تعرضها.
إجابة مختصرة: المشروع يدرّبك على توصيل تطوير التطبيق بالبنية التحتية والمراقبة والتخزين، باستخدام تدفق GitOps قابل للتتبع.
اختبر نفسك: ما الفرق بين بناء الصورة وتشغيلها؟
البناء يحوّل الكود إلى artifact ثابت (container image). التشغيل ينشئ Pods من الصورة على Kubernetes. الـCI يبني وينشر؛ والـCD يطلب الحالة المطلوبة ويطبقها.
جولة في ملفات المشروع: أفتح إيه وليه؟
ابدأ من الملفات اللي ترسم الصورة العامة، ثم انزل للتفاصيل. أسماء المجلدات هنا مرتبطة بمسؤولية واضحة:
golang/ وnodejs/مصدر التطبيقين وDockerfile لكل واحد. هنا يتغير كود التطبيق وتبدأ عملية بناء الصورة.
charts/Helm chart مشترك. القوالب في templates/، والقيم العامة في values.yaml، والاختلافات في values-go.yaml وvalues-node.yaml.
argocd/ملفات Argo CD Applications وطريقة ربط Git بمكونات الكلاستر. app-of-apps.yaml يبدأ التطبيقات الفرعية من argocd/apps/.
terraform/إصدارات محددة من مكونات المنصة المُدارة عبر Helm ومصادرها. ملف state محلي ومهم؛ لا تنشئ state جديدًا ثم تطبّق على موارد موجودة من غير استيراد ومراجعة الخطة.
networking/قيم Cilium، نطاق MetalLB لعنوان الدخول، وسياسات NetworkPolicy.
storage/ وsealed-secrets/سياسة Longhorn والنسخ المجدولة؛ ملفات الأسرار المشفرة فقط. المفتاح الخاص لفك Sealed Secrets يعيش داخل الكلاستر.
monitoring/موارد Prometheus وGrafana وAlertmanager، dashboard، ServiceMonitors، قواعد التنبيه وطرق الدخول.
infrastructure/جرد عقد Kubernetes وإعدادات النسخة وعنوان الـAPI وعنوان الدخول؛ يساعد أدوات التحقق على مقارنة ملفاتها ببعض.
scripts/أوامر مساعدة لتجهيز VM، فحص الإعدادات، رسم manifests محليًا، وتجهيز JSON schemas لـCI. السكربتات أداة تنفيذ/تحقق وليست بديلًا عن Kubernetes أو Terraform.
docs/شرح البنية والتشغيل والأمان والتخزين واستكشاف الأخطاء. README مدخل سريع، والملفات هنا إجراءات وتفاصيل يرجع لها المشغل.
تتبّع التطبيق يبدأ من nodejs/ ثم .github/workflows/automate-build-apps.yml ثم charts/values-node.yaml ثم argocd/apps/nodejs.yaml وينتهي بـDeployment وPods.
٢. شكل المنصة ومين مسؤول عن إيه
GitHub←Actions←Container Registry←Helm values في Git←Argo CD←Kubernetes
السهم هنا يوضح الاعتماد: Actions تنشر الصورة وتحدّث tag في Git. Argo CD يقرأ الحالة من Git ويصالحها مع الكلاستر. المستخدم يصل عبر عنوان الخدمة في MetalLB، ثم Traefik يختار الوجهة حسب اسم النطاق.
Terraformيدير إصدارات محددة من مكونات المنصة المثبتة عبر Helm. لا نخلط ملكيته مع الموارد التي يديرها Argo CD.
Helmقوالب وقيم تنتج Kubernetes manifests. الـchart واحد للتطبيقين، والقيم تختلف لكل تطبيق.
Argo CDيراقب Git ويعرض هل الحالة متزامنة وصحية. لا يبني صور التطبيقات.
Kubernetesيشغّل Pods ويعيد إنشاءها ويوازنها حسب الـDeployments والموارد المطلوبة.
GitHub Actions: كل Workflow له وظيفة
١. automate-build-apps.yml
يعمل عند تغيير ملفات التطبيق على main أو تشغيل يدوي. يبني التطبيقين، يشغلهما محليًا داخل Runner، يختبر /healthz و/metrics، ويفحص الصورة بـTrivy. بعد نجاح ذلك ينشر الصور بوسم commit ويضيف إثبات provenance. آخر Job يحدّث image tags في Helm values؛ Actions لا تنفذ kubectl على الكلاستر.
٢. platform-validation.yml
يعمل على تغييرات ملفات المنصة في Pull Request أو push. يفحص تنسيق وصحة Terraform، Helm lint، YAML وبنية الشبكة، Bash syntax، manifests بعد render مع Kubernetes schemas، ثم الأسرار وتهيئة IaC عبر Gitleaks وTrivy. النجاح هنا يعني أن الملفات اجتازت هذه الفحوصات، وليس أنها جُربت على كل سيناريو فشل حي.
٣. post-deployment-check.yml
يعمل بعد نجاح بناء وترقية التطبيقات أو يدويًا. يشغل scripts/check-deployment.sh ليتأكد من health وmetrics والروابط العامة، ويفحص Prometheus targets عندما يكون السر المطلوب مضبوطًا.
غيّرت كود التطبيق؟ automate-build-apps
غيّرت إعداد المنصة؟ platform-validation
نجح نشر التطبيق؟ post-deployment-check
ليه tag الصورة مبني على commit؟
حتى أقدر أربط النسخة المنشورة بالكود الذي بناها. الوسم الواضح يسهل المقارنة والرجوع، والـdigest يحدد المحتوى بدقة أعلى من tag قابل للتغيير.
Helm وArgo CD: من القالب إلى الحالة الحية
Argo CD app الخاصة بـGo تستخدم نفس المسار charts/ مع القيم العامة وvalues-go.yaml. تطبيق Node يستخدم القيم العامة وvalues-node.yaml. Helm يدمج القيم بالترتيب ثم يملأ القوالب.
القوالب تصف الموارد التي يحتاجها التطبيق: ServiceAccount وConfigMap وDeployment وService وHPA وPDB وIngress وCertificate وServiceMonitor وPrometheusRule. هذا يقلل اختلاف النسختين ويحافظ على نقاط ضبط مشتركة.
Argo CD يعرض الفرق بين Git والحالة الفعلية. Synced تعني أن الحالة مطابقة للمصدر في Git، وHealthy تعني أن فحوص الموارد تقول إنها سليمة. قد تكون App Synced لكن غير Healthy إذا فشل Pod readiness.
اسأل دائمًا: من يملك المورد؟ تطبيق Argo CD؟ Terraform؟ أم إدارة يدوية موثقة؟ امتلاك أكثر من أداة للمورد نفسه يسبب تغييرات متعارضة.
ماذا يحدث لو عدّلت Deployment يدويًا؟
قد يظهر فرق عن Git. مع self-heal سيحاول Argo CD إعادة الحالة المعرّفة في Git. لذلك أصلح المصدر صاحب الملكية، ثم راقب sync والـrollout.
٣. رحلة تغيير حقيقي من commit إلى Pod
تعدّل ملفًا مثل nodejs/server.js وتعمل commit.
GitHub Actions يشغّل workflow بناء التطبيق: compile/build ثم smoke test ثم فحص الصورة.
تنشر الصورة بوسم مرتبط بالـcommit، فيسهل معرفة مصدر النسخة.
الـworkflow يحدّث ملف قيم Helm بالوسم الجديد ويرفع commit الترقية إلى Git.
Argo CD يلاحظ commit القيم ويعيد render للـchart.
Kubernetes ينشئ Pods من الصورة الجديدة، ويتابع readiness. أثناء التحديث يراقب عدد النسخ الجاهزة.
فحص ما بعد النشر يتأكد من health والـmetrics والـroutes العامة.
لو فشل البناء، التغيير لا يصل للصورة. لو نجح البناء وفشل Argo sync، افحص Git والـchart وحالة التطبيق كلٌّ على حدة.
ليه ما نعدّلش الـPod مباشرة؟
الـPod مورد مؤقت. والنسخة اليدوية لا تسجل الحالة المطلوبة في Git، فيمكن أن يستبدلها Deployment أو Argo CD. التعديل الصحيح يكون في المصدر الذي يملك المورد.
٤. Kubernetes من غير تعقيد
تخيّل إنك بتقول للنظام: «عايز 3 نسخ من التطبيق، بالصورة دي، وكل نسخة لازم تعدّي فحص الجاهزية». الـDeployment يسجل الوصف. الـScheduler يختار عُقدًا، والـkubelet على كل عقدة يطلب من container runtime تشغيل الـPod. لو نسخة وقعت، Kubernetes يحاول يرجّع العدد المطلوب.
NodeVM عضو في الكلاستر وتوفّر CPU وذاكرة وتشغّل Pods.
Podأصغر وحدة تشغيل، تحتوي عادةً حاوية أو أكثر مرتبطين معًا.
Deploymentيحافظ على عدد النسخ ويحدّثها تدريجيًا.
Serviceعنوان داخلي ثابت يوزع الطلبات على Pods المطابقة.
Namespaceمساحة تنظيم وعزل منطقي للموارد داخل الكلاستر.
Readinessهل التطبيق جاهز لاستقبال الطلبات؟ تختلف عن liveness الذي يسأل هل العملية ما زالت سليمة؟
ثلاث عُقد معناها high availability؟
تساعد في تحمل فقدان عقدة واحدة لأن control plane يستخدم etcd quorum. لكنها لا تعني حماية من كل الأعطال: العُقد تشترك في بيئة مادية واحدة، ولذلك لا يصح ادعاء تحمل فقدان الموقع أو الخادم الفيزيائي.
جوا الكلاستر: مين بياخد القرار ومين يشغّل الحاوية؟
كل عقدة في المعمل بتشغّل control plane وworkloads. مكونات Kubernetes بتتواصل عبر الـAPI server، ومش كل مكون يشغّل التطبيق بنفسه:
API serverواجهة الكلاستر. أدوات مثل kubectl وArgo CD تبعت له تغييرات الموارد وتقرأ الحالة.
etcdقاعدة بيانات حالة الكلاستر: الـDeployments والـNodes وموارد Kubernetes الأخرى. ثلاث أعضاء تحتاج عضوين على الأقل للـquorum.
Schedulerيختار العقدة المناسبة للـPod حسب الموارد والقيود والتوزيع.
Controllersتقارن المطلوب بالواقع. Deployment controller ينشئ ReplicaSet، وReplicaSet يحافظ على عدد الـPods.
kubeletعلى كل Node: يراقب الـPods المخصصة للعقدة ويطلب من containerd تشغيل الحاويات.
لو عقدة توقفت، الـcontrol plane يلاحظ غيابها، ثم يحاول الـDeployment تشغيل Pods بديلة على العقد المتاحة. ده لا يعني إن كل عطل يتحل فورًا: افحص سعة العقد، volume health، readiness، وسياسات التوزيع.
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get --raw=/readyz
etcd snapshot يحمي حالة Kubernetes. محتوى ملفات التطبيق على PVC له مسار نسخ واستعادة مختلف عبر Longhorn.
الشبكة من داخل الكلاستر: Cilium وNetworkPolicy
Cilium هو CNI: يخصص عناوين للـPods ويوصل حركتها، ويطبّق سياسات شبكة. إعداد المعمل يستخدم Cluster Pool لعناوين الـPods وVXLAN لنقل الحركة بين العقد. Cilium هنا لا يستبدل kube-proxy؛ إعداد kube-proxy replacement معطّل.
سياسة application-traffic تختار تطبيقَي Go وNode في namespace default. تسمح بالدخول من namespaces محددة على منافذ التطبيقات، وتسمح بالخروج إلى DNS وإلى التطبيقين على المنافذ المطلوبة. السياسة محددة النطاق؛ لا تعتبر جدارًا ناريًا لكل موارد الكلاستر.
kubectl get networkpolicy -A
kubectl -n kube-system get pods -l k8s-app=cilium
kubectl -n default get pods --show-labels
وقت التحقيق، قارن labels التي تختار الـPods، ومصدر الاتصال، والمنفذ، وراجع Hubble عند الحاجة. لو الخدمة لا تصل للتطبيق، افحص endpoints أولًا؛ بعدها policy وCilium flow.
NetworkPolicy من غير اختبار اتصال مسموح ومرفوض قد تمنع DNS أو scrape بالخطأ. سجّل الاختبارين قبل اعتبار السياسة سليمة.
٥. الشبكة والدخول للتطبيق
عنوان MetalLB 66.11.126.179 عنوان خدمة دخول مشترك؛ ليس عنوان Node. Traefik يستقبل على هذا العنوان ويوجه حسب hostname مثل go.murabba.net. الشهادة يطلبها cert-manager من Let's Encrypt، ثم Traefik ينهي اتصال TLS ويوصل HTTP للخدمة الداخلية.
المتصفح→ HTTPSMetalLB VIP→Traefik→Service→Pod
Cilium يوفر شبكة الـPods وسياسات الشبكة. VXLAN ينقل حركة الـPods بين العُقد. NetworkPolicy تسمح أو تمنع الاتصال وفق المصدر والوجهة والمنفذ.
لما رابط يقع: افحص DNS أولًا، بعده عنوان LoadBalancer، ثم Ingress/IngressRoute والشهادة، ثم Service وEndpoints وPods.
٦. التخزين: PVC وLonghorn والنسخ الاحتياطي
الـcontainer ممكن يتبدل؛ الملفات داخله ليست مكانًا دائمًا لبيانات التطبيق. التطبيق يطلب مساحة عبر PVC. StorageClass يحدد طريقة إنشاء المساحة، وLonghorn يربطها بقرص دائم موزع على عُقد الكلاستر.
PVالمساحة الفعلية التي وفرها نظام التخزين.
PVCطلب التطبيق لمساحة بحجم ووضع وصول محددين.
Replicaنسخة من بيانات volume على عقدة أخرى؛ تساعد عند تعطل عقدة، لكنها تظل داخل نفس بيئة الكلاستر.
Backupنسخة خارج الكلاستر على SMB/CIFS، مع جدول يومي واحتفاظ بآخر سبع نسخ.
اختبار الاستعادة يعني استرجاع نسخة إلى volume منفصل، ثم فحص محتواها. وجود backup job وحده لا يثبت إن الاستعادة سليمة. نسخة etcd تحمي حالة Kubernetes، أما Longhorn فيحمي بيانات PVC؛ كل واحد يغطي شيئًا مختلفًا.
kubectl get pvc -A
kubectl -n longhorn-system get volumes.longhorn.io
kubectl -n longhorn-system get recurringjobs.longhorn.io
التطبيق لا يرسل كل مقياس إلى Prometheus بنفسه. Prometheus يكتشف الهدف من ServiceMonitor، ويتصل بعنوان الخدمة ويقرأ metrics دوريًا. قواعد Prometheus تراقب المقاييس، وAlertmanager يرسل التنبيه إذا تحققت شروط القاعدة.
لو ظهر TargetDown اسأل بالترتيب: هل الـPods Ready؟ هل الخدمة لها endpoints؟ هل الـServiceMonitor يطابق labels المطلوبة؟ هل المنفذ والمسار صحيحان؟ وهل NetworkPolicy تسمح بالاتصال؟
kubectl -n default get servicemonitor
kubectl -n default get svc,endpointslices
kubectl -n monitoring get pods
HTTP 200 على التطبيق لا يثبت أن Prometheus يسحبه. افحص Targets نفسها، واستخدم Basic Auth عند التحقق من endpoint المحمي.
٧. المراقبة والتنبيه
التطبيقان يعرضان health وmetrics. Prometheus يقرأ metrics عبر ServiceMonitor، ويقيّم قواعد التنبيه. Alertmanager يرسل التنبيه إلى الوجهة المضبوطة. Grafana تعرض الرسوم والـdashboards.
لو ظهر TargetDown، فالمعنى إن Prometheus لم ينجح في scrape هدف خلال المدة المحددة. افحص حالة الـPod ثم Service وServiceMonitor والـEndpoint والمنفذ والسياسات. التنبيه دليل يحتاج تحقيق، وليس تشخيصًا نهائيًا.
ما الذي يثبته فحص HTTP 200؟
يثبت فقط أن مسار health رجع نجاحًا من نقطة الاختبار. لا يثبت وحده سلامة التخزين، أو أن كل Prometheus targets تعمل، أو أن الاستعادة مجربة.
٨. التشغيل اليومي والتصحيح
ابدأ من الحالة العامة، ثم ضيّق نطاق المشكلة. لا تغيّر عدة طبقات مرة واحدة.
kubectl get nodes
kubectl get pods -A -o wide
kubectl -n argocd get applications
kubectl get events -A --sort-by=.lastTimestamp
kubectl -n default describe pod <pod-name>
kubectl -n default logs deploy/<deployment-name>
لو الـPod في Pending افحص الموارد والـPVC والقيود. لو CrashLoopBackOff افحص logs وسبب الخروج. لو كل شيء Ready والرابط لا يفتح، راجع DNS وTraefik وTLS والـService endpoints.
قبل أي ترقية: راجع توافق Kubernetes وCNI والتخزين، حدّث minor version واحدة في المرة، وتأكد من PVC والـvolumes وحالة etcd. المشروع معمل تدريبي، لكن خطوات الفحص نفسها مهمة للتعلم.
السكربتات: متى أستخدم كل واحد؟
validate-platform.shفحص تناسق قيم العقد والعناوين والسياسات والتوفر بين ملفات المنصة.
render-platform.shيستخدم Helm لتوليد manifests محليًا وتجهيز CRD schemas كي يستطيع kubeconform فحص أنواع الموارد الممتدة.
check-deployment.shفحص بعد النشر للـhealth والـmetrics وPrometheus targets عبر المسارات المضبوطة.
bootstrap-node.shتهيئة Ubuntu VM الجديدة بمتطلبات Kubernetes وعنوانها المحلي. الانضمام يحتاج kubeadm token منفصل قصير العمر.
prepare-storage-node.shيتحقق من قرص Longhorn المخصص قبل تهيئته لـ/var/lib/longhorn. لا يستخدم على قرص فيه بيانات.
use-local-control-plane-api.shيجعل kubelet يستخدم API server المحلي على العقدة المختارة؛ يحتاج عنوان العقدة الصحيح.
export-*-schema.shتجلب schemas لأنواع Kubernetes وCRDs لاستخدامها في الفحص المحلي والـCI.
كل سكربت له مدخلات وافتراضات. اقرأه قبل التنفيذ، خصوصًا سكربتات تجهيز الأقراص أو تغيير اتصال kubelet.
الأمان في التطبيق والـCI
إعدادات Helm تضبط الحاويات بحيث تعمل كمستخدم غير root، تمنع تصعيد الصلاحيات، تجعل root filesystem للقراءة فقط، وتسقط Linux capabilities غير اللازمة. كما تحدد requests وlimits حتى لا يستهلك التطبيق موارد بلا حدود.
في GitHub Actions، Trivy يفحص صور التطبيق بحثًا عن ثغرات عالية وخطيرة، ويفحص إعدادات IaC. Gitleaks يبحث عن أسرار مكشوفة في Git. إثبات provenance يربط صورة الـRegistry بعملية البناء ومصدرها.
Sealed Secrets يسمح بحفظ نسخة مشفرة من بيانات Secret في Git. pub-cert.pem شهادة عامة للتشفير؛ المفتاح الخاص داخل الكلاستر هو الذي يفك التشفير. لو اتسربت كلمة مرور، دوّرها أولًا في النظام الذي يستخدمها، وحدّث النسخة المشفرة وسر GitHub Actions إن كان يستخدمها، ثم افحص الوصول. حذف القيمة من commit لا يلغي تسريبها.
kubeseal --cert pub-cert.pem --format yaml
kubectl get sealedsecrets -A
kubectl get secrets -A
لا تطبع قيمة Secret في الطرفية أو فيديو أو سجل CI. افحص وجوده ونوعه وحالة المورد، ولا تعرض محتواه.
٩. الأسرار والوصول
القيم الحساسة لا توضع كنص واضح في Git. Sealed Secrets يحول Kubernetes Secret إلى ملف مشفّر يمكن حفظه في المستودع؛ المتحكم داخل الكلاستر يفكّه بالمفتاح الخاص الذي لا يخرج منه. الشهادة العامة pub-cert.pem تستخدم للتشفير، وليست المفتاح الخاص.
أقل صلاحية لازمة، تدوير كلمات المرور، فحص صور الحاويات، وصحة صلاحيات GitHub Actions كلها أجزاء من الحماية. Basic Auth الخاص بـPrometheus يضيف حاجز دخول، لكنه لا يعوض إدارة الشبكة أو تحديث المكونات.
١٠. قاموس سريع
CIفحوصات وبناء تلقائي عند تغيير الكود.
CD / GitOpsتطبيق الحالة الموصوفة في Git على بيئة التشغيل.
Registryمكان نشر وسحب صور الحاويات.
Reconciliationمقارنة الحالة الحالية بالمطلوبة ومحاولة إزالة الفرق.
Ingressقواعد دخول HTTP/HTTPS من خارج الكلاستر.
HPAيزيد أو يقلل عدد النسخ بناءً على مؤشرات مثل CPU.
PDBيحدد الحد الأدنى من النسخ المتاحة أثناء الإخلاء المنظم.
Provenanceدليل يربط الـartifact بعملية البناء ومصدرها.
أسئلة مقابلة ومراجعة
جاوب بصوتك قبل ما تفتح الإجابة. اشرح السبب، ثم قل أين ستتحقق من الكلام في الملفات أو الكلاستر.
١. مين يبني صورة Node.js ومين يطلب تشغيلها؟
٢. لو الـPod اتبدل، إزاي بيانات PVC تفضل موجودة؟
٣. هل ثلاث replicas تساوي ثلاث backups؟
٤. مين المالك: Terraform ولا Argo CD؟
٥. ما خطوات تشخيص رابط لا يعمل؟
أسئلة أعمق للمراجعة
١. ما الذي يحفظه etcd، وكم عضوًا نحتاج من ثلاثة؟
يحفظ حالة Kubernetes. يحتاج الكلاستر أغلبية الأعضاء، أي اثنين من ثلاثة، ليستمر etcd في قبول التغييرات.
٢. ما الفرق بين readiness وliveness؟
Readiness تمنع إرسال طلبات إلى نسخة غير جاهزة. Liveness تكشف عملية عالقة وتسمح بإعادة تشغيل الحاوية. فشل readiness وحده لا يعني أن الحاوية ستُعاد.
٣. Actions نجحت وArgo CD Unhealthy؛ هل هذا تناقض؟
لا. Actions تختبر البناء والصورة قبل النشر. صحة التطبيق داخل الكلاستر تحتاج rollout وreadiness وموارد الشبكة بعد ذلك.
٤. ما أول ما أفحصه في Service بلا endpoints؟
قارن selector الخاص بالـService مع labels على الـPods، وتأكد أن الـPods Ready وأن targetPort يطابق المنفذ المسمى في الحاوية.
٥. هل replicas الثلاثة تحمي من فقدان كل بيانات الكلاستر؟
لا. Longhorn replicas تساعد عند تعطل عقدة، لكنها داخل الكلاستر. نسخة SMB خارج الكلاستر واختبار استعادتها يغطيان خطرًا مختلفًا.
٦. لماذا لا نشغل Terraform apply بعد clone جديد مباشرة؟
لأن Terraform يحتاج state يربط الملفات بالموارد الموجودة. استرجع state أو استورد الموارد ثم راجع plan؛ state فارغ قد يقترح إنشاء موارد موجودة أصلًا.
٧. ماذا يعني TargetDown إذا كان رابط Grafana يفتح؟
يعني أن Prometheus لم ينجح في scrape هدف معين. Grafana واجهة عرض؛ لا تثبت أن target صحي. افحص Pod وService وEndpoints وServiceMonitor والمنفذ والسياسة.
٨. ما الذي يثبت أن النسخة الاحتياطية قابلة للاستخدام؟
النسخة موجودة على الهدف الخارجي، ثم استعادتها إلى volume منفصل والتحقق من الملفات وتشغيل التطبيق عليها عند الحاجة.
٩. هل يكفي تحديث SealedSecret لوحده عند تدوير كلمة مرور؟
لا إذا كانت جهات أخرى تستخدم القيمة. حدّث السر في الكلاستر، وأي GitHub Actions secret مرتبط، ثم اختبر الخدمة التي تعتمد عليه.
١٠. ما الذي يفعله HPA في إعداد Node.js الحالي؟
يستهدف CPU عند 70% ويغير عدد النسخ بين 3 و6. الحد الأدنى لا يسمح له بالنزول عن ثلاث نسخ.
١١. لماذا عنوان 66.11.126.179 ليس عنوان Node؟
هو عنوان LoadBalancer تعلنه MetalLB لخدمة Traefik. أسماء الدومين تصل إلى هذا العنوان، ثم يختار Traefik الخدمة حسب اسم المضيف.
١٢. ما الفرق بين شهادة Sealed Secrets العامة والمفتاح الخاص؟
العام يُستخدم لتشفير Secret قبل وضعه في Git. المفتاح الخاص داخل controller في الكلاستر ويفك التشفير؛ لا تخرجه أو تحفظه في الريبو.
١٢. نص فيديو افتتاحي (دقيقتان)
«في المشروع ده هوريكم إزاي تغيير صغير في كود تطبيق بيوصل لحد ما يبقى شغال على Kubernetes. عندنا تطبيق Go وتطبيق Node.js على كلاستر من ثلاث عُقد. أول ما أرفع التغيير، GitHub Actions يبني صورة ويفحصها. بعد نجاح البناء يتسجل tag الصورة في إعدادات Helm داخل Git. Argo CD يتابع Git ويطبّق الحالة على الكلاستر. Kubernetes يحدّث النسخ، وTraefik يستقبل الزيارات الخارجية. Prometheus يراقب المقاييس، وLonghorn يحافظ على بيانات الـPVC ويبعث نسخًا احتياطية إلى مساحة خارجية. في الدروس هنمشي مع كل جزء، وهنشوف أوامر الفحص وإزاي نعرف مكان المشكلة بدل ما نخمن.»
للفيديو التالي: سجّل شاشة workflow ناجحًا، ثم أظهر commit تحديث الصورة وحالة Argo CD، وبعدها افتح التطبيق ومسار health. اخفِ أي tokens أو كلمات مرور أو مفاتيح قبل التسجيل.
خطة مذاكرة عملية على ٧ جلسات
الصورة العامة: اشرح قصة المشروع وارسم مسار الطلب ومسار النشر من الذاكرة.
التطبيق: افتح Go وNode، قارن endpoints وDockerfiles، وحدد ما الذي يختبره smoke test.
البناء: اقرأ build workflow، وحدد أين تُبنى الصورة ومتى تُنشر ومتى يفشل النشر.
Helm وGitOps: غيّر قيمة في ذهنك، توقع الـmanifest الناتج، ثم اشرح دور Argo CD.
الشبكة: اتبع طلب HTTPS من DNS حتى Pod، وارسم أين ينتهي TLS.
التخزين والمراقبة: اشرح فرق PVC والنسخة والـbackup، وتتبع Alert واحد من Prometheus.
التشغيل: تدرب على قراءة حالة Pod وEvents وArgo Application، ثم اشرح خطة تصحيح مرتبة.
تمرين صغير لكل تغيير
قبل ما تغيّر أي ملف، قل: من يملكه؟ ما النتيجة المتوقعة؟ ما الاختبار الذي يثبتها؟ وكيف أرجع لو فشلت؟ بعد التنفيذ قارن التوقع بالنتيجة.
سجّل لنفسك إجابة صوتية لدقيقتين: «كيف ينتقل تغيير Node.js إلى المستخدم؟». لو احتجت تقرأ من الشاشة، ارجع للجزء الذي توقفت عنده وجرّب ثانية.
من commit إلى deployment: أظهر workflow ناجحًا ثم image tag وArgo sync.
DNS وHTTPS: تتبع hostname إلى Traefik ثم Service وPod، واشرح شهادة cert-manager.
Persistent storage: PVC وLonghorn replicas والنسخ الخارجية ثم معنى restore test.
تنبيه TargetDown: ابدأ بالهدف، افحص endpoints والسياسات، ووضح السبب والنتيجة.
كيف نجهز VM جديدة؟ اقرأ السكربتات واشرح ما الذي تفعله وما الذي يتطلب خطوة منفصلة.
في تسجيل الشاشة أخفِ الأسرار والـtokens وملفات kubeconfig. اعرض اسم المورد وحالته، وليس قيمة السر.
لو حصل عطل: ترتيب الاستجابة
حدد النطاق: تطبيق واحد، monitoring، شبكة، تخزين، أم الكلاستر كله؟
راجع آخر تغيير في Git وحالة Argo CD: هل التطبيق Synced وHealthy؟
افحص العقد والـPods والـevents قبل تعديل أي شيء.
للتطبيق افحص `describe` و`logs --previous` وimage tag وprobes والموارد وConfigMaps/Secrets.
لرابط عام افحص DNS ثم Ingress/TLS ثم Service/Endpoints ثم Pod.
إذا بدأ العطل بعد تغيير واضح، أصلح المصدر في Git أو اعمل revert للـcommit، ثم راقب Argo CD والـrollout.
بعد استعادة الخدمة، سجّل السبب والتغيير ومدة الأثر والفحص الذي اكتشف المشكلة.
kubectl get applications -n argocd
kubectl get nodes
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp
kubectl rollout status deployment/nodejs -n default
لو المشكلة في شهادة: افحص Certificate وCertificateRequest وOrder وChallenge وأحداث cert-manager، ثم DNS والـHTTP-01 route. لو مشكلة node pressure: راجع Conditions والموارد والـPods المنتظرة والـPVC.
معمل تفاعلي: رابط التطبيق بيرجع 502
الحالة:node.murabba.net فتح صفحة من Traefik تقول إن الخدمة غير متاحة. تطبيق Node موجود، لكن المستخدم مش واصل له.
اختار أول مسار فحص منطقي:
kubectl get ingress -A
kubectl -n default get svc nodejs
kubectl -n default get endpointslice -l kubernetes.io/service-name=nodejs
kubectl -n default get pods -l app.kubernetes.io/instance=nodejs -o wide
لو الـIngress موجود والـService موجود لكن لا توجد endpoints، فالمشكلة غالبًا في selector أو أن الـPods غير جاهزة. لو توجد endpoints، افحص logs والـport الذي يسمع عليه التطبيق.
معمل تفاعلي: Pod في CrashLoopBackOff
الحالة: الـDeployment يطلب 3 نسخ، وواحدة تدخل في حلقة إعادة تشغيل. ما أول دليل تجمعه؟
kubectl -n default get pods -o wide
kubectl -n default describe pod <pod-name>
kubectl -n default logs <pod-name> --previous
kubectl -n default get events --sort-by=.lastTimestamp
`--previous` مهم عندما تكون الحاوية الحالية بدأت من جديد؛ فهو يعرض سجل الحاوية التي توقفت قبلها.
استعادة البيانات: خطوات آمنة وواضحة
حدد ما الذي تريد استعادته: ملفات PVC أم حالة Kubernetes أم الاثنين.
لملفات التطبيق، حدد volume والنسخة المناسبة من Longhorn وتحقق أن النسخة ظهرت من هدف SMB/CIFS.
استعدها إلى volume منفصل للاختبار، ثم افحص الملفات والصلاحيات وشغّل التطبيق عليها عند الحاجة.
بعد التأكد، قرر كيف تربط النسخة المستعادة بالتطبيق. احتفظ بالـvolume الأصلي حتى تنتهي المقارنة.
لاسترجاع حالة control plane استخدم نسخة etcd التي تطابق إصدار Kubernetes وإجراء الاستعادة المناسب.
الـStorageClass الافتراضية تحفظ ثلاث replicas مع hard node anti-affinity وRetain. النسخ اليومية الخارجية تحتفظ بآخر سبع نسخ لكل volume. اتصال SMB 3.1.1 مشفر أثناء النقل، لكن تشفير التخزين على خادم النسخ الاحتياطي غير مثبت؛ لذلك لا تفترض أن البيانات مشفرة وهي ساكنة.
نجاح جدولة النسخة يثبت أن job اشتغلت. نجاح restore إلى volume منفصل وفحص الملفات هو الدليل العملي على قابلية الاستعادة.
kubectl get pvc -A
kubectl -n longhorn-system get recurringjobs.longhorn.io
kubectl -n longhorn-system get volumes.longhorn.io
معمل تفاعلي: هل عندي نسخة احتياطية أقدر أرجعها؟
الحالة: volume عليه ثلاث replicas، وعقدة Kubernetes تعطلت. هل ده يثبت إن عندك backup خارجي صالح؟
kubectl -n longhorn-system get recurringjobs.longhorn.io
kubectl -n longhorn-system get backups.longhorn.io
kubectl get pvc -A
قبل استعادة بيانات تطبيق: حدد الـPVC الصحيح، راجع حجم النسخة وتاريخها، استعد إلى volume منفصل، افحص الملفات، وبعدها قرر كيف تربطه بالتطبيق. لا تخلط ملفات التطبيق مع etcd snapshot؛ كل نسخة تغطي طبقة مختلفة.
مين يملك المورد؟ Terraform أم Argo CD؟
قاعدة التشغيل هنا: لكل مورد مصدر ملكية واحد واضح. Terraform يدير مجموعة مختارة من إصدارات المنصة، بينما Argo CD يدير التطبيقات والموارد الموجودة تحت تطبيقاته.
Terraformيتابع الموارد التي أُدخلت في state. قبل plan/apply على موارد موجودة، استرجع state أو استورد المورد ثم راجع الخطة كاملة.
Argo CDيقرأ Git ويزامن الموارد المحددة في Application. self-heal يعيد الموارد إلى الحالة المكتوبة في المصدر.
Sealed Secretsملف SealedSecret مشفر في Git، والمتحكم يستخدم المفتاح الخاص داخل الكلاستر لإنشاء Kubernetes Secret.
لو غيرت حقلًا يدويًا في مورد يملكه Argo CD، غالبًا سترى فرقًا وقد يرجع Argo CD القيمة. لو عدّلت إصدار Helm يملكه Terraform، راجع Terraform state والخطة. اسأل «مين المالك؟» قبل «أي أمر أشغّل؟».
قائمة تدريب تحفظ تقدمك على جهازك
علّم الخطوات التي نفذتها بنفسك. التقدم يُحفظ في المتصفح على نفس الجهاز.
0 من 8 مكتمل
لما تخلصهم، سجل شرحًا من 5 دقائق. أي نقطة تتوه فيها ارجع للدرس الخاص بها ثم أعد الشرح من البداية.
تمرين: Pod عالق في Pending
الموقف: نسخة جديدة لا تبدأ، وحالتها Pending. اختر أول دليل:
kubectl -n default describe pod <pod-name>
kubectl describe nodes
kubectl get pvc -A
تمرين: شهادة HTTPS لم تصبح Ready
الموقف: Ingress موجود، لكن المتصفح يحذر من الشهادة أو Certificate ما زالت غير جاهزة.
kubectl get certificate,certificaterequest,order,challenge -A
kubectl describe certificate <name> -n <namespace>
kubectl -n cert-manager get events --sort-by=.lastTimestamp
تمرين: TargetDown في Prometheus
الموقف: تنبيه يقول إن هدف Longhorn أو التطبيق Down. اختر فحصًا يحدد أين انقطع مسار الـscrape:
تمرين: التطبيق Unhealthy بعد ترقية صورة
الموقف: Actions نجحت، لكن Argo CD يعرض التطبيق Unhealthy بعد الترقية. ما الخطوة المناسبة؟
اختبار ختامي: هل تقدر تشرح المنصة؟
اختار إجابة لكل سؤال من غير ما ترجع للدروس. النتيجة بتتحسب في المتصفح على جهازك، ومش بتتبعت لأي مكان.
١. بعد تغيير كود Node.js، مين يبني الصورة ومين يطلب تشغيلها؟
٢. لو smoke test فشل قبل نشر الصورة، ماذا تتوقع؟
٣. ما حدود HPA لتطبيق Node.js حسب الإعداد الحالي؟
٤. ما وظيفة 66.11.126.179 هنا؟
٥. هل Longhorn replicas الثلاثة تعتبر نسخة خارجية؟
٦. ظهر TargetDown، ما أول مسار فحص منطقي؟
٧. كم عضوًا من etcd الثلاثة نحتاج لاستمرار الـquorum؟
٨. لماذا نحتاج Terraform state قبل plan على بنية موجودة؟
٩. ما الفرق بين شهادة Sealed Secrets العامة والمفتاح الخاص؟
١٠. Service بلا Endpoints؛ ماذا تفحص أولًا؟
تدريب الشرح بصوتك
بعد الاختبار، سجل إجابة قصيرة لكل سؤال. اعتبر نفسك جاهزًا لما تشرح كل نقطة بطريقتك وتعرف الأمر أو الملف الذي يثبتها.
ارسم الطلب من اسم النطاق حتى Pod.
احكِ رحلة commit إلى صورة جديدة ثم Argo CD rollout.
اشرح الفرق بين PVC replica وbackup، ثم خطوات تجربة الاستعادة.
حلّل تنبيه TargetDown بخطوات تحقق، من غير ما تبدأ بإعادة التشغيل.