مقدمة: لماذا نشر JavaScript على Kubernetes؟
\n\nتطوير الويب الحديث لا يمكن تصوره بدون الحاويات. إذا كنت تكتب بلغة JavaScript (Node.js) وتريد أن يعمل تطبيقك بثبات، ويتوسع تلقائيًا، ويكون مقاومًا للأعطال — فإن Kubernetes (K8s) سيكون أفضل صديق لك.
\n\nKubernetes هي منصة لتنسيق الحاويات. تدير نشر تطبيقاتك وتوسيعها وتشغيلها. في هذا الدليل، سنشرح النشر الأساسي لتطبيق Node.js بسيط على Kubernetes. ستتعلم كيفية حزم الكود في صورة Docker، وإنشاء Pod، وService، وDeployment.
\n\nالمقالة موجهة للمبتدئين. يُفترض أنك قمت بالفعل بتثبيت Docker وMinikube (أو لديك إمكانية الوصول إلى مجموعة K8s).
\n\nالخطوة 1: إعداد تطبيق Node.js وصورة Docker
\n\nأولاً، سننشئ تطبيق ويب بسيطًا باستخدام Express. سوف يستجيب لطلبات HTTP.
\n\n1.1. كود التطبيق (app.js)
\n\nأنشئ ملف app.js:
const express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req, res) => {\n res.send('مرحبًا من Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`الخادم يعمل على المنفذ ${PORT}`);\n});\n\n\n1.2. ملف package.json
\n\nأنشئ package.json:
{\n "name": "k8s-node-app",\n "version": "1.0.0",\n "main": "app.js",\n "scripts": {\n "start": "node app.js"\n },\n "dependencies": {\n "express": "^4.18.2"\n }\n}\n\n\n1.3. ملف Dockerfile
\n\nالآن سننشئ Dockerfile لبناء الصورة:
FROM node:18-alpine\n\nWORKDIR /usr/src/app\n\nCOPY package*.json ./\nRUN npm install\n\nCOPY . .\n\nEXPOSE 3000\n\nCMD ["node", "app.js"]\n\n\n1.4. بناء الصورة وتحميلها
\n\nنفذ الأوامر التالية:
\n\ndocker build -t my-node-app:v1 .\n\n\nإذا كنت تستخدم Minikube، قم ببناء الصورة داخل بيئته:
\n\nminikube image build -t my-node-app:v1 .\n\n\nأو قم بتحميل الصورة إلى Docker Hub/أي سجل وحددها في المانيفست.
\n\nالخطوة 2: كائنات Kubernetes الأساسية (Pod، Deployment، Service)
\n\nيعمل Kubernetes مع الكائنات. للنشر، سنحتاج إلى ثلاثة كائنات أساسية:
\n\n- \n
- Pod — الوحدة الأصغر، حاوية واحدة أو أكثر. \n
- Deployment — يدير Pods، ويوفر التوسع والتحديثات. \n
- Service — نقطة وصول ثابتة إلى Pods (عادةً عبر ClusterIP أو NodePort). \n
2.1. إنشاء Deployment
\n\nأنشئ ملف deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: node-app-deployment\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: node-app\n template:\n metadata:\n labels:\n app: node-app\n spec:\n containers:\n - name: node-app\n image: my-node-app:v1\n ports:\n - containerPort: 3000\n env:\n - name: PORT\n value: "3000"\n\n\nالشرح:
\n- \n
replicas: 3— سنشغل 3 نسخ من التطبيق لتحمل الأعطال. \n selectorوlabels— يربطان Deployment مع Pods. \n image— اسم صورة Docker الخاصة بك. \n
2.2. إنشاء Service
\n\nأنشئ ملف service.yaml للوصول إلى التطبيق:
apiVersion: v1\nkind: Service\nmetadata:\n name: node-app-service\nspec:\n selector:\n app: node-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 3000\n type: NodePort\n\n\nما يحدث هنا:
\n- \n
- يقوم Service بتوجيه حركة المرور من المنفذ