ترقية الكلاستر وإدارة العقد
ترقية الكلاستر وإدارة العقد
إبقاء كلاستر Kubernetes على إصدار مدعوم ومُرقَّع ليس خياراً — بل هو التزام أساسي بالموثوقية والأمن. غير أن الترقية الخاطئة هي من أسرع الطرق للتسبب في انقطاع واسع النطاق. يغطي هذا الدرس كيف ينفّذ كبار المهندسين الموثوقين ترقيات بدون توقف في بيئة الإنتاج: استراتيجية البدء بمستوى التحكم، وPodDisruptionBudgets، وتفريغ العقد بأمان، وأنماط مجموعات العقد الحديثة المستخدمة في الشركات الكبرى.
دورة إصدار Kubernetes وسياسة الانحراف
يُصدر Kubernetes ثلاثة إصدارات ثانوية سنوياً (كل أربعة أشهر تقريباً). يتلقى كل إصدار ثانوي تحديثات دورية وإصلاحات للثغرات الحرجة لمدة 14 شهراً تقريباً بعد تاريخ إصداره. سياسة الانحراف صارمة:
- يجب أن يكون
kube-apiserverعلى نفس الإصدار الثانوي أو إصدار ثانوي أحدث منkubelet. لا يمكنك استخدام apiserver بالإصدار v1.28 مع kubelet بالإصدار v1.26. - يمكن أن تكون مكونات مستوى التحكم (
kube-schedulerوkube-controller-manager) إصداراً ثانوياً أحدث من kubelet — هذه هي النافذة التي تستغلها لترقيتها بأمان. - يمكن أن يكون
kubectlفي نطاق ±1 إصدار ثانوي من الـ apiserver.
تسلسل الترقية: مستوى التحكم أولاً
القاعدة الذهبية: قم دائماً بترقية مستوى التحكم قبل مستوى البيانات. يجب أن يكون الـ apiserver دائماً أحدث مكون في الكلاستر. الترتيب الموصى به هو:
- عمل نسخة احتياطية من etcd.
- ترقية
kube-apiserver. - ترقية
kube-controller-managerوkube-scheduler. - ترقية كل مجموعة عقد، دفعة واحدة في كل مرة.
- ترقية الإضافات (CoreDNS، kube-proxy، إضافة CNI، metrics-server).
في الكلاسترات المُدارة (EKS، GKE، AKS) تتولى مزودات السحابة الخطوات من 1 إلى 3. تستدعيها عبر وحدة التحكم أو سطر الأوامر، وتنتظر استقرار مستوى التحكم، ثم تقوم بتفريغ مجموعات العقد واستبدالها بنفسك — أو تستخدم مجموعات العقد المُدارة التي تؤتمت ذلك. في الكلاسترات المُدارة ذاتياً، تشغّل kubeadm upgrade.
PodDisruptionBudgets: ضمان التوافر أثناء الصيانة
يُعدّ PodDisruptionBudget (PDB) العقد بين العمليات وأحمال العمل. يخبر واجهة برمجة الإخلاء في Kubernetes بالحد الأدنى من الـ Pods (أو النسبة المئوية) التي يجب أن تظل متاحة أثناء الاضطرابات الطوعية — تفريغ العقد، وترقيات الكلاستر، أو الإخلاء اليدوي. بدون PDBs، يمكن للتفريغ إنهاء جميع نسخ خدمة حيوية في آنٍ واحد.
تنطبق PDBs على الاضطرابات الطوعية فحسب. فشل الأجهزة اضطراب غير طوعي ولا يمكن للـ PDBs منعه — ذاك ما تتعامل معه النسخ المتعددة وقيود توزيع الـ Topology.
minAvailable يساوي العدد الإجمالي للنسخ، أو maxUnavailable: 0، فسيتوقف التفريغ إلى الأبد. ستُرفض واجهة برمجة الإخلاء لأي Pod، وسيتوقف kubectl drain. دائماً اضبط PDBs بحيث يكون الاضطراب الواحد على الأقل مسموحاً به. الإعداد الآمن الشائع هو minAvailable: 1 للنشرات الصغيرة، وmaxUnavailable: "25%" للكبيرة.
تفريغ العقد بأمان
يقوم kubectl drain بأمرين: يُقيّد العقدة (cordon) (يضعها في حالة SchedulingDisabled حتى لا تستقبل Pods جديدة) ثم يُخلي جميع الـ Pods القابلة للإخلاء مع احترام PDBs. فهم كل خيار أمر ضروري:
--ignore-daemonsets— لا يمكن إخلاء Pods الخاصة بـ DaemonSet (سيعيد تحكم DaemonSet إنشاءها)؛ هذا الخيار يتجاوزها بأمان.--delete-emptydir-data— يُخلي Pods التي تحتوي على وحدات تخزينemptyDir. مطلوب في معظم الكلاسترات الحقيقية. البيانات في emptyDir تُفقد عند الإخلاء — تأكد أن حمل العمل مصمم لذلك.--pod-selector— يُفرّغ فقط Pods المطابقة لملصق معين، تاركاً الأخرى في مكانها (مفيد للصيانة التدريجية).--timeout— المدة الزمنية لانتظار إنهاء الـ Pods. الافتراضي غير محدود؛ اضبط قيمة واقعية (مثل300s) لتجنب التوقف من Pods المعطوبة.--force— يُخلي Pods غير المُدارة بواسطة متحكم (Pods مجردة). استخدمه بحذر؛ تلك الـ Pods تختفي نهائياً.
مجموعات العقد وترقيات العقد بنمط الأزرق/الأخضر
على نطاق واسع، تفريغ العقد الفردية بطيء جداً وعرضة للأخطاء. النهج المعياري في الصناعة هو مجموعات عقد الأزرق/الأخضر: توفير مجموعة عقد جديدة على إصدار Kubernetes المستهدف، ونقل أحمال العمل إليها، ثم إنهاء المجموعة القديمة. هذا يمنحك مساراً فورياً للتراجع — إذا تصرفت العقد الجديدة بشكل سيء، ما عليك سوى تقييد المجموعة الجديدة ورفع الحظر عن القديمة.
على EKS يستخدم النمط مجموعات العقد المُدارة أو مجموعات Auto Scaling المُدارة ذاتياً. سير العمل مع eksctl أو Terraform هو:
التلوينات والتحملات ومحددات العقد في سير عمل الصيانة
أثناء الترقيات المتدحرجة، غالباً ما تحتاج إلى التأكد من أن أحمال العمل تهبط فقط على العقد المُرقَّاة. طبّق NoSchedule taint على العقد القديمة كإجراء احتياطي إضافي إلى جانب التقييد، واستخدم الوعي بـ node.kubernetes.io/unschedulable. بالنسبة لمجموعات العقد المتخصصة (GPU، ذاكرة عالية، Spot Instances)، فإن التلوينات والتحملات هي الآلية الدائمة التي تمنع أحمال العمل العادية من استهلاك الموارد المكلفة.
node.company.io/pool=workers وnode.company.io/lifecycle=spot وnode.company.io/generation=v2 على كل مجموعة عقد. هذه الملصقات تجعل استهداف عمليات التفريغ وكتابة قواعد PodAffinity والاستعلام عن العقد أثناء الحوادث أمراً سهلاً — دون الحاجة إلى تذكر معرفات الـ instances أو عناوين IP.
قائمة مراجعة الترقية للإنتاج
- تحقق من APIs المهملة باستخدام
kubectl convertأو kubent قبل الترقية. إصدارات CRD المهملة ستنكسر بعد الترقية. - انسخ etcd احتياطياً باستخدام
etcdctl snapshot saveأو لقطة مزود السحابة. - تحقق من PDBs: أكد أن
ALLOWED-DISRUPTIONS > 0لكل حمل عمل حيوي. - قم بترقية مستوى التحكم؛ انتظر حتى تُبلّغ جميع المكونات بـ
Ready. - قم بترقية العقد في دفعات بنسبة 25% أو استخدم استبدال مجموعة العقد بنمط الأزرق/الأخضر.
- راقب معدلات الأخطاء والكمون على منصة المراقبة الخاصة بك طوال العملية.
- قم بترقية الإضافات أخيراً (CoreDNS، CNI، metrics-server) إلى إصداراتها المتوافقة مع الإصدار الثانوي الجديد.
- شغّل اختبارات الامتثال التدخينية أو مجموعة الاختبارات التكاملية للتأكد من صحة الكلاستر.