نشر C# على Kubernetes: دليل أساسي
أصبح Kubernetes (K8s) المعيار الفعلي لتنسيق تطبيقات الحاويات. إذا كنت تطور بلغة C# (.NET)، فسيطرح السؤال عاجلاً أم آجلاً: كيف تحزم تطبيقك وتشغله في السحابة أو على مجموعتك الخاصة. في هذا الدليل، سنستعرض الدورة الكاملة - بدءًا من إنشاء واجهة برمجة تطبيقات ويب بسيطة على ASP.NET Core وحتى نشرها على Kubernetes.
المقال موجه للمطورين الذين هم بالفعل على دراية بأساسيات C# و Docker، لكنهم بدأوا للتو العمل مع Kubernetes.
1. تحضير تطبيق .NET وصورة Docker
قبل نشر التطبيق على Kubernetes، يجب حزمه في حاوية. سننشئ واجهة برمجة تطبيقات ويب (Web API) بسيطة بلغة C#.
- أنشئ مشروعًا جديدًا:
dotnet new webapi -n MyK8sAppcd MyK8sApp - تأكد من أن التطبيق يستمع على المنفذ 80. في ملف
Program.cs(أوappsettings.json)، حدد:builder.WebHost.UseUrls("http://0.0.0.0:80"); - أنشئ ملف
Dockerfileفي جذر المشروع:FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS baseWORKDIR /appEXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /srcCOPY ["MyK8sApp.csproj", "."]RUN dotnet restore "./MyK8sApp.csproj"COPY . .RUN dotnet build "MyK8sApp.csproj" -c Release -o /app/build
FROM build AS publishRUN dotnet publish "MyK8sApp.csproj" -c Release -o /app/publish
FROM base AS finalWORKDIR /appCOPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "MyK8sApp.dll"] - قم ببناء الصورة وإرسالها إلى السجل (مثل Docker Hub):
docker build -t yourdockerhub/my-k8s-app:v1 .docker push yourdockerhub/my-k8s-app:v1
هام: استبدل yourdockerhub باسم المستخدم الفعلي. للاختبار المحلي، يمكنك استخدام minikube وعدم نشر الصورة - يكفي بناؤها محليًا.
2. إنشاء ملفات تعريف Kubernetes (Manifests)
يستخدم Kubernetes ملفات YAML التصريحية لوصف الحالة المرغوبة للمجموعة. سنحتاج إلى كائنين رئيسيين: Deployment (إدارة البود) و Service (الوصول الشبكي).
2.1. Deployment (النشر)
أنشئ ملف deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: my-k8s-app-deployment labels: app: my-k8s-appspec: replicas: 2 selector: matchLabels: app: my-k8s-app template: metadata: labels: app: my-k8s-app spec: containers: - name: my-k8s-app image: yourdockerhub/my-k8s-app:v1 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" livenessProbe: httpGet: path: /health port: 80 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 80 initialDelaySeconds: 3 periodSeconds: 5في هذا الملف التعريفي، نحدد:
- replicas: 2 — نسختان من التطبيق لتحمل الأخطاء.
- resources — قيود على CPU والذاكرة (مهم لاستقرار عمل المجموعة).
- livenessProbe و readinessProbe — فحوصات الصحة. أضف نقاط النهاية
/healthو/readyإلى المتحكم (Controller) الخاص بك.
2.2. Service (الخدمة)
أنشئ ملف service.yaml:
apiVersion: v1kind: Servicemetadata: name: my-k8s-app-servicespec: selecto