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:
خطوات الجدولة:
- الترشيح: استبعاد العقد التي لا تستطيع تشغيل pod
- موارد غير كافية
- Node selectors لا تتطابق
- Taints غير متحملة
- التقييم: ترتيب العقد المتبقية
- توازن الموارد
- Pod affinity/anti-affinity
- قرب البيانات
- الربط: تعيين 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"
- kubectl يرسل POST إلى
/apis/apps/v1/namespaces/default/deployments - API server يُصادق (kubeconfig) ويُفوّض (RBAC)
- متحكمات القبول تعالج (تعديل، تحقق)
- كائن Deployment يُخزن في etcd
- متحكم Deployment يرى deployment جديد، يُنشئ ReplicaSet
- متحكم ReplicaSet يرى RS جديد، يُنشئ كائنات Pod
- المجدول يرى pods غير مجدولة، يعينها للعقد
- kubelet على العقدة الهدف يرى pod المعين
- kubelet يُخبر containerd بسحب الصورة وبدء الحاوية
- 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. :::