أعلى 10 نصائح وحيل Kubernetes



هناك الكثير من المؤلفات المرجعية على الإنترنت ، ولكن في بعض الأحيان تصبح أبسط النصائح هي الأكثر قيمة. قام فريق Mail.ru Kubernetes aaS بترجمة مجموعة مختارة من عشر حيل ونصائح جمعها كاتب المقالة بعد عام من العمل مع Kubernetes. لا يتم فرز النصائح حسب الأهمية ، ولكننا نعتقد أن الجميع سيجدون شيئًا مفيدًا لأنفسهم.

أسهل فريق للعمل مع Kubernetes


بادئ ذي بدء ، ربما أبسط وأكثر فائدة مفيدة في العمل مع Kubernetes. يمكّن الأمر التالي الإكمال التلقائي للأوامر kubectlفي shell bash:

echo "source <(kubectl completion bash)" >> ~/.bashrc

kubectlستتم كتابة الإكمال التلقائي في ملف .bashrc وسيتم تنشيطه تلقائيًا في كل مرة يبدأ فيها shell. هذا يسرع مجموعة من الأوامر والمعلمات الطويلة ، مثل all-namespaces. انظر تعليمات Kubernetes bash للحصول على التفاصيل .

القيود الافتراضية على الذاكرة ووحدة المعالجة المركزية في مساحة الاسم


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

لمنع ذلك ، يسمح لك Kubernetes بتعيين قيود افتراضية لكل مساحة اسم. وهي مكتوبة في ملف yaml لمساحة اسم محددة. هنا مثال لمثل هذا الملف:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

إنشاء مثل هذا yaml وتطبيقه على أي مساحة اسم. على سبيل المثال ، إلى مساحة الاسم limit-example. الآن ، بالنسبة لأي حاوية يتم نشرها في مساحة الاسم هذه ، سيتم تطبيق حد 512 مي ، ما لم يتم تعيين حد فردي آخر لهذه الحاوية.

جمع القمامة في الإصدارات القديمة من Kubernetes


يبدأ Kubelet بشكل افتراضي بجمع القمامة عندما تشغل var / lib / docker 90٪ من مساحة القرص المتوفرة. هذا جيد ، ولكن قبل Kubernetes 1.7 لم يكن هناك حد افتراضي لعدد Inodes المستخدمة (inodes) ، والتي تتوافق مع عدد الملفات في نظام الملفات.

من المحتمل أن تستخدم حاوية var / lib / docker 50٪ فقط من مساحة القرص ، ولكن يمكن أن تنفد inodes ، مما يسبب مشاكل للعاملين.

في الإصدارات القديمة من kubelet من 1.4 إلى 1.6 ، سيكون عليك إضافة العلم التالي:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

في الإصدار 1.7 والإصدارات الأحدث ، يتم تعيين هذه العلامة بشكل افتراضي. ومع ذلك ، لا تتبع الإصدارات السابقة حد inodes.

Minikube ... Kubernetes محلية صغيرة ولكنها قوية


Minikube هو أسهل طريقة لبدء مجموعة Kubernetes محلية. يبدأ الأمر بأمر بسيط:

minikube start

نتيجة لهذا الأمر ، يتم تشغيل مجموعة Kubernetes حقيقية على جهاز الكمبيوتر الخاص بك.


مصدر التوضيح

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

لإجبار Docker على إرسال الصورة إلى مجموعة Kubernetes المحلية ، يتم إعطاء آلة docker الأمر التالي:

eval $(minikube docker-env)

الآن يمكننا بناء تطبيقات على مجموعة Kubernetes المحلية.

لا تمنح kubectl الوصول إلى الجميع


يبدو هذا واضحًا ، ولكن إذا استخدمت عدة فرق نفس المجموعة لتطبيقاتها (التي تم إنشاء Kubernetes من أجلها) ، فيجب ألا تقدمها للجميع فقط kubectl. من الأفضل فصل الفرق من خلال منح كل منهم مساحة الاسم الخاصة به وتحديد الوصول من خلال سياسات RBAC.

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

إدارة ميزانيات الموقد


