Kubernetes وتنسيق الحاويات

أحمال عمل وشبكات Kubernetes

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

أتقن أحمال عمل K8s ومفاهيم الشبكات لمقابلات DevOps/SRE.

دورة حياة Pod

Pending → Running → Succeeded/Failed
     (CrashLoopBackOff)

مراحل Pod

المرحلةالمعنى
Pendingينتظر الجدولة أو سحب الصورة
Runningحاوية واحدة على الأقل تعمل
Succeededجميع الحاويات خرجت بنجاح (0)
Failedحاوية واحدة على الأقل فشلت
Unknownفُقد الاتصال بالعقدة

الفحوصات

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: app
    image: myapp
    # Liveness: إعادة التشغيل إذا فشل
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10
      failureThreshold: 3

    # Readiness: إزالة من Service إذا فشل
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5

    # Startup: تأخير الفحوصات الأخرى أثناء البدء
    startupProbe:
      httpGet:
        path: /healthz
        port: 8080
      failureThreshold: 30
      periodSeconds: 10
الفحصالغرضعند الفشل
Livenessهل الحاوية حية؟إعادة تشغيل الحاوية
Readinessهل يمكن خدمة الحركة؟إزالة من Service
Startupهل لا يزال يبدأ؟تأخير الفحوصات الأخرى

إدارة الموارد

resources:
  requests:    # ضمان الجدولة
    memory: "256Mi"
    cpu: "250m"    # 0.25 نواة CPU
  limits:      # السقف الصارم
    memory: "512Mi"
    cpu: "500m"

فئات QoS

الفئةالشرطالأولوية
Guaranteedrequests = limits لجميع المواردالأعلى (آخر من يُخلى)
Burstablerequests < limitsمتوسطة
BestEffortبدون requests أو limitsالأدنى (أول من يُخلى)

شبكات Kubernetes

أنواع Service

# ClusterIP (افتراضي) - داخلي فقط
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 8080
النوعالوصولحالة الاستخدام
ClusterIPداخلي فقطالتواصل بين الخدمات
NodePort<NodeIP>:<NodePort>التطوير، الوصول المباشر
LoadBalancerLB خارجيالتعرض السحابي للإنتاج
ExternalNameDNS CNAMEتسمية الخدمات الخارجية

Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
  tls:
  - hosts:
    - app.example.com
    secretName: app-tls-secret

Network Policies

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-network-policy
spec:
  podSelector:
    matchLabels:
      app: api
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web
    ports:
    - port: 8080
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - port: 5432

الجدولة والتقارب

Node Affinity

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-type
            operator: In
            values:
            - high-memory
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: zone
            operator: In
            values:
            - us-east-1a

Pod Anti-Affinity

spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: web
        topologyKey: kubernetes.io/hostname

حالة الاستخدام: توزيع النسخ عبر العقد للتوفر العالي

Taints والتحملات

# Taint عقدة
kubectl taint nodes node1 dedicated=gpu:NoSchedule

# Pod يجب أن يتحمل ليُجدول
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"
التأثيرالسلوك
NoScheduleلن يُجدول pods جديدة
PreferNoScheduleحاول تجنب الجدولة
NoExecuteإخلاء pods الموجودة أيضاً

أسئلة المقابلة

س: "Deployment لديه 3 نسخ لكن فقط 2 pods تعمل. كيف تستكشف الأخطاء؟"

# تحقق من حالة deployment
kubectl get deployment myapp
kubectl describe deployment myapp

# تحقق من replicaset
kubectl get rs -l app=myapp
kubectl describe rs <rs-name>

# تحقق من pods
kubectl get pods -l app=myapp
kubectl describe pod <pending-pod>

# تحقق من الأحداث
kubectl get events --sort-by='.lastTimestamp'

# المشاكل الشائعة:
# - موارد غير كافية (تحقق من سعة العقدة)
# - أخطاء سحب الصورة (تحقق من اسم الصورة/السجل)
# - node affinity لا يمكن إرضاؤه
# - PVC لا يمكن ربطه

س: "كيف تضمن توزيع pods بالتساوي عبر مناطق التوفر؟"

spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: web

التالي، سنتقن استكشاف أخطاء Kubernetes—المهارة التي تُعرّف المهندسين الكبار. :::

مراجعة سريعة: كيف تجد هذا الدرس؟

اختبار

الوحدة 4: Kubernetes وتنسيق الحاويات

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.