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

الغوص العميق في معمارية Kubernetes

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

فهم معمارية K8s ضروري لأي مقابلة DevOps/SRE. دعنا نستكشف كل مكون.

مكونات Control Plane

┌─────────────────── Control Plane ───────────────────┐
│                                                      │
│  ┌──────────────┐  ┌──────────────┐                │
│  │ kube-apiserver│  │    etcd      │                │
│  └──────────────┘  └──────────────┘                │
│                                                      │
│  ┌──────────────┐  ┌──────────────┐                │
│  │ kube-scheduler│ │kube-controller│                │
│  │               │  │   -manager   │                │
│  └──────────────┘  └──────────────┘                │
│                                                      │
└──────────────────────────────────────────────────────┘

kube-apiserver

الباب الأمامي لـ Kubernetes:

المسؤولية التفاصيل
نقطة API كل اتصالات K8s تمر من خلاله
المصادقة يتحقق من هوية المستخدم/الخدمة
التفويض تطبيق سياسة RBAC
التحكم بالقبول webhooks المعدلة والمتحققة
اتصال etcd المكون الوحيد الذي يتحدث لـ etcd

etcd

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

# etcd يخزن كل شيء:
# - تعريفات Pod
# - تكوينات Service
# - الأسرار
# - ConfigMaps
# - حالة الكلستر

# تحقق من صحة etcd (إذا كان لديك وصول)
etcdctl endpoint health
etcdctl endpoint status

سؤال مقابلة: "ماذا يحدث إذا توقف etcd؟"

الجواب: الكلستر يصبح للقراءة فقط. أحمال العمل الجارية تستمر، لكن لا يمكن إجراء تغييرات. لهذا يجب أن يكون etcd عالي التوفر (عدد فردي من العقد: 3، 5، 7).

kube-scheduler

يقرر أي عقدة تشغل كل pod:

خطوات الجدولة:

  1. الترشيح: استبعاد العقد التي لا تستطيع تشغيل pod
    • موارد غير كافية
    • Node selectors لا تتطابق
    • Taints غير متحملة
  2. التقييم: ترتيب العقد المتبقية
    • توازن الموارد
    • Pod affinity/anti-affinity
    • قرب البيانات
  3. الربط: تعيين pod لأعلى عقدة تقييماً

kube-controller-manager

يشغل حلقات التحكم:

المتحكم ما يُديره
Node Controller صحة العقدة، الإخلاء
Deployment Controller ReplicaSets، التحديثات المتدرجة
ReplicaSet Controller صيانة عدد Pod
Service Controller توفير LoadBalancer
Endpoints Controller تحديثات نقاط نهاية Service

مكونات العقدة

┌─────────────────── Worker Node ─────────────────────┐
│                                                      │
│  ┌──────────────┐  ┌──────────────┐                │
│  │   kubelet    │  │  kube-proxy  │                │
│  └──────────────┘  └──────────────┘                │
│                                                      │
│  ┌──────────────────────────────────┐              │
│  │     Container Runtime (containerd)│              │
│  │  ┌─────┐ ┌─────┐ ┌─────┐        │              │
│  │  │ Pod │ │ Pod │ │ Pod │        │              │
│  │  └─────┘ └─────┘ └─────┘        │              │
│  └──────────────────────────────────┘              │
│                                                      │
└──────────────────────────────────────────────────────┘

kubelet

وكيل العقدة:

# مسؤوليات kubelet:
# - تسجيل العقدة مع الكلستر
# - مراقبة API لتعيينات pod
# - بدء/إيقاف الحاويات عبر CRI
# - الإبلاغ عن حالة العقدة وpod
# - تنفيذ فحوصات liveness/readiness

# تحقق من سجلات kubelet
journalctl -u kubelet -f

kube-proxy

وكيل الشبكة على كل عقدة:

الوضع كيف يعمل حالة الاستخدام
iptables يُنشئ قواعد iptables الافتراضي، معظم الكلسترات
IPVS يستخدم IPVS النواة كلسترات واسعة النطاق
userspace قديم، وكيل userspace مُهمل
# تحقق من وضع kube-proxy
kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode

تدفق طلب API

kubectl apply → API Server → المصادقة → التفويض
            متحكمات القبول (التعديل → التحقق)
                  etcd
            المتحكم يلاحظ التغيير
            المجدول يعين للعقدة
            kubelet على العقدة يبدأ pod

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

س: "أرشدني خلال ما يحدث عند تشغيل kubectl create deployment nginx --image=nginx"

  1. kubectl يرسل POST إلى /apis/apps/v1/namespaces/default/deployments
  2. API server يُصادق (kubeconfig) ويُفوّض (RBAC)
  3. متحكمات القبول تعالج (تعديل، تحقق)
  4. كائن Deployment يُخزن في etcd
  5. متحكم Deployment يرى deployment جديد، يُنشئ ReplicaSet
  6. متحكم ReplicaSet يرى RS جديد، يُنشئ كائنات Pod
  7. المجدول يرى pods غير مجدولة، يعينها للعقد
  8. kubelet على العقدة الهدف يرى pod المعين
  9. kubelet يُخبر containerd بسحب الصورة وبدء الحاوية
  10. kubelet يُبلغ حالة pod إلى API server

س: "كيف يحقق Kubernetes التوفر العالي؟"

المكون استراتيجية HA
etcd كلستر عدد فردي (3، 5، 7)، إجماع Raft
API server نسخ متعددة خلف موازن حمل
المتحكمات انتخاب القائد (واحد نشط فقط)
المجدول انتخاب القائد (واحد نشط فقط)
العقد متعددة، أحمال العمل موزعة

س: "ما الفرق بين Deployment وStatefulSet؟"

الميزة Deployment StatefulSet
أسماء Pod لاحقة عشوائية مرتبة (pod-0، pod-1)
التوسع متوازي تتابعي
التخزين مشترك أو لا شيء PVC لكل pod
هوية الشبكة عشوائية أسماء DNS مستقرة
حالة الاستخدام تطبيقات عديمة الحالة قواعد البيانات، Kafka

التالي، سنغطي أحمال العمل والشبكات في Kubernetes. :::

اختبار

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

خذ الاختبار