عمليات etcd ومستوى التحكم
عمليات etcd ومستوى التحكم
يُعدّ etcd المصدر الوحيد للحقيقة في أي كلاستر Kubernetes. كل كائن تُنشئه — Pod أو Deployment أو Secret أو ConfigMap — يُخزَّن كإدخال مفتاح/قيمة في etcd قبل أن يتصرف أي مكوّن آخر. إذا أصبح etcd غير صحي، يتوقف مستوى التحكم بأكمله: يرفض API server الكتابة، ولا يستطيع المجدوِل وضع البودات، ولا يستطيع controller manager المزامنة مع الحالة المطلوبة. فهم كيفية مراقبة etcd ونسخه احتياطيًا واستعادته — وكيفية تهيئة API server للتواصل معه — هو ما يُميّز المهندسين الذين يُشغّلون Kubernetes فعليًا في الإنتاج.
كيف يندمج etcd في مستوى التحكم
يتكوّن مستوى التحكم في Kubernetes من أربعة مكونات رئيسية: kube-apiserver وkube-controller-manager وkube-scheduler وetcd. فقط API server يتواصل مباشرةً مع etcd — أما بقية المكونات فتتواصل عبر API server. هذه نقطة تصميمية جوهرية: لا تستعلم etcd مباشرةً للحصول على بيانات تشغيلية؛ استخدم kubectl أو Kubernetes API بدلًا من ذلك.
مراقبة صحة etcd
أداة etcdctl هي الأداة المعيارية للاستعلام عن صحة etcd. يجب تحديد نقاط النهاية الصحيحة ومسارات شهادات TLS — تُوجد هذه في ملف manifest الخاص بـ etcd (/etc/kubernetes/manifests/etcd.yaml في كلاسترات kubeadm) أو كمتغيرات بيئة داخل حاوية etcd.
يُظهر خرج endpoint status حقلَي حجم DB مهمَّين: DB SIZE (البايتات المخزّنة حاليًا) وDB SIZE IN USE. الفجوة الكبيرة بينهما تدلّ على مراجعات MVCC متراكمة لم تُضغَط بعد — وهو مصدر شائع لبطء الكتابة ونفاد مساحة القرص.
--auto-compaction-mode مضبوطًا على etcd). في الإنتاج، اضغط كل ساعة، ونفّذ defrag أسبوعيًا خلال نافذة منخفضة الحركة. الأمر etcdctl defrag ضروري لاسترداد مساحة القرص حتى مع تفعيل الضغط التلقائي.
نسخ etcd الاحتياطي — المهمة التشغيلية الأكثر أهمية
اللقطة (Snapshot) هي نسخة احتياطية لقاعدة بيانات etcd كاملة في لحظة محددة. بدون لقطة حديثة، يعني فقدان بيانات etcd الكامل عدم إمكانية استرداد الكلاستر دون إعادة نشر كل شيء من الصفر. يجب أن تمتلك جميع الكلاسترات الإنتاجية لقطات تلقائية.
etcdctl snapshot save نحو نقطة نهاية أحد الأعضاء التابعين. تبقى اللقطة متسقة تمامًا — etcd يُزامن القراءات عبر الكلاستر قبل تقديمها.
تلقائيًا باستخدام CronJob داخل الكلاستر (للكلاسترات المُدارة) أو سكريبت cron على مضيف control-plane (للكلاسترات المُدارة ذاتيًا). خزّن اللقطات في مخزن كائنات (S3 أو GCS) مع تفعيل الإصدار وسياسة احتفاظ لمدة 30 يومًا. لا تخزّن النسخ الاحتياطية فقط على المضيف نفسه الذي يشغّل etcd.
الأعلام الرئيسية لـ API Server
تتحكم أعلام بدء تشغيل API server في الأمان والأداء والاتصال بـ etcd. في كلاسترات kubeadm توجد في /etc/kubernetes/manifests/kube-apiserver.yaml. في الكلاسترات المُدارة (EKS, GKE) يُدير المزوّد هذه الأعلام ويعرض فقط مجموعة منها للتخصيص.
--etcd-servers— قائمة نقاط نهاية etcd مفصولة بفاصلة. أبقِ الأعضاء الثلاثة مدرجين حتى يتمكن API server من إعادة الاتصال عند انتخاب قائد جديد.--etcd-cafileو--etcd-certfileو--etcd-keyfile— شهادات TLS لهوية API server تجاه etcd. جدّدها قبل انتهاء صلاحيتها.--etcd-compaction-interval— كم مرة يُشغّل API server الضغط (الافتراضي 5 دقائق). أبقِه مفعّلًا.--request-timeout— مهلة الطلبات العامة لغير عمليات المراقبة (الافتراضي 96 ثانية). قد تحتاج لزيادته لطلبات LIST الكبيرة في كلاسترات ضخمة.--max-requests-inflight/--max-mutating-requests-inflight— تحديد التزامن لحماية etcd. القيم الافتراضية (400 / 200) مناسبة لكلاسترات أقل من ~1000 عقدة؛ وسّعها تناسبيًا فوق ذلك.--audit-log-path/--audit-policy-file— تسجيل التدقيق المهيكل؛ مطلوب لامتثال SOC 2 / PCI. سجّل في ملف وشحنه بـ Fluentd أو sidecar.--feature-gates— تفعيل ميزات alpha/beta. عامِلها كميزات غير مستقرة؛ لا تُفعّلها في الإنتاج قبل اختبارها في staging دورة إصدار كاملة.
طوبولوجيا etcd في الإنتاج
يجب أن يحتوي كلاستر etcd الإنتاجي دائمًا على عدد فردي من الأعضاء — 3 لمعظم الكلاسترات، 5 للكلاسترات الكبيرة جدًا أو عالية الحركة. يتحمّل الكلاستر المكوّن من 3 أعضاء فشل عضو واحد؛ أما المكوّن من 5 أعضاء فيتحمّل فشل اثنين. الانتقال إلى 7 أعضاء لا يوفر فائدة عملية ويزيد زمن الاستجابة للكتابة لأن القائد يجب أن ينتظر إقرار الأغلبية.
ضع أعضاء etcd على عقد مخصصة مزوّدة بـ أقراص NVMe SSD سريعة — etcd شديد الحساسية لزمن الاستجابة في كتابة القرص. وقت fsync عند النسبة المئوية التاسعة والتسعين يزيد عن 10 مللي ثانية سيُسبّب انتخابات القائد، وفوق 100 مللي ثانية سيُسبّب أخطاء واسعة في API server. راقب مقياس Prometheus etcd_disk_wal_fsync_duration_seconds وأنشئ تنبيهًا عند تجاوز النسبة المئوية التاسعة والتسعين لـ 10 مللي ثانية.
gp3 (3000 IOPS على الأقل كخط أساس، مع burst حتى 16000 IOPS) مُركَّبًا على /var/lib/etcd. على الخوادم المادية استخدم قسم NVMe مخصص.