هناك الكثير من المؤلفات المرجعية على الإنترنت ، ولكن في بعض الأحيان تصبح أبسط النصائح هي الأكثر قيمة. قام فريق 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