كيف تضمن عدم وجود فترة توقف للتطبيق في مجموعة Kubernetes؟ PodDisruptBudget ومرة ​​أخرى PodDisruptBudget.

يتم تحديث المجموعات بشكل دوري ، ويتم إفراغ العقد. لا شيء ثابت ، هذه هي الحقيقة. في كل عملية نشر بأكثر من مثيل ، يجب عليك بالتأكيد تضمين PDB (PodDisruptBudget). يتم إنشاؤه في ملف yaml بسيط ينطبق على الكتلة. يتم تحديد منطقة تغطية PDB معينة بواسطة محددات الملصقات.

ملاحظة: تؤخذ ميزانية PDB في الاعتبار فقط في حالة حدوث خلل طوعي . في حالات مثل فشل الأجهزة ، لن يعمل PDB.

مثال PDB:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

معلمتان رئيسيتان هما matchLabelsو minAvailable. تشير المعلمة الأولى إلى التطبيقات التي لها ميزانية. على سبيل المثال، إذا كان لدي الانتشار مع app: app-aو علامات app: app-b، ثم وهذا PDB ستطبق فقط على البداية.

يتم minAvailableأخذ المعلمة بعين الاعتبار عند إفراغ (تنظيف) الوحدة. على سبيل المثال ، في مثالنا ، تم استبدال كل الحالات app: app-aباستثناء الدمار أثناء الدمار .

يتيح لك ذلك التحكم في عدد مثيلات التطبيق التي يجب تشغيلها في أي وقت.

مراقبة سلامة التطبيق


هذا الرصد ممكن بطريقتين: استخدام عينات الجاهزية أو الحياة.

يحدد اختبار الجاهزية الأول ما إذا كانت الحاوية جاهزة لاستقبال حركة المرور.

يوضح الثاني (حيوية) ما إذا كانت الحاوية تعمل أو تحتاج إلى إعادة تشغيل.

تتم إضافة التكوينات المناسبة ببساطة إلى yaml للنشر. هناك يمكنك تحديد المهلات وأوقات التأخير وعدد مرات إعادة المحاولة. راجع وثائق Kubernetes لمزيد من التفاصيل .

العلامات في كل مكان


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

بمساعدة التسميات ، يمكنك القيام بكل شيء تقريبًا ، ولكن المثال الجيد هو إنشاء العديد من البيئات لتشغيل البرامج في مجموعة واحدة.

افترض أنك تستخدم نفس العنقود لـ devو qa. هذا يعني أنه قد يكون لديك تطبيق app-aيعمل في وقت واحد في كل من البيئات qaو dev. في هذه الحالة ، يمكننا الوصول إلى مثيل التطبيق في بيئة معينة بشكل منفصل عن طريق تحديد المعلمة المناسبة environment. على سبيل المثال، app: app-aو environment: devللبيئة واحدة، و app: app-aوenvironment: qaللمرة الثانية.

هذا يسمح لك بالوصول إلى كل من مثيلات التطبيق ، على سبيل المثال ، للاختبار في وقت واحد.

ضعه في الترتيب


Kubernetes هو نظام قوي للغاية ، ولكن أي نظام يمكن أن ينتهي به الأمر إلى التعثر في عدد كبير من العمليات. تطلق Kubelet جميع العمليات والفحوصات التي تحددها ، بالإضافة إلى العمليات الخاصة بك.

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

إذا كنت تحذف النشر لسبب ما (الحاوية ، الصورة ، أيا كان) ، فتأكد من محوها تمامًا.

تعرف على الذهاب


لقد حفظنا النصيحة الرئيسية في النهاية. تعلم لغة البرمجة Go.

تم تطوير Kubernetes على Go ، وتتم كتابة جميع الملحقات على Go ، كما يتم دعم مكتبة العميل client-go رسميًا.

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

ربما يكون تعلم لغة البرمجة Go وإتقان استخدام العميل هو أهم نصيحة يمكنك تقديمها لمستخدمي Kubernetes المبتدئين.

تمت الترجمة بدعم من Mail.ru Cloud Cloud Solutions


All Articles