شبكة الخدمات والشبكات لـ ML

التوفر العالي والتعافي من الكوارث

3 دقيقة للقراءة

تتطلب خدمات ML الإنتاجية توفراً عالياً لتلبية SLAs وقدرات التعافي من الكوارث لاستمرارية الأعمال. يغطي هذا الدرس النشر متعدد المناطق واستراتيجيات تجاوز الفشل وإجراءات النسخ الاحتياطي لمنصات ML.

بنية HA لـ ML

┌─────────────────────────────────────────────────────────────────────┐
│                    بنية ML متعددة المناطق                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │                    موازن الحمل العالمي                       │    │
│  │              (توجيه DNS أو Anycast)                          │    │
│  └─────────────────────────────────────────────────────────────┘    │
│              │                               │                       │
│  ┌───────────────────────┐    ┌───────────────────────┐            │
│  │   المنطقة: US-East    │    │   المنطقة: EU-West    │            │
│  │  ┌─────────────────┐  │    │  ┌─────────────────┐  │            │
│  │  │  Zone A  │ Zone B│  │    │  │  Zone A  │ Zone B│  │            │
│  │  │ [GPU]    │ [GPU] │  │    │  │ [GPU]    │ [GPU] │  │            │
│  │  └─────────────────┘  │    │  └─────────────────┘  │            │
│  │  ┌─────────────────┐  │    │  ┌─────────────────┐  │            │
│  │  │  ذاكرة النماذج  │  │←──→│  │  ذاكرة النماذج  │  │            │
│  │  │  (إقليمية)      │  │    │  │  (إقليمية)      │  │            │
│  │  └─────────────────┘  │    │  └─────────────────┘  │            │
│  └───────────────────────┘    └───────────────────────┘            │
│              │                               │                       │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │            تخزين النماذج المُنسَخ (S3/GCS)                   │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘

نشر الاستدلال متعدد المناطق

apiVersion: apps/v1
kind: Deployment
metadata:
  name: inference-service
  namespace: ml-serving
spec:
  replicas: 6
  selector:
    matchLabels:
      app: inference
  template:
    metadata:
      labels:
        app: inference
    spec:
      # التوزيع عبر المناطق
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: inference
      # مضاد التقارب لعقد GPU
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: inference
              topologyKey: kubernetes.io/hostname
      containers:
      - name: inference
        image: inference:v1
        resources:
          limits:
            nvidia.com/gpu: 1
        readinessProbe:
          httpGet:
            path: /v2/health/ready
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /v2/health/live
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 15
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: inference-pdb
  namespace: ml-serving
spec:
  minAvailable: 4
  selector:
    matchLabels:
      app: inference

تكوين تجاوز الفشل

# موازنة الحمل المدركة للموقع في Istio
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: inference-failover
  namespace: ml-serving
spec:
  host: inference-service
  trafficPolicy:
    connectionPool:
      http:
        h2UpgradePolicy: UPGRADE
        http2MaxRequests: 1000
    outlierDetection:
      consecutive5xxErrors: 3
      interval: 10s
      baseEjectionTime: 30s
      maxEjectionPercent: 50
    loadBalancer:
      localityLbSetting:
        enabled: true
        failover:
        - from: us-east1
          to: us-west1
        - from: europe-west1
          to: us-east1
      simple: ROUND_ROBIN
---
# خدمة مع سياسة حركة المرور الخارجية
apiVersion: v1
kind: Service
metadata:
  name: inference-service
  annotations:
    service.kubernetes.io/topology-mode: Auto
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  selector:
    app: inference
  ports:
  - port: 8080
    targetPort: 8080

النسخ الاحتياطي والاسترداد للنماذج

# نسخ احتياطي Velero لقطع ML الأثرية
apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: ml-backup-daily
  namespace: velero
spec:
  schedule: "0 2 * * *"
  template:
    includedNamespaces:
    - ml-serving
    - ml-training
    - mlflow
    includedResources:
    - persistentvolumeclaims
    - configmaps
    - secrets
    labelSelector:
      matchLabels:
        backup: enabled
    snapshotVolumes: true
    storageLocation: default
    volumeSnapshotLocations:
    - default
    ttl: 720h  # 30 يوم
