ما هو Kubernetes؟ دليل الحاوية والنشر

نشرت: 2022-03-11

منذ فترة وجيزة ، استخدمنا تطبيق الويب monolith: قواعد أكواد ضخمة نمت في وظائف وميزات جديدة حتى تحولت إلى عمالقة ضخمة بطيئة الحركة وصعبة الإدارة. الآن ، يتوصل عدد متزايد من المطورين والمهندسين المعماريين وخبراء DevOps إلى الرأي القائل بأنه من الأفضل استخدام الخدمات المصغرة بدلاً من منصة عملاقة. عادةً ما يعني استخدام بنية قائمة على الخدمات المصغرة تقسيم monolith الخاص بك إلى تطبيقين على الأقل: تطبيق الواجهة الأمامية وتطبيق الواجهة الخلفية (API). بعد قرار استخدام الخدمات المصغرة ، يطرح سؤال: في أي بيئة من الأفضل تشغيل الخدمات المصغرة؟ ما الذي يجب أن أختاره لجعل خدمتي مستقرة بالإضافة إلى سهولة إدارتها ونشرها؟ الإجابة المختصرة هي: استخدم Docker!

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

عامل ميناء؟ ما هو Docker؟

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

مقارنة التطبيقات التي تم نشرها على مضيف مقابل تطبيق تم تجميعه في حاوية

مقارنة التطبيقات التي تم نشرها على مضيف مقابل تطبيق تم تجميعه في حاوية

باستخدام الحاويات ، يمكن للمطورين (إعادة) بسهولة نشر صورة إلى أي نظام تشغيل. ما عليك سوى تثبيت Docker ، وتنفيذ الأمر ، وسيتم تشغيل التطبيق الخاص بك. أوه ، ولا تقلق بشأن أي تعارض مع الإصدار الجديد من المكتبات في نظام التشغيل المضيف. بالإضافة إلى ذلك ، يمكنك تشغيل المزيد من الحاويات على نفس المضيف - هل سيكون نفس التطبيق أم آخر؟ لا يهم.

يبدو أن Docker أداة رائعة. ولكن كيف وأين يجب أن أقوم بإطلاق الحاويات؟

هناك الكثير من الخيارات حول كيفية ومكان تشغيل الحاويات: AWS Elastic Container Service (AWS Fargate أو مثيل محجوز مع مقياس تلقائي أفقي ورأسي) ؛ مثيل سحابي مع صورة Docker محددة مسبقًا في Azure أو Google Cloud (مع القوالب ومجموعات المثيلات والتحجيم التلقائي) ؛ على الخادم الخاص بك مع Docker ؛ أو بالطبع Kubernetes! تم إنشاء Kubernetes خصيصًا للمحاكاة الافتراضية والحاويات بواسطة مهندسي Google في عام 2014.

كوبرنيتيس؟ ما هذا؟

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

فلماذا يجب علي استخدامه؟

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

تبدو واعدة! خاصة إذا كان سيوفر المال! دعنا نتحدث عنها أكثر!

تكتسب Kubernetes شعبية يومًا بعد يوم. دعنا نتعمق أكثر ونبحث في ما هو تحت الغطاء.

تحت الغطاء: ما هو Kubernetes؟

ما هو Kubernetes؟ المكونات التي تشكل Kubernetes تحت الغطاء

المكونات التي تتكون منها Kubernetes

Kubernetes هو اسم النظام بأكمله ، ولكن مثل سيارتك ، هناك العديد من القطع الصغيرة التي تعمل معًا في وئام تام لجعل Kubernetes تعمل. دعونا نتعلم ما هم.

العقدة الرئيسية - لوحة تحكم لمجموعة Kubernetes بأكملها. يمكن تشغيل مكونات النظام الرئيسي على أي عقدة في الكتلة. المكونات الرئيسية هي:

  • خادم API: نقطة الدخول لجميع أوامر REST ، المكون الوحيد للعقدة الرئيسية التي يمكن للمستخدم الوصول إليها.
  • Datastore: تخزين قوي ومتسق ومتاح بدرجة عالية للقيمة الرئيسية تستخدمه مجموعة Kubernetes.
  • المجدول: يراقب البودات المنشأة حديثًا ويخصصها للعقد. يحدث نشر البودات والخدمات على العقد بسبب المجدول.
  • مدير وحدة التحكم: يدير جميع وحدات التحكم التي تتعامل مع المهام الروتينية في الكتلة.
  • العقد العاملة: وكيل العقدة الأساسي ، وتسمى أيضًا عقد العميل. يتم تشغيل القرون هنا. تحتوي العقد العاملة على جميع الخدمات اللازمة لإدارة الشبكات بين الحاويات ، والتواصل مع العقدة الرئيسية ، وتخصيص الموارد للحاويات المجدولة.
  • Docker: يتم تشغيله على كل عقدة عامل ويقوم بتنزيل الصور وحاويات البدء.
  • Kubelet: يراقب حالة الكبسولة ويضمن تشغيل الحاويات. كما أنه يتواصل مع مخزن البيانات ، والحصول على معلومات حول الخدمات وكتابة التفاصيل حول الخدمات التي تم إنشاؤها حديثًا.
  • وكيل Kube: وكيل شبكة وموازن تحميل لخدمة على عقدة عاملة واحدة. وهي مسؤولة عن توجيه حركة المرور.
  • Kubectl: أداة CLI للمستخدمين للاتصال بخادم Kubernetes API.

ما هي البودات والخدمات؟

القرون هي أصغر وحدة في مجموعة Kubernetes ، فهي تشبه لبنة واحدة في جدار مبنى ضخم. الكبسولة عبارة عن مجموعة من الحاويات التي تحتاج إلى العمل معًا ويمكنها مشاركة الموارد (مساحات أسماء Linux ومجموعات cgroups وعناوين IP). لا يُقصد من القرون أن تعيش طويلاً.

الخدمات عبارة عن فكرة مجردة على رأس عدد من البودات ، وتتطلب عادةً وكيلاً في الأعلى للخدمات الأخرى للتواصل معها عبر عنوان IP افتراضي.

مثال نشر بسيط

كيف يتفاعل مختلف أصحاب المصلحة مع تطبيق مدعوم من Kubernetes

كيف يتفاعل مختلف أصحاب المصلحة مع تطبيق مدعوم من Kubernetes

سأستخدم تطبيق Ruby on Rails البسيط و GKE كمنصة لتشغيل Kubernetes. في الواقع ، يمكنك استخدام Kubernetes في AWS أو Azure أو حتى إنشاء مجموعة في أجهزتك الخاصة أو تشغيل Kubernetes محليًا باستخدام minikube — جميع الخيارات التي ستجدها في هذه الصفحة.

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

لإنشاء تطبيق ريلز جديد ، نفِّذ:

 rails new blog

لتهيئة اتصال MySQL للإنتاج في config/database.yml file :

 production: adapter: mysql2 encoding: utf8 pool: 5 port: 3306 database: <%= ENV['DATABASE_NAME'] %> host: 127.0.0.1 username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %>

لإنشاء نموذج مقال ، ووحدة تحكم ، وطرق عرض ، وترحيل ، نفِّذ:

 rails g scaffold Article title:string description:text

لإضافة جواهر إلى Gemfile:

 gem 'mysql2', '< 0.6.0', '>= 0.4.4' gem 'health_check'

لإنشاء صورة Docker ، احصل على Dockerfile الخاص بي وقم بتنفيذ:

 docker build -t REPO_NAME/IMAGE_NAME:TAG . && docker push REPO_NAME/IMAGE_NAME:TAG

حان الوقت لإنشاء مجموعة Kubernetes. افتح صفحة GKE وأنشئ مجموعة Kubernetes. عندما يتم إنشاء الكتلة ، انقر فوق "زر الاتصال" وانسخ الأمر — تأكد من تثبيت أداة gCloud CLI (كيفية) و kubectl وتهيئته. قم بتنفيذ الأمر المنسوخ على جهاز الكمبيوتر الخاص بك وتحقق من الاتصال بمجموعة Kubernetes ؛ تنفيذ kubectl cluster-info .

التطبيق جاهز للنشر في مجموعة k8s. لنقم بإنشاء قاعدة بيانات MySQL. افتح صفحة SQL في وحدة تحكم gCloud وأنشئ مثيل MySQL DB للتطبيق. عندما يكون المثيل جاهزًا ، قم بإنشاء المستخدم وقاعدة البيانات وانسخ اسم اتصال المثيل .

نحتاج أيضًا إلى إنشاء مفتاح حساب خدمة في صفحة API والخدمات للوصول إلى قاعدة بيانات MySQL من حاوية جانبية. يمكنك العثور على مزيد من المعلومات حول هذه العملية هنا. أعد تسمية الملف الذي تم تنزيله إلى service-account.json . سنعود لاحقًا إلى هذا الملف.

نحن على استعداد لنشر تطبيقنا على Kubernetes ، ولكن أولاً ، يجب علينا إنشاء أسرار لتطبيقنا - كائن سري في Kubernetes تم إنشاؤه لتخزين البيانات الحساسة. قم بتحميل ملف service-account.json تم تنزيله مسبقًا:

 kubectl create secret generic mysql-instance-credentials \ --from-file=credentials.json=service-account.json

إنشاء أسرار للتطبيق:

 kubectl create secret generic simple-app-secrets \ --from-literal=username=$MYSQL_PASSWORD \ --from-literal=password=$MYSQL_PASSWORD \ --from-literal=database-name=$MYSQL_DB_NAME \ --from-literal=secretkey=$SECRET_RAILS_KEY

لا تنس استبدال القيم أو تعيين متغيرات البيئة بالقيم الخاصة بك.

قبل إنشاء النشر ، دعنا نلقي نظرة على ملف النشر. لقد جمعت ثلاثة ملفات في ملف واحد ؛ الجزء الأول عبارة عن خدمة تعرض المنفذ 80 وتعيد توجيه جميع الاتصالات القادمة إلى المنفذ 80 إلى 3000. تحتوي الخدمة على محدد تعرف الخدمة من خلاله إلى أي pods يجب عليها إعادة توجيه الاتصالات.

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

الجزء الأخير هو Horizontal Pod Autoscaler. HPA لديها تكوين بسيط جدا. ضع في اعتبارك أنه إذا لم تقم بتعيين موارد للحاوية في قسم النشر ، فلن تعمل HPA .

يمكنك تكوين Vertical Autoscaler لمجموعة Kubernetes في صفحة تحرير GKE. كما أن لديها تكوينًا بسيطًا جدًا.

حان الوقت لشحنه إلى كتلة GKE! بادئ ذي بدء ، يجب أن ندير الهجرات عن طريق الوظيفة. نفذ - اعدم:

kubectl apply -f rake-tasks-job.yaml - ستكون هذه الوظيفة مفيدة لعملية CI / CD.

kubectl apply -f deployment.yaml - لإنشاء الخدمة والنشر و HPA.

ثم تحقق من البود الخاص بك عن طريق تنفيذ الأمر: kubectl get pods -w

 NAME READY STATUS RESTARTS AGE sample-799bf9fd9c-86cqf 2/2 Running 0 1m sample-799bf9fd9c-887vv 2/2 Running 0 1m sample-799bf9fd9c-pkscp 2/2 Running 0 1m

لنقم الآن بإنشاء إدخال للتطبيق:

  1. أنشئ عنوان IP ثابتًا: gcloud compute addresses create sample-ip --global
  2. قم بإنشاء ملف الإدخال: kubectl apply -f ingress.yaml
  3. تحقق من إنشاء الإدخال وانتزاع عنوان IP: kubectl get ingress -w
  4. قم بإنشاء المجال / المجال الفرعي لتطبيقك.

CI / قرص مضغوط

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

