انطلق في ML Infrastructure Kubernetes: خطوتك الأولى الملموسة اليوم

بنية ML التحتية على Kubernetes: الأساسيات في مقال واحد — كود حقيقي، مخططات وخطوات ملموسة، مقتطفات من دورة مكونة من 41 درسًا.

انطلق في ML Infrastructure Kubernetes: خطوتك الأولى الملموسة اليوم

أفضل طريقة لتعلم ML Infrastructure Kubernetes هي بالممارسة. هذا المقال يساعدك على البدء مع مقتطفات عملية مستمدة من دورة تتكون من 41 درسًا — ما يكفي للحصول على نتيجة أولى اليوم.

tl;dr
  • تثبيت بيئة Kubernetes
  • اكتشاف Kubernetes
  • كائنات Kubernetes الأساسية
  • ملفات YAML والتكوين
  • نشر واجهة برمجة تطبيقات ML باستخدام Flask
~$ cat ./parcours.md # ML Infrastructure Kubernetes — 11 فصول
01
تثبيت بيئة Kubernetes
→ تنزيل Docker Desktop و kubectl→ تثبيت Minikube وإنشاء مجموعة+ 1 دروس أخرى
02
اكتشاف Kubernetes
→ ما هو Kubernetes ولماذا استخدامه؟→ بنية Kubernetes (Master و Workers)+ 1 دروس أخرى
03
كائنات Kubernetes الأساسية
→ Pods و ReplicaSets و Deployments→ Services و Networking+ 1 دروس أخرى
04
ملفات YAML والتكوين
→ تشريح ملف YAML لـ Kubernetes→ ConfigMaps و Secrets+ 1 دروس أخرى
05
نشر واجهة برمجة تطبيقات ML باستخدام Flask
→ تذكير Flask وإنشاء واجهة ML→ Dockerfile و Deployment على Kubernetes+ 1 دروس أخرى
06
نشر واجهة برمجة تطبيقات ML باستخدام FastAPI
→ تذكير FastAPI وإنشاء واجهة تنبؤ→ Deployment FastAPI و HPA+ 1 دروس أخرى
07
التخزين والاستمرارية
→ ما هي Volumes في Kubernetes؟→ PersistentVolumes و PersistentVolumeClaims+ 1 دروس أخرى
08
Helm وإدارة الحزم
→ لماذا Helm؟ مدير الحزم لـ Kubernetes→ تثبيت Charts وتخصيصها+ 2 دروس أخرى
🏁
المشروع النهائي (+ 3 فصول في الطريق)
→ ستخرج بمشروع ملموس وقابل للعرض

المشروع النهائي – دليل كامل خطوة بخطوة

دليل • 5 أجزاء • Backend • Frontend • Helm • Monitoring • CI/CD

NOTEتقديم — يرافقك هذا الدليل خطوة بخطوة لإنجاز المشروع النهائي. اتبع كل جزء بالترتيب لبناء منصة ML كاملة على Kubernetes.

الجزء 1 : Backend API (FastAPI + نموذج ML)

1.1 تهيئة المشروع

bash
mkdir -p ml-prediction-platform/{backend/{app,train,tests},frontend,helm,k8s/{security,monitoring},.github/workflows,docs}
cd ml-prediction-platform
git init

1.2 تدريب النموذج

output
# backend/train/train_model.py
import joblib
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=42
)

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

accuracy = accuracy_score(y_test, model.predict(X_test))
print(f"Accuracy: {accuracy:.4f}")

model_info = {
    "model": model,
    "feature_names": list(iris.feature_names),
    "target_names": list(iris.target_names),
    "accuracy": accuracy,
    "version": "1.0.0"
}
joblib.dump(model_info, "model.pkl")
bash
cd backend/train
pip install scikit-learn joblib numpy
python train_model.py

1.3 إنشاء مخططات Pydantic

output
# backend/app/schemas.py
from pydantic import BaseModel, Field
from typing import List

class PredictionRequest(BaseModel):
    features: List[float] = Field(..., min_length=4, max_length=4)
    class Config:
        json_schema_extra = {"example": {"features": [5.1, 3.5, 1.4, 0.2]}}

class PredictionResponse(BaseModel):
    prediction: str
    prediction_id: int
    confidence: float
    probabilities: dict
    model_version: str

class HealthResponse(BaseModel):
    status: str
    model_loaded: bool
    version: str

1.4 إنشاء وحدة تحميل النموذج

output
# backend/app/model.py
import os
import joblib
import numpy as np
import logging

logger = logging.getLogger(__name__)

