كيفية تنظيف مهام Kubernetes القديمة
وكالة ويب » أخبار رقمية » كيفية تصحيح أخطاء "FailedScheduling" الخاصة بـ Kubernetes

كيفية تصحيح أخطاء "FailedScheduling" الخاصة بـ Kubernetes

تعد مشكلات جدولة Pod أحد أكثر أخطاء Kubernetes شيوعًا. هناك العديد من الأسباب التي تجعل البود الجديد عالقًا في ملف Pending دولة مع FailedScheduling كسبب له. لن يقوم الكبسولة التي تعرض هذه الحالة بتشغيل أي حاويات ، لذلك لن تتمكن من استخدام التطبيق الخاص بك.

لا تبدأ البودات المعلقة الناتجة عن مشكلات الجدولة عادةً بدون تدخل يدوي. ستحتاج إلى العثور على السبب الجذري واتخاذ الإجراءات لإصلاح المجموعة الخاصة بك. في هذه المقالة ، ستتعرف على كيفية تشخيص هذه المشكلة وإصلاحها حتى تتمكن من زيادة أعباء العمل لديك.

تحديد خطأ FailedScheduling

من الطبيعي أن تعرض البودات ملف Pending الحالة لفترة قصيرة بعد إضافتها إلى مجموعتك. يحتاج Kubernetes إلى جدولة طبعات الحاوية على عقدك ، وتحتاج هذه العقد إلى سحب الصورة من السجل الخاص بها. أول علامة على فشل جدولة البودات هي عندما تظهر دائمًا على شكل Pending بعد انقضاء فترة بدء التشغيل المعتادة. يمكنك التحقق من الحالة عن طريق تشغيل Kubectl's get pods أمر:

$ kubectl الحصول على القرون اسم الحالة الجاهزة RESTARTS Age demo-pod 0/1 معلق 0 4m05s

demo-pod أكثر من أربع دقائق ، لكنها لا تزال في Pending حالة. لا تستغرق البودات عادةً وقتًا طويلاً لبدء تشغيل الحاويات ، لذا فقد حان الوقت لبدء التحقيق فيما تتوقعه Kubernetes.

تتمثل الخطوة التشخيصية التالية في استرداد سجل أحداث Pod باستخدام ملف describe pod أمر:

وصف $ kubectl pod demo-pod ... الأحداث: النوع السبب العمر من الرسالة ---- ------ ---- ---- ------- ... تحذير FailedScheduling 4m افتراضي- تتوفر عقد جدولة 0/4: 1 عدد كبير جدًا من البودات ، 3 وحدة معالجة مركزية غير كافية.

يؤكد سجل الأحداث أ FailedScheduling الخطأ هو سبب التمديد Pending حالة. يتم الإبلاغ عن هذا الحدث عندما يتعذر على Kubernetes تخصيص العدد المطلوب من الكبسولات لإحدى العقد العاملة في المجموعة.

تكشف رسالة الحدث سبب عدم إمكانية الجدولة حاليًا: توجد أربع عقد في المجموعة ، لكن لا يمكن لأي منها أخذ الكبسولة. ثلاث من العقد لديها سعة وحدة المعالجة المركزية غير كافية بينما وصلت الأخرى إلى الحد الأقصى لعدد القرون التي يمكنها قبولها.

فهم أخطاء FailedScheduling والمشكلات المماثلة

يمكن لـ Kubernetes جدولة البودات فقط على العقد ذات الموارد الاحتياطية. لم تعد العُقد التي تنفد من وحدة المعالجة المركزية أو الذاكرة قادرة على استيعاب البودات. يمكن أن تفشل السنفات أيضًا في الجدولة إذا طلبت صراحة موارد أكثر مما يمكن أن توفره أي عقدة واحدة. هذا يحافظ على استقرار مجموعتك.

يعرف مستوى التحكم في Kubernetes الكبسولات المخصصة بالفعل للعقد في المجموعة الخاصة بك. يستخدم هذه المعلومات لتحديد مجموعة العقد التي يمكنها استقبال حجرة جديدة. يحدث خطأ في الجدولة عندما لا يتوفر أي مرشح ، مما يترك الكبسولة عالقة Pending حتى يتم تحرير القدرة.

قد لا يقوم Kubernetes أيضًا بجدولة البودات لأسباب أخرى. يمكن اعتبار العقد غير مؤهلة لاستضافة Pod بعدة طرق ، حتى إذا كان لديها موارد نظام كافية:

  • ربما تم قفل العقدة من قبل المسؤول لمنعها من تلقي قرون جديدة قبل عملية الصيانة.
  • يمكن أن يكون للعقدة تأثير يمنع البودات من الجدولة. لن تقبل العقدة جرابك ما لم يكن به تفاوت مطابق.
  • قد يطلب جرابك ملف hostPort التي تم ربطها بالفعل بالعقدة. يمكن للعقد توفير رقم منفذ معين فقط لجهاز Pod واحد في كل مرة.
  • قد يكون جرابك يستخدم ملف nodeSelector هذا يعني أنه يجب برمجتها على عقدة بعلامة معينة. العقد غير المميزة لن تكون مؤهلة.
  • يمكن أن تكون التقاربات والعقبات المضادة للقرون والعقد غير مرضية ، مما يتسبب في تضارب في المواعيد يمنع قبول القرون الجديدة.
  • قد يكون للقرص ملف nodeName الحقل الذي يحدد عقدة معينة لجدولتها. سيتم تعليق الكبسولة إذا كانت هذه العقدة غير متصلة أو غير مجدولة.

إنها مسؤولية kube-scheduler، جدولة Kubernetes ، للعمل من خلال هذه الشروط وتحديد مجموعة العقد التي يمكنها استضافة حجرة جديدة. أ FailedScheduling يقع الحدث عندما لا تفي أي من العقد بالمعايير.

