نشر JavaScript (Node.js) على Kubernetes: دليل أساسي عملي
تطوير الويب الحديث لا يمكن تصوره بدون الحاويات والتنسيق. إذا كنت تكتب بلغة JavaScript (Node.js)، فسيأتي الوقت عاجلاً أم آجلاً حيث يطرح السؤال: كيف تشغل التطبيق بشكل موثوق في بيئة الإنتاج، وتضمن قابلية التوسع وتحمل الأعطال؟ الإجابة هي Kubernetes. إنها ليست مجرد أداة عصرية، بل هي المعيار الفعلي لإدارة التطبيقات المعبأة في حاويات.
في هذا الدليل، سنستعرض دورة النشر الكاملة لتطبيق Node.js بسيط على Kubernetes. ستتعلم كيفية تعبئة الكود في صورة Docker، وإنشاء المانيفستات اللازمة، وتشغيل كل شيء في الكتلة. المادة موجهة للمطورين الذين هم على دراية بأساسيات Node.js ويريدون إتقان ممارسات DevOps.
1. تحضير تطبيق Node.js للحاوية
قبل نشر التطبيق على Kubernetes، يجب تعبئته في حاوية. للقيام بذلك، سننشئ تطبيق Express بسيط. تأكد من تثبيت Node.js و npm لديك.
أنشئ ملف app.js:
const express = require('express');const app = express();const port = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ message: 'Hello from Node.js on Kubernetes!' });});
app.get('/health', (req, res) => { res.status(200).send('OK');});
app.listen(port, () => { console.log(`Server running on port ${port}`);});من المهم إضافة نقطة النهاية /health — سيستخدمها Kubernetes للتحقق من قابلية التشغيل (liveness probe).
الآن، أنشئ Dockerfile في جذر المشروع:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]قم ببناء الصورة وتحقق منها محلياً:
docker build -t my-node-app:latest .docker run -p 3000:3000 my-node-app:latestافتح http://localhost:3000 — يجب أن ترى استجابة JSON.
2. مانيفستات Kubernetes الأساسية لـ Node.js
يعمل Kubernetes مع التكوينات التصريحية (YAML). لنشر تطبيق Node.js، سنحتاج إلى موردين رئيسيين على الأقل: Deployment و Service.
2.1. Deployment
يدير Deployment نسخ تطبيقك. أنشئ ملف 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: my-node-app:latest ports: - containerPort: 3000 env: - name: PORT value: "3000" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: / port: 3000 initialDelaySeconds: 3 periodSeconds: 5نقاط مهمة:
replicas: 3— سينشئ Kubernetes 3 نسخ من تطبيقك لتحمل الأعطال.livenessProbe— يتحقق مما إذا كان التطبيق حياً. إذا لم تكن هناك استجابة، سيعيد Kubernetes تشغيل الحاوية.readinessProbe— يتحقق مما إذا كان التطبيق جاهزاً لاستقبال الحركة المرورية. طالما لم ينجح الفحص، لا تتلقى الحاوية الطلبات.
2.2. Service
يوفر Service الوصول الشبكي إلى الحاويات. أنشئ service.yaml:
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP