انطلق في ML Infrastructure Kubernetes: خطوتك الأولى الملموسة اليوم
بنية ML التحتية على Kubernetes: الأساسيات في مقال واحد — كود حقيقي، مخططات وخطوات ملموسة، مقتطفات من دورة مكونة من 41 درسًا.
أفضل طريقة لتعلم ML Infrastructure Kubernetes هي بالممارسة. هذا المقال يساعدك على البدء مع مقتطفات عملية مستمدة من دورة تتكون من 41 درسًا — ما يكفي للحصول على نتيجة أولى اليوم.
- تثبيت بيئة Kubernetes
- اكتشاف Kubernetes
- كائنات Kubernetes الأساسية
- ملفات YAML والتكوين
- نشر واجهة برمجة تطبيقات ML باستخدام Flask
المشروع النهائي – دليل كامل خطوة بخطوة
دليل • 5 أجزاء • Backend • Frontend • Helm • Monitoring • CI/CD
الجزء 1 : Backend API (FastAPI + نموذج ML)
1.1 تهيئة المشروع
mkdir -p ml-prediction-platform/{backend/{app,train,tests},frontend,helm,k8s/{security,monitoring},.github/workflows,docs}
cd ml-prediction-platform
git init1.2 تدريب النموذج
# 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")cd backend/train pip install scikit-learn joblib numpy python train_model.py
1.3 إنشاء مخططات Pydantic
# 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: str1.4 إنشاء وحدة تحميل النموذج
# 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
# 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
الأهداف التعليمية
1. لماذا استخراج التكوين؟
في ML، تحتاج واجهة برمجة التطبيقات إلى معاملات تختلف حسب البيئة:
التطوير
الاختبار (Staging)
الإنتاج
باستخدام ConfigMaps، تغير التكوين دون إعادة بناء صورة Docker.
2. ConfigMaps: تخزين التكوين
2.1 إنشاء ConfigMap من قيم حرفية
# إنشاء 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 من ملف
أنشئ أولاً ملف تكوين:
# config.properties model.name=iris_classifier model.version=v2 model.threshold=0.85 api.port=5000 api.workers=4 log.level=INFO
# إنشاء ConfigMap من الملف kubectl create configmap ml-config --from-file=config.properties # إنشاء من مجلد كامل kubectl create configmap ml-config --from-file=./config/
2.3 ConfigMap بصيغة YAML التصريحية
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| بتضمين ملف كامل كقيمة لمفتاح. مفيد جدًا لملفات التكوين الكاملة.3. استخدام ConfigMaps في Pods
3.1 كمتغيرات بيئة
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 كحجم مركب
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
الأهداف التعليمية
1. مقدمة إلى YAML
YAML تعني « YAML Ain't Markup Language ». وهو تنسيق تسلسل بيانات قابل للقراءة من قبل البشر، ويُستخدم كثيرًا للتكوين.
1.1 قواعد YAML الأساسية
| القاعدة | الوصف | مثال |
|---|---|---|
| المسافة البادئة | مسافات فقط (لا علامات تبويب أبدًا)، عادةً مسافتان | key: value |
| مفتاح-قيمة | مفصولة بـ: متبوعة بمسافة | name: mon-pod |
| القوائم | مسبوقة بشرطة - | - item1 |
| التعليقات | تبدأ بـ# | # Ceci est un commentaire |
| السلاسل النصية | علامات الاقتباس اختيارية إلا مع أحرف خاصة | name: "mon:pod" |
| القيم المنطقية | true / false | enabled: true |
1.2 أزواج مفتاح-قيمة
الهيكل الأبسط في YAML — مفتاح مرتبط بقيمة:
nom: flask-ml-api version: "1.0" replicas: 3 debug: false
1.3 القوائم (التسلسلات)
تستخدم القوائم الشرطة - لكل عنصر:
frameworks: - scikit-learn - tensorflow - pytorch - fastapi
1.4 الخرائط المتداخلة (القواميس)
تسمح الخرائط بإنشاء هياكل هرمية:
serveur:
host: 0.0.0.0
port: 5000
options:
debug: true
workers: 41.5 أنواع بيانات YAML
السلاسل النصية
simple: hello quotes: "world" multi: | ligne 1 ligne 2
الأرقام
entier: 42 flottant: 3.14 scientifique: 1e+6 octal: 0o14
الخاصة
vrai: true faux: false vide: null date: 2026-03-05
يغطي هذا المقال المقتطفات الأكثر فائدة — الدورة الكاملة ML Infrastructure Kubernetes (12 فصلاً، 41 درسًا، تمارين محلولة ومشروع نهائي) تأخذك إلى النهاية.
./acceder-au-cours-complet cours gratuit : Maîtriser Claude Codeالأسئلة الشائعة
كم من الوقت يستغرق تعلم ML Infrastructure Kubernetes؟
هل هناك متطلبات مسبقة؟
من أين نبدأ عمليًا؟
📬 هل تريد تلقي هذا النوع من الأدلة كل أسبوع؟ اشترك مجانًا — كود حقيقي، بدون كلام فارغ.