نشر TypeScript على Kubernetes: دليل أساسي عملي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا 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: 5


service.yaml

apiVersion: v1kind: Servicemetadata:  name: ts-app-servicespec:  selector:    app                

المدونات

توصيات الكتب