حاليًا ، لدينا مشروع صغير وبسيط ، لذلك دعونا ننشئ عملية نشر CI / CD مؤتمتة بالكامل وبدون اختبار. أولاً ، يجب عليك دمج CircleCI مع المستودع الخاص بك - يمكنك العثور على جميع التعليمات هنا. ثم يجب علينا إنشاء ملف تكوين مع تعليمات لنظام CircleCI. يبدو التكوين بسيطًا جدًا. النقاط الرئيسية هي أن هناك فرعين في GitHub repo: master production .

  1. الفرع الرئيسي للتطوير ، للكود الجديد. عندما يدفع شخص ما رمزًا جديدًا إلى الفرع الرئيسي ، يبدأ CircleCI سير عمل للفرع الرئيسي - إنشاء كود واختباره.
  2. فرع الإنتاج لنشر إصدار جديد في بيئة الإنتاج. سير العمل لفرع الإنتاج على النحو التالي: دفع رمز جديد (أو حتى أفضل ، فتح العلاقات العامة من الفرع الرئيسي إلى الإنتاج) لبدء عملية إنشاء ونشر جديدة ؛ أثناء الإنشاء ، ينشئ CircleCI صور Docker جديدة ، ويدفعها إلى GCR وينشئ طرحًا جديدًا للنشر ؛ إذا فشل الطرح ، يقوم CircleCI بتشغيل عملية التراجع.

قبل تشغيل أي بناء ، يجب عليك تكوين مشروع في CircleCI. أنشئ حساب خدمة جديدًا في واجهة برمجة التطبيقات وصفحة خدمات في GCloud باستخدام هذه الأدوار: الوصول الكامل إلى GCR و GKE ، وافتح ملف JSON الذي تم تنزيله وانسخ المحتويات ، ثم أنشئ متغير بيئة جديدًا في إعدادات المشروع في CircleCI بالاسم GCLOUD_SERVICE_KEY والصق محتويات ملف حساب الخدمة كقيمة. تحتاج أيضًا إلى إنشاء متغيرات البيئة التالية: GOOGLE_PROJECT_ID (يمكنك العثور عليها على الصفحة الرئيسية لوحدة تحكم GCloud) و GOOGLE_COMPUTE_ZONE (منطقة لمجموعة GKE الخاصة بك) و GOOGLE_CLUSTER_NAME (اسم مجموعة GKE).

ستبدو الخطوة الأخيرة (النشر) في CircleCI كما يلي:

 kubectl patch deployment sample -p '{"spec":{"template":{"spec":{"containers":[{"name":"sample","image":"gcr.io/test-d6bf8/simple:'"$CIRCLE_SHA1"'"}]}}}}' if ! kubectl rollout status deploy/sample; then echo "DEPLOY FAILED, ROLLING BACK TO PREVIOUS" kubectl rollout undo deploy/sample # Deploy failed -> notify slack else echo "Deploy succeeded, current version: ${CIRCLE_SHA1}" # Deploy succeeded -> notify slack fi deployment.extensions/sample patched Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... deployment "sample" successfully rolled out Deploy succeeded, current version: 512eabb11c463c5431a1af4ed0b9ebd23597edd9

خاتمة

يبدو أن عملية إنشاء مجموعة Kubernetes جديدة ليست بهذه الصعوبة! وعملية CI / CD رائعة حقًا!

نعم! Kubernetes رائع! مع Kubernetes ، سيكون نظامك أكثر استقرارًا ، ويمكن إدارته بسهولة ، وسيجعلك قائد نظامك. ناهيك عن أن Kubernetes تلعب النظام قليلاً وستعطي +100 نقطة لتسويقك!

الآن بعد أن انتهيت من الأساسيات ، يمكنك المضي قدمًا وتحويل هذا إلى تكوين أكثر تقدمًا. أخطط لتغطية المزيد في مقال مستقبلي ، ولكن في هذه الأثناء ، إليك تحدٍ: إنشاء مجموعة Kubernetes قوية لتطبيقك باستخدام قاعدة بيانات ذات حالة موجودة داخل المجموعة (بما في ذلك قرص جانبي لعمل النسخ الاحتياطية) ، قم بتثبيت Jenkins داخل نفس مجموعة Kubernetes لخط أنابيب CI / CD ، ودع Jenkins يستخدم القرون كعبيد للبنيات. استخدم Certmanager لإضافة / الحصول على شهادة SSL لدخولك. قم بإنشاء نظام مراقبة وتنبيه لتطبيقك باستخدام Stackdriver.

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

متعلق ب:
  • قم بإجراء العمليات الحسابية: القياس التلقائي لتطبيقات الخدمات المصغرة باستخدام المنسقين
  • K8s / Kubernetes: AWS مقابل GCP مقابل Azure
  • مقارنة شبكة خدمة Kubernetes