نشر تطبيق C# على Kubernetes: دليل عملي لمطوري .NET
\n\nالتطوير الحديث باستخدام C# (.NET) يتطلب بشكل متزايد ليس فقط كتابة كود عالي الجودة، ولكن أيضًا القدرة على نشر التطبيق بشكل صحيح في بيئة الإنتاج. أصبح Kubernetes (K8s) المعيار الفعلي لتنسيق الحاويات. في هذه المقالة، سنستعرض عملية نشر تطبيق C# على Kubernetes خطوة بخطوة - بدءًا من الحاويات وصولاً إلى إعداد Ingress.
\n\n1. تحضير تطبيق .NET وصورة Docker
\n\nقبل الوصول إلى Kubernetes، يجب حزم تطبيق C# الخاص بك في صورة Docker. لننظر في مثال بسيط لـ ASP.NET Core Web API.
\n\nأنشئ المشروع:
\ndotnet new webapi -n MyK8sApp\ncd MyK8sApp\n\nأضف endpoint بسيط (ملف Program.cs):
var builder = WebApplication.CreateBuilder(args);\nvar app = builder.Build();\n\napp.MapGet("/", () => "Hello from C# on Kubernetes!");\n\napp.Run();\n\nالآن لننشئ Dockerfile في جذر المشروع:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base\nWORKDIR /app\nEXPOSE 8080\n\nFROM mcr.microsoft.com/dotnet/sdk:8.0 AS build\nWORKDIR /src\nCOPY ["MyK8sApp.csproj", "."]\nRUN dotnet restore\nCOPY . .\nRUN dotnet publish -c Release -o /app/publish\n\nFROM base AS final\nWORKDIR /app\nCOPY --from=build /app/publish .\nENTRYPOINT ["dotnet", "MyK8sApp.dll"]\n\nقم ببناء الصورة ودفعها إلى Docker Hub أو سجل محلي:
\ndocker build -t yourdockerhub/my-k8s-app:v1 .\ndocker push yourdockerhub/my-k8s-app:v1\n\nهام: في ASP.NET Core 8+، يستمع التطبيق افتراضيًا على المنفذ 8080، وهو مثالي لـ Kubernetes.
\n\n2. ملفات YAML الأساسية لـ Kubernetes
\n\nيدير Kubernetes الموارد من خلال ملفات YAML. لتشغيل تطبيق C#، سنحتاج على الأقل إلى Deployment و Service.
\n\n2.1. Deployment (deployment.yaml)
\nيتولى Deployment الحفاظ على العدد المطلوب من نسخ Pod.
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: my-k8s-app-deployment\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: my-k8s-app\n template:\n metadata:\n labels:\n app: my-k8s-app\n spec:\n containers:\n - name: my-k8s-app\n image: yourdockerhub/my-k8s-app:v1\n ports:\n - containerPort: 8080\n resources:\n requests:\n memory: "64Mi"\n cpu: "250m"\n limits:\n memory: "128Mi"\n cpu: "500m"\n livenessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n\nالنقاط الرئيسية:
\n- \n
replicas: 3— 3 نسخ من التطبيق \n livenessProbe— فحص الصحة (يوصى بإضافة endpoint/healthفي C#) \n - الموارد
requests/limitsتساعد جدولة K8s \n
2.2. Service (service.yaml)
\nيوفر Service نقطة دخول ثابتة إلى Pods.
\napiVersion: v1\nkind: Service\nmetadata:\n name: my-k8s-app-service\nspec:\n selector:\n app: my-k8s-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n type: ClusterIP\n\nClusterIP — خدمة داخلية، يمكن الوصول إليها فقط داخل الكتلة. للوصول الخارجي نستخدم Ingress.
3. إعداد Ingress و ConfigMap
\n\n3.1. Ingress (ingress.yaml)
\nيفتح Ingress الوصول إلى الخدمة من الخارج عبر اسم النطاق.
\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-k8s-app-ingress\n annotations:\n nginx.ingress.kubernetes.io/rewrite-target: /\nspec:\n rules:\n - host: myapp.example.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n ser