---
# نسخ احتياطي لسجل النماذج
apiVersion: batch/v1
kind: CronJob
metadata:
  name: model-registry-backup
  namespace: ml-serving
spec:
  schedule: "0 */6 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: amazon/aws-cli:2.15
            command:
            - /bin/sh
            - -c
            - |
              aws s3 sync s3://model-registry s3://model-registry-backup \
                --storage-class GLACIER_IR
              aws s3 cp s3://model-registry-backup/manifest.json \
                s3://model-registry-backup/manifest-$(date +%Y%m%d).json
            env:
            - name: AWS_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  name: aws-backup-creds
                  key: access-key
            - name: AWS_SECRET_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: aws-backup-creds
                  key: secret-key
          restartPolicy: OnFailure

دليل التعافي من الكوارث

# ConfigMap DR مع إجراءات الاسترداد
apiVersion: v1
kind: ConfigMap
metadata:
  name: dr-runbook
  namespace: ml-serving
data:
  recovery-steps.md: |
    # التعافي من الكوارث لمنصة ML

    ## RTO: 30 دقيقة | RPO: 1 ساعة

    ### الخطوة 1: تقييم التأثير
    ```bash
    kubectl get nodes -o wide
    kubectl get pods -n ml-serving -o wide
    kubectl top nodes
    ```

    ### الخطوة 2: تجاوز الفشل لمنطقة DR
    ```bash
    # تحديث DNS للإشارة لمنطقة DR
    aws route53 change-resource-record-sets \
      --hosted-zone-id Z123 \
      --change-batch file://failover-dns.json

    # توسيع منطقة DR
    kubectl --context=dr-cluster scale deployment inference-service \
      --replicas=10 -n ml-serving
    ```

    ### الخطوة 3: الاستعادة من النسخ الاحتياطي (إذا لزم)
    ```bash
    # عرض النسخ الاحتياطية المتاحة
    velero backup get

    # استعادة مساحة اسم ML
    velero restore create --from-backup ml-backup-daily-20240115

    # التحقق من إمكانية الوصول للنماذج
    kubectl exec -it deploy/inference-service -n ml-serving -- \
      ls -la /models/
    ```

    ### الخطوة 4: التحقق من الخدمات
    ```bash
    # فحص الصحة
    curl https://inference-dr.example.com/v2/health/ready

    # اختبار الاستدلال
    curl -X POST https://inference-dr.example.com/v1/models/default:predict \
      -d '{"instances": [[1,2,3,4]]}'
    ```
---
# تجاوز فشل آلي مع Argo Events
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
  name: failover-trigger
spec:
  dependencies:
  - name: health-check-failure
    eventSourceName: prometheus-alerts
    eventName: inference-down
  triggers:
  - template:
      name: trigger-failover
      k8s:
        operation: patch
        source:
          resource:
            apiVersion: v1
            kind: Service
            metadata:
              name: inference-service
        parameters:
        - src:
            dependencyName: health-check-failure
            dataKey: body.alerts[0].labels.region
          dest: metadata.annotations.failover-region

مراقبة الصحة

# فحوصات صحة شاملة
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: ml-ha-alerts
spec:
  groups:
  - name: high-availability
    rules:
    - alert: InferenceServiceDown
      expr: |
        sum(up{job="inference-service"}) < 2
      for: 2m
      labels:
        severity: critical
        runbook: dr-runbook
      annotations:
        summary: "نسخ خدمة الاستدلال أقل من الحد الأدنى"

    - alert: ZoneFailure
      expr: |
        count(kube_node_status_condition{condition="Ready",status="true"}) by (topology_kubernetes_io_zone) < 1
      for: 5m
      labels:
        severity: critical
      annotations:
        summary: "المنطقة {{ $labels.topology_kubernetes_io_zone }} ليس لديها عقد جاهزة"

    - alert: ModelStorageUnavailable
      expr: |
        probe_success{job="model-storage-probe"} == 0
      for: 3m
      labels:
        severity: critical
      annotations:
        summary: "تخزين النماذج غير قابل للوصول"

الوحدة التالية: العمليات الإنتاجية وGitOps لمنصات ML. :::

اختبار

الوحدة 5: شبكة الخدمات والشبكات لـ ML

خذ الاختبار