مقدمة: لماذا Kubernetes لتطبيقات Node.js؟
تتطلب تطبيقات الويب الحديثة المكتوبة بلغة JavaScript (Node.js) توفرًا عاليًا وقابلية للتوسع وتحمل الأخطاء. عندما ينمو تطبيقك ليتجاوز خادمًا واحدًا، تصبح الإدارة اليدوية كابوسًا. هنا يأتي Kubernetes (K8s) للإنقاذ — وهو نظام تنسيق الحاويات الذي يعمل على أتمتة نشر التطبيقات وتوسيع نطاقها وإدارتها.
في هذا الدليل، سنخوض الرحلة الكاملة: من تطبيق Node.js بسيط إلى تشغيله في بيئة شبيهة بالإنتاج على Kubernetes. ستتعلم كيفية حزم الكود الخاص بك في صورة Docker، وإنشاء موارد K8s الضرورية (Pod و Deployment و Service)، وتكوين الوصول الخارجي.
1. تحضير تطبيق Node.js
أولاً، لنقم بإنشاء تطبيق Express بسيط. سوف يستجيب لطلبات HTTP ويعرض اسم المضيف للحاوية (مفيد للتحقق من موازنة التحميل).
1.1. ملف app.js
const express = require('express');const os = require('os');
const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ message: 'Hello from Node.js on Kubernetes!', hostname: os.hostname(), timestamp: new Date().toISOString() });});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});1.2. ملف package.json
{ "name": "k8s-node-app", "version": "1.0.0", "dependencies": { "express": "^4.18.2" }, "scripts": { "start": "node app.js" }}2. الحاويات: صورة Docker
يعمل Kubernetes مع الحاويات. دعنا ننشئ Dockerfile صغيرًا لتطبيق Node.js الخاص بنا. سنستخدم صورة Node.js الرسمية والبناء متعدد المراحل لتحسين الحجم.
2.1. Dockerfile
FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=production
FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/node_modules ./node_modulesCOPY . .EXPOSE 3000CMD ["node", "app.js"]قم ببناء الصورة ودفعها إلى Docker Hub أو أي سجل آخر:
docker build -t your-dockerhub/k8s-node-app:v1 .docker push your-dockerhub/k8s-node-app:v13. النشر على Kubernetes
الآن دعنا ننتقل إلى الجزء الرئيسي — إنشاء موارد Kubernetes. سنستخدم Deployment (لإدارة Pods) و Service (للوصول عبر الشبكة).
3.1. إنشاء Deployment
يضمن Deployment أن العدد المطلوب من Pods مع تطبيقك يعمل دائمًا. قم بإنشاء ملف deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: node-app-deployment labels: app: node-appspec: replicas: 3 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: your-dockerhub/k8s-node-app:v1 ports: - containerPort: 3000 env: - name: PORT value: "3000" resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"3.2. إنشاء Service
يوفر Service عنوان IP ثابتًا واسم DNS للوصول إلى Pods. قم بإنشاء service.yaml:
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP port: 80 targetPort: 3000 type: ClusterIP3.3. التشغيل على المجموعة
قم بتنفيذ الأوامر (تأكد من أن لديك kubectl مهيأ وإمكانية الوصول إلى المجموعة):
kubectl apply -f deployment.yamlkubectl app