حل حالة فشل الجدول الزمني

الرسالة المعروضة بجوار FailedScheduling يكشف عادةً لماذا لا تستطيع كل عقدة في مجموعتك أخذ الكبسولة. يمكنك استخدام هذه المعلومات لبدء استكشاف المشكلة وإصلاحها. في المثال أعلاه ، كان للكتلة أربعة قرون ، ثلاثة حيث تم الوصول إلى حد وحدة المعالجة المركزية وواحد تجاوز حد عدد الكبسولات.

قدرة الكتلة هي السبب الجذري في هذه الحالة. يمكنك توسيع مجموعتك باستخدام عقد جديدة لمعالجة مشكلات استهلاك الأجهزة ، وإضافة الموارد التي ستوفر مرونة إضافية. نظرًا لأن هذا سيزيد أيضًا من تكاليفك ، فمن المفيد التحقق أولاً مما إذا كان لديك كبسولات زائدة عن الحاجة في مجموعتك. ستؤدي إزالة الموارد غير المستخدمة إلى تحرير السعة لموارد جديدة.

يمكنك فحص الموارد المتاحة في كل عقد باستخدام ملف describe node أمر:

وصف $ kubectl العقدة التجريبية للعقدة ... الموارد المخصصة: (قد يزيد إجمالي الحدود عن 100 بالمائة ، أي زيادة الالتزام.) حدود طلبات الموارد -------- -------- ---- - وحدة المعالجة المركزية 812 م (90٪) 202 م (22٪) ذاكرة 905 مي (57٪) 715 مي (45٪) تخزين سريع الزوال 0 (0٪) 0 (0٪) hugepages-2Mi 0 (0٪) 0 (0٪)

تطلب القرون الموجودة على هذه العقدة بالفعل 57٪ من الذاكرة المتاحة. إذا طلبت جراب جديد 1 Gi لنفسه ، فلن تتمكن العقدة من قبول طلب الجدولة. يمكن أن تساعدك مراقبة هذه المعلومات لكل عقد من عقدك في تقييم ما إذا كانت مجموعتك قد أصبحت مزودة بشكل زائد عن الحد. من المهم أن يكون لديك سعة فائضة في حالة فشل إحدى عقدك وتحتاج أعباء العمل إلى إعادة جدولة على أخرى.

ستعرض حالات فشل الجدولة بسبب فقدان العقد القابلة للجدولة رسالة مشابهة لما يلي في ملف FailedScheduling حدث:

تتوفر 0/4 من العقد: 4 عقد (ق) كانت غير قابلة للجدولة

ستشمل العقد التي لا يمكن جدولتها لأنها تم تكرارها SchedulingDisabled في مجال وضعهم:

$ kubectl الحصول على العقد اسم الحالة الأدوار العمر الإصدار العقدة -1 جاهز ، جدولة معطل مستوى التحكم ، رئيسي 26 م v1.23.3

يمكنك إلغاء ربط العقدة لتسمح لها باستقبال قرون جديدة:

$ kubectl uncordon node-1 عقدة / عقدة -1 غير مترابطة

عندما لا تكون العقد مغلقة ولديها موارد كافية ، فعادة ما تكون أخطاء الجدولة ناتجة عن التلوث أو الخطأ nodeSelector المجال على جراب الخاص بك. كما ترى nodeSelectorتحقق من أنك لم تقم بخطأ إملائي وأن هناك أجزاء في مجموعتك تحتوي على التسميات التي حددتها.

عندما تكون العقد ملوثة ، تأكد من تضمين التسامح المقابل في بيان جرابك. على سبيل المثال ، إليك عقدة ملوثة ، لذا لن يتم جدولة القرون ما لم يكن لديها ملف demo-taint: allow تسامح:

$ kubectl taint node-1 demo-taint = allow: NoSchedule

قم بتحرير بيانات البود الخاص بك حتى يتمكنوا من الجدولة على العقدة:

المواصفات:
  التسامح:
    - مفتاح: تشويه تجريبي
      عامل: ايكوال
      القيمة: السماح
      تأثير: لا يوجد جدول زمني

قم بحل المشكلة التي تسبب ال FailedScheduling ستسمح الولاية لـ Kubernetes باستئناف جدولة البودات المعلقة. سيبدأ تشغيلها تلقائيًا بعد فترة وجيزة من اكتشاف مستوى التحكم للتغييرات في العقد الخاصة بك. لا تحتاج إلى إعادة التشغيل أو إعادة إنشاء البودات يدويًا ما لم تكن المشكلة ناتجة عن أخطاء في بيان البود ، مثل التقارب غير الصحيح أو nodeSelector حقول.

ملخص

FailedScheduling تحدث الأخطاء عندما يتعذر على Kubernetes وضع جراب جديد على عقدة في المجموعة الخاصة بك. يحدث هذا غالبًا بسبب نفاد العُقد الموجودة لديك من موارد الأجهزة مثل وحدة المعالجة المركزية والذاكرة والقرص. عندما تكون هذه هي الحالة ، يمكنك حل المشكلة عن طريق تحجيم المجموعة الخاصة بك لتشمل عقدًا إضافية.

تحدث إخفاقات الجدولة أيضًا عندما تحدد البودات تقاربات العقدة ، وتقاربات التقارب ، والمحددات التي لا يمكن تلبيتها حاليًا بواسطة العقد المتاحة في مجموعتك. تقلل العقد المحظورة والملوثة من الخيارات المتاحة لـ Kubernetes. يمكن حل هذا النوع من المشكلات عن طريق فحص قوائمك بحثًا عن الأخطاء الإملائية في الملصقات وإزالة القيود التي لم تعد بحاجة إليها.

★ ★ ★ ★ ★