مقدمة: لماذا يعتبر C# و Kubernetes مزيجًا قويًا
\n\nالتطوير الحديث يتطلب بشكل متزايد ليس فقط كتابة الكود، ولكن أيضًا تعبئته بشكل صحيح وتشغيله في بيئة سحابية. Kubernetes (أو K8s) أصبح المعيار الفعلي لتنسيق الحاويات، و C# (.NET) واحد من أكثر اللغات شيوعًا لإنشاء تطبيقات الويب عالية التحميل والخدمات المصغرة.
\n\nفي هذا الدليل، سننتقل من تطبيق C# جاهز إلى نشره بالكامل في مجموعة Kubernetes. ستتعلم كيفية إنشاء صورة Docker، وكتابة مانيفستات النشر والخدمة، ثم تشغيل كل شيء باستخدام kubectl. لا سحر — فقط ممارسة عملية.
الخطوة 1: تحضير تطبيق .NET والحاويات
\n\n1.1 إنشاء واجهة برمجة تطبيقات ويب بسيطة بلغة C#
\n\nللتجربة، سنقوم بإنشاء ASP.NET Core Web API بسيط. افتح الطرفية ونفذ:
\n\ndotnet new webapi -n MyK8sApp\ncd MyK8sApp\n\nبشكل افتراضي، يحتوي المشروع بالفعل على المتحكم WeatherForecastController. تأكد من أن التطبيق يعمل محليًا:
dotnet run\n\nانتقل إلى العنوان http://localhost:5000/weatherforecast — يجب أن ترى استجابة JSON. الآن تطبيقنا جاهز للتعبئة.
1.2 إنشاء Dockerfile
\n\nالنشر على Kubernetes غير ممكن بدون الحاويات. لننشئ ملف Dockerfile في جذر المشروع:
# نستخدم الصورة الرسمية للبناء\nFROM mcr.microsoft.com/dotnet/sdk:8.0 AS build\nWORKDIR /app\n\n# ننسخ ملفات المشروع ونستعيد التبعيات\nCOPY *.csproj .\nRUN dotnet restore\n\n# ننسخ باقي الملفات ونبني التطبيق\nCOPY . .\nRUN dotnet publish -c Release -o out\n\n# الصورة النهائية — فقط بيئة التشغيل\nFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime\nWORKDIR /app\nCOPY --from=build /app/out .\nENTRYPOINT ["dotnet", "MyK8sApp.dll"]\n\nلاحظ: نستخدم البناء متعدد المراحل (multi-stage build) — وهذا يقلل الحجم النهائي للصورة ويعزز الأمان.
\n\n1.3 بناء واختبار صورة Docker
\n\nقم ببناء الصورة وتشغيلها محليًا:
\n\ndocker build -t myk8sapp:latest .\ndocker run -d -p 8080:80 --name myapp myk8sapp:latest\n\nتحقق من العمل: http://localhost:8080/weatherforecast. إذا كان كل شيء يعمل — ممتاز. أوقف الحاوية:
docker stop myapp && docker rm myapp\n\nالخطوة 2: أساسيات Kubernetes — ما تحتاج معرفته للنشر
\n\nقبل كتابة المانيفستات، دعنا نفهم المفاهيم الأساسية لـ Kubernetes:
\n\n- \n
- Pod — أصغر وحدة نشر. تحتوي على حاوية واحدة أو أكثر. \n
- Deployment — يدير حالة Pods: التوسع، التحديثات، الاسترداد بعد الأعطال. \n
- Service — تجريد يوفر وصولاً شبكيًا إلى Pods. عادةً ما يستخدم نوع
ClusterIP(داخلي) أوLoadBalancer(خارجي). \n - ConfigMap / Secret — لتخزين التكوين والبيانات الحساسة. \n
سنستخدم minikube للاختبار المحلي. قم بتثبيته وفقًا للتوجيهات الرسمية.
\n\nقم بتشغيل المجموعة:
\n\nminikube start\n\nالخطوة 3: إنشاء مانيفستات Kubernetes لتطبيق C#
\n\n3.1 مانيفست Deployment
\n\nقم بإنشاء ملف deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: myk8sapp-deployment\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: myk8sapp\n template:\n metadata:\n labels:\n app: myk8sapp\n spec:\n containers:\n - name: myk8sapp\n image: myk8sapp:latest\n imagePullPol