class MLModel:
    def __init__(self):
        self.model = None
        self.feature_names = None
        self.target_names = None
        self.version = None
        self.loaded = False

    def load(self, path: str = None):
        path = path or os.getenv("MODEL_PATH", "/models/model.pkl")
        info = joblib.load(path)
        self.model = info["model"]
        self.feature_names = info["feature_names"]
        self.target_names = info["target_names"]
        self.version = info["version"]
        self.loaded = True
        logger.info(f"Model v{self.version} loaded")

    def predict(self, features: list) -> dict:
        X = np.array(features).reshape(1, -1)
        pred = self.model.predict(X)[0]
        proba = self.model.predict_proba(X)[0]
        return {
            "prediction": self.target_names[pred],
            "prediction_id": int(pred),
            "confidence": float(max(proba)),
            "probabilities": {
                n: float(p) for n, p in zip(self.target_names, proba)
            }
        }

ml_model = MLModel()

1.5 إنشاء تطبيق FastAPI

output
# backend/app/main.py
import os, time, logging
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from prometheus_client import Counter, Histogram, generate_latest
from starlette.responses import Response
from .model import ml_model
from .schemas import PredictionRequest, PredictionResponse, HealthResponse

logging.basicConfig(level=os.getenv("LOG_LEVEL", "INFO"))
app = FastAPI(title="ML Prediction API", version="1.0.0")
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])

PREDICTIONS = Counter("predictions_total", "Total predictions", ["status"])
LATENCY = Histogram("prediction_latency_seconds", "Prediction latency")

@app.on_event("startup")
async def startup():
    ml_model.load()

@app.get("/health", response_model=HealthResponse)
async def health():
    return HealthResponse(
        status="healthy" if ml_model.loaded else "unhealthy",
        model_loaded=ml_model.loaded,
        version=ml_model.version or "unknown"
    )

@app.post("/predict", response_model=PredictionResponse)
async def predict(req: PredictionRequest):
    start = time.time()
    try:
        result = ml_model.predict(req.features)
        PREDICTIONS.labels(status="success").inc()
        LATENCY.observe(time.time() - start)
        return PredictionResponse(model_version=ml_model.version, **result)
    except Exception as e:
        PREDICTIONS.labels(status="error").inc()
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/metrics")
async def metrics():
    return Response(content=generate_latest(), media_type="text/plain")

ConfigMaps و Secrets

NOTEالهدف — تعلم كيفية استخراج التكوين والبيانات الحساسة لتطبيقات ML باستخدام ConfigMaps و Secrets في Kubernetes.

الأهداف التعليمية

TIPفي نهاية هذه الوحدة — ستكون قادرًا على إتقان هذه المهارات الأساسية.

1. لماذا استخراج التكوين؟

TIPتشبيه — تخيل طباخًا يحتفظ بوصفاته (الكود) منفصلة عن المكونات (التكوين). حسب الوجبة (البيئة)، يستخدم مكونات مختلفة بنفس الوصفة. هذا بالضبط دور ConfigMaps.

في ML، تحتاج واجهة برمجة التطبيقات إلى معاملات تختلف حسب البيئة:

التطوير

الاختبار (Staging)

الإنتاج

باستخدام ConfigMaps، تغير التكوين دون إعادة بناء صورة Docker.

2. ConfigMaps: تخزين التكوين

2.1 إنشاء ConfigMap من قيم حرفية

bash
# إنشاء ConfigMap باستخدام أزواج مفتاح-قيمة
kubectl create configmap ml-config \
  --from-literal=MODEL_NAME=iris_classifier \
  --from-literal=MODEL_VERSION=v2 \
  --from-literal=LOG_LEVEL=INFO \
  --from-literal=MAX_BATCH_SIZE=32

2.2 إنشاء ConfigMap من ملف

أنشئ أولاً ملف تكوين:

output
# config.properties
model.name=iris_classifier
model.version=v2
model.threshold=0.85
api.port=5000
api.workers=4
log.level=INFO
bash
# إنشاء ConfigMap من الملف
kubectl create configmap ml-config --from-file=config.properties

# إنشاء من مجلد كامل
kubectl create configmap ml-config --from-file=./config/

2.3 ConfigMap بصيغة YAML التصريحية

output
apiVersion: v1
kind: ConfigMap
metadata:
  name: ml-config
  labels:
    app: ml-api
data:
  MODEL_NAME: "iris_classifier"
  MODEL_VERSION: "v2"
  LOG_LEVEL: "INFO"
  MAX_BATCH_SIZE: "32"
  FEATURE_COLUMNS: "sepal_length,sepal_width,petal_length,petal_width"
  config.yaml: |
    model:
      name: iris_classifier
      version: v2
      threshold: 0.85
    api:
      port: 5000
      workers: 4
NOTEمفتاح متعدد الأسطر — يسمح الرمز | بتضمين ملف كامل كقيمة لمفتاح. مفيد جدًا لملفات التكوين الكاملة.

3. استخدام ConfigMaps في Pods

3.1 كمتغيرات بيئة

