مقدمة: لماذا تشغيل C# في Kubernetes؟
تتطلب التطوير الحديث بلغة C# (.NET) بشكل متزايد بنية تحتية قابلة للتوسع ومتسامحة مع الأخطاء. أصبح Kubernetes (K8s) المعيار لتنسيق الحاويات، مما يسمح بأتمتة النشر والتوسع وإدارة التطبيقات. في هذا الدليل، سنوضح كيفية تحويل تطبيق C# الخاص بك إلى حاوية وتشغيله في مجموعة Kubernetes عمليًا.
ستتعلم كيفية إعداد صورة Docker، وكتابة ملفات البيان لـ Kubernetes، وتنفيذ النشر باستخدام kubectl. المقالة موجهة للمطورين الذين هم على دراية بأساسيات C# ويريدون إتقان ممارسات DevOps الحديثة.
1. تحضير تطبيق C# للحاويات
قبل نشر التطبيق في Kubernetes، يجب حزمه في صورة Docker. على سبيل المثال، سنأخذ تطبيق ASP.NET Core Web API بسيط.
1.1. إنشاء المشروع
أنشئ مشروعًا جديدًا باستخدام .NET CLI:
dotnet new webapi -n MyK8sAppcd MyK8sAppتأكد من أن التطبيق يعمل محليًا:
dotnet runسيكون التطبيق متاحًا افتراضيًا على العنوان http://localhost:5000.
1.2. إضافة Dockerfile
في جذر المشروع، أنشئ ملفًا باسم Dockerfile (بدون امتداد). استخدم البناء متعدد المراحل لتحسين حجم الصورة:
# مرحلة البناءFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /appCOPY *.csproj ./RUN dotnet restoreCOPY . ./RUN dotnet publish -c Release -o out
# مرحلة التشغيلFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --from=build /app/out ./ENV ASPNETCORE_URLS=http://+:80EXPOSE 80ENTRYPOINT ["dotnet", "MyK8sApp.dll"]1.3. بناء صورة Docker والتحقق منها
قم ببناء الصورة وتشغيلها محليًا:
docker build -t myk8sapp:latest .docker run -d -p 8080:80 --name myapp myk8sapp:latestتحقق من استجابة التطبيق: curl http://localhost:8080/weatherforecast (أو افتحه في المتصفح).
2. كتابة ملفات بيان Kubernetes
للنشر في Kubernetes، ستحتاج إلى ملفات YAML تصف الحالة المرغوبة للتطبيق. تتضمن المجموعة الدنيا Deployment و Service.
2.1. إنشاء Deployment
ملف deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: myk8sapp-deployment labels: app: myk8sappspec: replicas: 2 selector: matchLabels: app: myk8sapp template: metadata: labels: app: myk8sapp spec: containers: - name: myk8sapp image: myk8sapp:latest ports: - containerPort: 80 env: - name: ASPNETCORE_ENVIRONMENT value: "Production" resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi" cpu: "500m"هام: إذا كنت تستخدم مجموعة محلية (مثل Minikube أو Kind)، يجب أن تكون الصورة متاحة داخل المجموعة. أو حدد imagePullPolicy: Never للصور المحلية.
2.2. إنشاء Service
ملف service.yaml:
apiVersion: v1kind: Servicemetadata: name: myk8sapp-servicespec: selector: app: myk8sapp ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancerنوع LoadBalancer مناسب لمزودي الخدمات السحابية. للمجموعات المحلية، استخدم NodePort أو ClusterIP مع إعادة توجيه المنافذ عبر kubectl port-forward.
3. نشر التطبيق والتحقق منه
الآن بعد أن أصبحت ملفات البيان جاهزة، قم بتنفيذ النشر في مجموعة Kubernetes.