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

الفئة الشرط الأولوية
Guaranteed requests = limits لجميع الموارد الأعلى (آخر من يُخلى)
Burstable requests < 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> التطوير، الوصول المباشر
LoadBalancer LB خارجي التعرض السحابي للإنتاج
ExternalName DNS 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 وتنسيق الحاويات

خذ الاختبار