مقدمة: لماذا TypeScript و Kubernetes زوج مثالي
تطوير الويب الحديث لا يمكن تصوره بدون شيئين: الكتابة الثابتة والبنية التحتية القابلة للتوسع. TypeScript يوفر موثوقية الكود في مرحلة التجميع، و Kubernetes (K8s) يوفر إدارة تلقائية للحاويات، وتوازن الحمل، والشفاء الذاتي. في هذا الدليل، سنمر بالمسار الكامل من تطبيق TypeScript بسيط إلى تشغيله في مجموعة Kubernetes. ستتعلم كيفية حزم الكود في صورة Docker، وكتابة ملفات البيان، ونشر خدمة جاهزة للإنتاج.
الخطوة 1: تحضير تطبيق TypeScript للحاويات
قبل التفكير في Kubernetes، يجب التأكد من أن تطبيقك جاهز للتشغيل في حاوية. سننشئ تطبيق Express بسيطًا على TypeScript. تأكد من وجود package.json و tsconfig.json ونقطة الدخول src/index.ts في جذر المشروع.
// src/index.tsimport express, { Request, Response } from 'express';
const app = express();const PORT = process.env.PORT || 3000;
app.get('/health', (_req: Request, res: Response) => { res.json({ status: 'ok', timestamp: new Date().toISOString() });});
app.get('/', (_req: Request, res: Response) => { res.send('Hello from TypeScript on Kubernetes!');});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});ملاحظة مهمة: في الإنتاج، لا نستخدم ts-node. لذلك، أضف سكريبت البناء في package.json:
"scripts": { "build": "tsc", "start": "node dist/index.js"}بعد تنفيذ npm run build، سيظهر مجلد dist يحتوي على JavaScript المترجم. هذا المجلد سنقوم بنسخه إلى صورة Docker.
الخطوة 2: إنشاء صورة Docker بحجم أدنى
لنشر الإنتاج، حجم الصورة مهم جدًا. سنستخدم بناء متعدد المراحل: أولاً نترجم TypeScript في حاوية مع SDK كامل، ثم ننسخ النتيجة إلى صورة خفيفة مبنية على node:18-alpine.
# Dockerfile# المرحلة 1: البناءFROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=productionCOPY tsconfig.json ./COPY src/ ./src/RUN npm run build
# المرحلة 2: الإنتاجFROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesEXPOSE 3000CMD ["node", "dist/index.js"]قم ببناء الصورة واختبرها محليًا:
docker build -t my-ts-app:latest .docker run -p 3000:3000 my-ts-app:latestافتح http://localhost:3000 — يجب أن ترى رسالة الترحيب.
الخطوة 3: ملفات بيان Kubernetes — Deployment و Service
الآن سننقل صورتنا إلى المجموعة. لهذا، نحتاج إلى ملفي بيان أساسيين: Deployment (يدير النسخ المكررة والتحديثات) و Service (يوفر الوصول الشبكي).
deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: ts-app-deploymentspec: replicas: 2 selector: matchLabels: app: ts-app template: metadata: labels: app: ts-app spec: containers: - name: ts-app image: my-ts-app:latest imagePullPolicy: IfNotPresent ports: - containerPort: 3000 env: - name: PORT value: "3000" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 3 periodSeconds: 5service.yaml
apiVersion: v1kind: Servicemetadata: name: ts-app-servicespec: selector: app