output
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ml-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ml-api
  template:
    metadata:
      labels:
        app: ml-api
    spec:
      containers:
        - name: ml-api
          image: monregistry/ml-api:v1
          ports:
            - containerPort: 5000
          envFrom:
            - configMapRef:
                name: ml-config
          env:
            - name: SPECIFIC_KEY
              valueFrom:
                configMapKeyRef:
                  name: ml-config
                  key: MODEL_NAME
الطريقةالاستخدامالوصف
envFromجميع المفاتيحيحقن جميع مفاتيح ConfigMap كمتغيرات بيئة
valueFromمفتاح محدديحقن مفتاحًا واحدًا من ConfigMap في متغير مسمى

3.2 كحجم مركب

output
apiVersion: v1
kind: Pod
metadata:
  name: ml-pod-config
spec:
  containers:
    - name: ml-api
      image: monregistry/ml-api:v1
      volumeMounts:
        - name: config-volume
          mountPath: /app/config
          readOnly: true
  volumes:
    - name: config-volume
      configMap:
        name: ml-config

تشريح ملف YAML في Kubernetes

NOTEالهدف — فهم صيغة YAML وبنية manifests في Kubernetes لوصف موارد بنيتك التحتية لـ ML بطريقة تصريحية.

الأهداف التعليمية

TIPفي نهاية هذه الوحدة — ستكون قادرًا على إتقان هذه المهارات الأساسية.

1. مقدمة إلى YAML

YAML تعني « YAML Ain't Markup Language ». وهو تنسيق تسلسل بيانات قابل للقراءة من قبل البشر، ويُستخدم كثيرًا للتكوين.

TIPتشبيه — فكر في YAML كـوصفة طبخ. كل وصفة تصف المكونات (مفاتيح-قيم)، الخطوات (قوائم) والأقسام (خرائط متداخلة). يقرأ Kubernetes هذه الوصفة لـ«طهي» بنيتك التحتية.

1.1 قواعد YAML الأساسية

القاعدةالوصفمثال
المسافة البادئةمسافات فقط (لا علامات تبويب أبدًا)، عادةً مسافتان  key: value
مفتاح-قيمةمفصولة بـ: متبوعة بمسافةname: mon-pod
القوائممسبوقة بشرطة -- item1
التعليقاتتبدأ بـ## Ceci est un commentaire
السلاسل النصيةعلامات الاقتباس اختيارية إلا مع أحرف خاصةname: "mon:pod"
القيم المنطقيةtrue / falseenabled: true

1.2 أزواج مفتاح-قيمة

الهيكل الأبسط في YAML — مفتاح مرتبط بقيمة:

output
nom: flask-ml-api
version: "1.0"
replicas: 3
debug: false

1.3 القوائم (التسلسلات)

تستخدم القوائم الشرطة - لكل عنصر:

output
frameworks:
  - scikit-learn
  - tensorflow
  - pytorch
  - fastapi

1.4 الخرائط المتداخلة (القواميس)

تسمح الخرائط بإنشاء هياكل هرمية:

output
serveur:
  host: 0.0.0.0
  port: 5000
  options:
    debug: true
    workers: 4
WARNINGتنبيه — المسافة البادئة حاسمة في YAML. خطأ بمسافة واحدة قد يفسد الملف بأكمله. استخدم دائمًا مسافتين ولا تستخدم علامات التبويب أبدًا.

1.5 أنواع بيانات YAML

السلاسل النصية

output
simple: hello
quotes: "world"
multi: |
  ligne 1
  ligne 2

الأرقام

output
entier: 42
flottant: 3.14
scientifique: 1e+6
octal: 0o14

الخاصة

output
vrai: true
faux: false
vide: null
date: 2026-03-05
va-plus-loin

يغطي هذا المقال المقتطفات الأكثر فائدة — الدورة الكاملة ML Infrastructure Kubernetes (12 فصلاً، 41 درسًا، تمارين محلولة ومشروع نهائي) تأخذك إلى النهاية.

./acceder-au-cours-complet cours gratuit : Maîtriser Claude Code

الأسئلة الشائعة

كم من الوقت يستغرق تعلم ML Infrastructure Kubernetes؟
مع تقدم منظم (12 فصلاً، 41 درسًا قصيرًا وعمليًا)، يمكن الوصول إلى مستوى تشغيلي في بضعة أسابيع بمعدل 30 إلى 60 دقيقة يوميًا. المهم هو تطبيق كل مفهوم فورًا.
هل هناك متطلبات مسبقة؟
من الأفضل أن تكون مرتاحًا مع أساسيات المجال: هذا المحتوى يتعمق مع حالات حقيقية.
من أين نبدأ عمليًا؟
طبّق الأوامر الواردة في هذا المقال، ثم تابع الدورة الكاملة ML Infrastructure Kubernetes: فهي تربط الـ41 درسًا بالترتيب مع تمارين ومشروع نهائي.

📬 هل تريد تلقي هذا النوع من الأدلة كل أسبوع؟ اشترك مجانًا — كود حقيقي، بدون كلام فارغ.