سيرشدك هذا البرنامج التعليمي إلى كيفية إعداد Kubernetes عنقودية من الصفر باستخدام Ansible و Kubeadm ومن ثم نشر تطبيق Nginx مجهز بحاويات باستخدامه.
مقدمة
Kubernetes (المعروف أيضًا باسم k8s أو “kube”) هو منصة مفتوحة المصدر لتنسيق الحاويات تقوم بأتمتة العديد من العمليات اليدوية المتضمنة في نشر التطبيقات المجهزة بحاويات وإدارتها وتوسيع نطاقها. يمتلك Kubernetes مجتمعًا مفتوح المصدر سريع النمو، يساهم بنشاط في المشروع. ألقِ نظرة على منشور المدونة الخاص بنا والذي سيعرفك على كل ما تحتاج لمعرفته حول أساسيات منصة Kubernetes.
Kubeadm هي أداة تقوم بتهيئة العديد من العناصر والأجزاء المدمجة مثل خادم API، وController Manager، وKube DNS. كما أنها تساعد في أتمتة التثبيت. ومع ذلك، فإنها لا تنشئ مستخدمين أو تتعامل مع تثبيت التبعيات على مستوى نظام التشغيل وتهيئتها، ولا يمكنها توفير بنيتك التحتية.
Ansible هي أداة مفتوحة المصدر لتوفير البرمجيات ونشر التطبيقات. Saltstack هو برنامج مفتوح المصدر لأتمتة تكنولوجيا المعلومات القائمة على الأحداث. هاتان هما الأداتان اللتان تجعلان إنشاء مجموعات إضافية أو إعادة إنشاء المجموعات الحالية أقل عرضة للأخطاء ويمكن استخدامهما لهذه المهام الأولية.
الأهداف:
ستتضمن مجموعتك الموارد المادية التالية:
1. عقدة رئيسية واحدة:
العقدة الرئيسية هي عقدة تتحكم وتدير مجموعة من عقد العمل (وقت تشغيل أعباء العمل) وتشبه مجموعة في Kubernetes. كما أنها تحتوي على خطة موارد العقدة لتحديد الإجراء المناسب للحدث الذي تم تحفيزه. وهي تقوم بتشغيل etcd، وهو مخزن قيم-مفاتيح موزع مفتوح المصدر يُستخدم للاحتفاظ ببيانات المجموعة وإدارتها بين المكونات التي تجدول أعباء العمل لعقد العمل.
على سبيل المثال، سيحدد المجدول أي عقدة عمل ستستضيف POD المجدول حديثًا.
2. عقدتا عمل:
عقد العمل هي العقد التي تستمر في عملها المعين حتى لو توقفت العقدة الرئيسية بمجرد اكتمال الجدولة. عقد العمل هي الخوادم التي ستعمل عليها أعباء العمل الخاصة بك (أي التطبيقات والخدمات المجهزة بحاويات). يمكنك أيضًا زيادة سعة المجموعة عن طريق إضافة عمال.
بمجرد إكمال هذا البرنامج التعليمي، سيكون لديك مجموعة تعمل بكامل طاقتها وجاهزة لتشغيل أعباء العمل (أي التطبيقات والخدمات المجهزة بحاويات) بافتراض أن الخوادم في المجموعة لديها موارد كافية من المعالج (CPU) والذاكرة (RAM) لتشغيل تطبيقاتك. بعد إعداد المجموعة بنجاح، يمكنك تشغيل أي تطبيق UNIX تقليدي تقريبًا. ويمكن وضعه في حاوية على مجموعتك، بما في ذلك تطبيقات الويب وقواعد البيانات والبرامج الخلفية (daemons) وأدوات سطر الأوامر.
ستستهلك المجموعة نفسها حوالي 300-500 ميجابايت من الذاكرة و10% من المعالج (CPU) على كل عقدة.
المتطلبات الأساسية:
- يجب أن يكون لديك زوج مفاتيح SSH على جهاز Linux المحلي الخاص بك ومعرفة كيفية استخدام مفاتيح SSH. ومع ذلك، إذا لم تكن قد استخدمت مفاتيح SSH من قبل، فيمكنك مراجعة هذا البرنامج التعليمي لمساعدتك في إعداد مفاتيح SSH على جهازك المحلي.
- ثلاثة خوادم تعمل بنظام التشغيل Ubuntu 18.04 مع ذاكرة وصول عشوائي (RAM) بسعة 4 جيجابايت على الأقل و4 معالجات افتراضية (vCPUs) لكل منها. يجب أن تكون قادرًا على الاتصال عبر SSH بكل خادم كمستخدم root باستخدام زوج مفاتيح SSH الخاص بك. اتبع هذا البرنامج التعليمي لتثبيت خادم Ubuntu الخاص بك.
- تثبيت Ansible على جهازك المحلي.
- يجب أن تكون أيضًا على دراية بـ Ansible playbooks.
- ستحتاج أيضًا إلى معرفة كيفية تشغيل حاوية من صورة Docker. انظر إلى “الخطوة 5 — العمل مع صور Docker في Ubuntu” في كيفية تثبيت واستخدام Docker على Ubuntu 18.04 إذا كنت بحاجة إلى تنشيط معلوماتك.
الخطوة 1 — إعداد دليل مساحة العمل وملف جرد Ansible
تحتاج أولاً إلى إعداد Ansible على جهازك المحلي. سيساعدك ذلك على تنفيذ الأوامر على خادمك البعيد. كما أنه يسهل جهد النشر اليدوي عن طريق أتمتته. لهذا، ستحتاج إلى إنشاء دليل على جهازك المحلي ليكون بمثابة منطقة تخزين رقمية مؤقتة (مساحة العمل).
بمجرد إنشاء الدليل، ستقوم بإنشاء hosts ملف لتخزين جميع المعلومات حول عناوين IP الخاصة بكل خادم ومجموعته. سيساعدك على تخزين معلومات المخزون بداخله. وكما ذكرنا سابقًا، سيكون هناك ثلاثة خوادم، خادم رئيسي (master) وخادمان عاملان (workers). سيكون الخادم الرئيسي هو الماستر مع عنوان IP معروض كـ master_ip. سيكون الخادمان الآخران عاملين وسيكون لهما عناوين IP worker_1_ip و worker_2_ip.
تحتاج إلى إنشاء دليل باسم ~/kube-cluster في الدليل الرئيسي لجهازك المحلي والدخول إلى الدليل باستخدام الأمر cd:
|
1 2 |
mkdir ~/kube-cluster cd ~/kube-cluster |
سيعمل الدليل ~/kube-cluster الآن كمنطقة تخزين رقمية مؤقتة (مساحة عمل) ستقوم بداخلها بتشغيل جميع الأوامر المحلية لإنشاء عنقود Kubernetes باستخدام kubeadm. سيحتوي الدليل على جميع ملفات playbooks الخاصة بـ Ansible وسيتم استخدامه لبقية هذا البرنامج التعليمي.
إنشاء ملف المضيفين (Hosts File)
أنشئ ملفًا باسم ~/kube-cluster/hosts باستخدام nano أو محرر النصوص المفضل لديك:
|
1 |
nano ~/kube-cluster/hosts |
الآن ستحتاج إلى إضافة النص التالي، والذي سيحدد معلومات حول البنية المنطقية للعنقود الخاص بك:
|
1 2 3 4 5 6 7 8 9 |
[masters] master ansible_host=master_ip ansible_user=root [workers] worker1 ansible_host=worker_1_ip ansible_user=root worker2 ansible_host=worker_2_ip ansible_user=root [all:vars] ansible_python_interpreter=/usr/bin/python3 |
وكما ذكرنا، سيساعدك ملف المخزون (inventory) هذا على تخزين جميع المعلومات حول عناوين IP الخاصة بخوادمك والمجموعات التي ينتمي إليها كل خادم. ~/kube-cluster/hosts سيكون ملف المخزون الخاص بك و (masters و workers) هما مجموعتا Ansible اللتان أضفتهما إليه لتحديد البنية المنطقية للعنقود الخاص بك.
إن مجموعة Master هي المجموعة التي تحدد أنه يجب على Ansible تشغيل الأوامر عن بُعد كمستخدم root. كما أنها تسرد عنوان IP الخاص بالعقدة الرئيسية (master_ip) الذي يمكن إدراجه بواسطة إدخال الخادم المسمى “master”. وبالمثل، فإن مجموعة Workers تحتوي على إدخالين لخوادم العمال (worker_1_ip و worker_2_ip) اللذين يحددان أيضًا ansible_user كـ root.
يخبر السطر الأخير من الملف أداة Ansible باستخدام مفسرات Python 3 الخاصة بالخوادم البعيدة لعمليات الإدارة الخاصة بها. وأخيرًا، تحتاج إلى حفظ الملف وإغلاقه بعد إضافة النص. بعد إعداد دليل مساحة العمل وملف مخزون Ansible، دعنا ننتقل إلى الخطوة التالية المتمثلة في تثبيت التبعيات على مستوى نظام التشغيل وإنشاء إعدادات التكوين.
الخطوة 2 — إنشاء مستخدم ليس root على جميع الخوادم البعيدة
في هذه الخطوة، ستتعلم كيفية إنشاء مستخدم ليس root ولديه امتيازات sudo على جميع الخوادم حتى تتمكن من الاتصال بها عبر SSH يدويًا كمستخدم غير متميز.
يمكن أن يكون هذا مفيدًا للعمليات التي يتم إجراؤها بشكل متكرر للحفاظ على العنقود. علاوة على ذلك، ستساعدك هذه الخطوة على أداء المهمة بدقة أكبر وبأقل عرضة للأخطاء، مما يقلل من فرص تعديل أو حذف الملفات المهمة دون قصد. إذا كنت تريد تغيير إعداد الملفات المملوكة لـ root أو عرض معلومات النظام باستخدام أوامر مثل top/htop وعرض قائمة بالحاويات قيد التشغيل، فإن الخطوة التالية ستساعدك على أداء جميع المهام.
إنشاء الـ Playbook
أنشئ ملفًا باسم ~/kube-cluster/initial.yml في مساحة العمل:
|
1 |
nano ~/kube-cluster/initial.yml |
بعد ذلك، تحتاج إلى إضافة الـ play التالي. الـ play في Ansible عبارة عن مجموعة من الخطوات التي سيتم تنفيذها والتي تستهدف خوادم ومجموعات معينة. يمكن أن يكون هناك play واحد أو أكثر في الـ playbook.
سيقوم الـ play التالي بإنشاء مستخدم sudo ليس root:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
- hosts: all become: yes tasks: - name: إنشاء الـ 'ubuntu' مستخدم user: name=ubuntu append=yes state=present createhome=yes shell=/bin/bash - name: السماح لـ 'ubuntu' بالحصول على صلاحيات بدون كلمة مرور لـ sudo lineinfile: dest: /etc/sudoers line: 'ubuntu ALL=(ALL) NOPASSWD: ALL' validate: 'visudo -cf %s' - name: إعداد up المفاتيح المصرح بها لمستخدم the ubuntu user authorized_key: user=ubuntu key="{{item}}" with_file: - ~/.ssh/id_rsa.pub |
فيما يلي تفصيل لما يفعله دليل التشغيل (playbook) الخاص بنا:
- سيقوم دليل التشغيل هذا بإنشاء مستخدم غير جذري (non-root) باسم
ubuntu. - بما أنك بحاجة إلى تشغيل أوامر
sudoدون الحصول على مطالبة بكلمة مرور، فإن هذا التشغيل سيقوم بتهيئة ملفsudoersللسماح للمستخدمubuntuبالقيام بذلك. - الهدف الرئيسي من المهمة المذكورة أعلاه هو السماح لك بالاتصال عبر SSH بكل خادم كمستخدم
ubuntu. يضيف دليل التشغيل هذا المفتاح العام لجهازك المحلي (عادةً~/.ssh/id_rsa.pub) إلى قائمة المفاتيح المصرح بها لمستخدمubuntuالبعيد.
الآن، بعد إضافة النص، تحتاج إلى حفظ الملف وإغلاقه.
تشغيل دليل التشغيل (playbook)
بعد ذلك، نحتاج إلى تنفيذ دليل التشغيل الخاص بنا الذي سيقوم بإنشاء مستخدم ubuntu غير الجذري ببساطة عن طريق التشغيل على الأجهزة المحلية:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/initial.yml |
سيستغرق تنفيذ هذا الأمر بعض الوقت، وبعد ذلك ستظهر لك المخرجات التالية:

بعد اكتمال هذه الخطوة، يمكنك الانتقال إلى تثبيت التبعيات الخاصة بـ Kubernetes في الخطوة التالية.
الخطوة 3 — تثبيت تبعيات Kubernetes
في هذه الخطوة، ستتعلم كيفية تثبيت الحزم على مستوى نظام التشغيل المطلوبة بواسطة Kubernetes باستخدام مدير حزم Ubuntu.
هذه الحزم هي:
- Docker: Docker عبارة عن منصة وأداة لبناء وتوزيع وتشغيل حاويات Docker. يمكنك إعداد Docker بسهولة باتباع دليلنا التعليمي حول كيفية تثبيت & تشغيل Docker على Ubuntu في السحابة العامة. ومع ذلك، فإن دعم بيئات التشغيل الأخرى مثل rkt قيد التطوير النشط في Kubernetes.
Kubeadm: kubeadm هي أداة واجهة سطر أوامر (CLI) تقوم بالإجراءات اللازمة لتشغيل حد أدنى من العنقود (cluster) الصالح للعمل. سيساعدك ذلك على تثبيت وبناء المكونات المختلفة للعنقود بطريقة قياسية.kubelet: الـ kubelet هو "عميل العقدة" (node agent) الرئيسي الذي يعمل على كل عقدة ويتعامل مع العمليات على مستوى العقدة.kubectl: kubectl هي أيضًا أداة واجهة سطر أوامر (CLI) تتصل بالعنقود الخاص بك وتصدر الأوامر من خلال خادم واجهة برمجة التطبيقات (API Server) الخاص به.
إنشاء دليل التشغيل (playbook)
أنشئ ملفًا باسم ~/kube-cluster/kube-dependencies.yml في مساحة العمل:
|
1 |
nano ~/kube-cluster/kube-dependencies.yml |
الآن تحتاج إلى إضافة التشغيلات التالية إلى الملف لتثبيت الحزم التالية على خوادمك:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
- hosts: all become: yes tasks: - name: تثبيت Docker apt: name: docker.io state: present update_cache: true - name: تثبيت APT Transport HTTPS apt: name: apt-transport-https state: present - name: إضافة Kubernetes apt-key apt_key: url: https://packages.cloud.google.com/apt/doc/apt-key.gpg validate_certs: false state: present - name: إضافة مستودع Kubernetes الخاص بـ APT apt_repository: repo: deb http://apt.kubernetes.io/ kubernetes-xenial main state: present filename: 'kubernetes' - name: تثبيت kubelet apt: name: kubelet=1.16.0-00 state: present update_cache: true - name: تثبيت kubeadm apt: name: kubeadm=1.16.0-00 state: present - hosts: master become: yes tasks: - name: تثبيت kubectl apt: name: kubectl=1.16.0-00 state: present force: yes |
يقوم التشغيل الأول في دليل المخطط (playbook) بما يلي:
- سيساعدك هذا التشغيل على تثبيت حزم على مستوى نظام التشغيل، Docker – بيئة تشغيل الحاويات.
- يقوم بتثبيت
apt-transport-https، مما يتيح لك إضافة مصادر HTTPS خارجية إلى قائمة مصادر APT الخاصة بك. - يضيف مفتاح apt الخاص بمستودع Kubernetes APT للتحقق من المفتاح.
- يضيف مستودع Kubernetes APT إلى قائمة مصادر APT الخاصة بالخوادم البعيدة.
- يقوم بتثبيت
kubeletوkubeadm.
يقوم التشغيل الثاني بمهمة فردية وهامة تتضمن تثبيت kubectl على العقدة الرئيسية (master node). الآن، بعد إضافة النص، تحتاج إلى حفظ الملف وإغلاقه.
تشغيل دليل المخطط (playbook)
بعد ذلك، نحتاج إلى تنفيذ دليل المخطط الخاص بنا ببساطة عن طريق التشغيل على الأجهزة المحلية:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml |
سيستغرق تنفيذ هذا الأمر بعض الوقت، وبعد ذلك ستظهر لك المخرجات التالية:

بعد التنفيذ، سيتم تثبيت Docker و kubeadm و kubelet على جميع الخوادم البعيدة. لا يعد Kubectl مكونًا مطلوبًا وهو مطلوب فقط لتنفيذ أوامر العنقود (cluster). وتثبيته على العقدة الرئيسية فقط أمر منطقي في هذا السياق لأنك ستقوم بتشغيل kubectl فقط من العقدة الرئيسية. ومع ذلك، يرجى ملاحظة أن kubectl يمكن تشغيل الأوامر من أي من عقد العمل أو من أي جهاز يمكن تثبيته وتهيئته للإشارة إلى العنقود.
تم الآن تثبيت جميع تبعيات النظام. لنقم بإعداد العقدة الرئيسية وتهيئة العنقود.
الخطوة 4 — إعداد العقدة الرئيسية
في هذه الخطوة، ستتعرف على بعض المفاهيم مثل Pods و إضافات شبكة Pod بما أن العنقود الخاص بك سيشمل كليهما بمجرد إعداد العقدة الرئيسية.
تعد الـ Pods أصغر الكائنات القابلة للنشر وأكثرها أساسية في Kubernetes. تحتوي الـ Pods على حاوية واحدة أو أكثر، مثل حاويات Docker. عندما تقوم الـ Pod بتشغيل حاويات متعددة، يتم إدارة هذه الحاويات ككيان واحد وتتشارك موارد الـ Pod.
لكل pod عنوان IP خاص به، ويجب أن يكون الـ pod الموجود على عقدة ما قادرًا على الوصول إلى pod على عقدة أخرى باستخدام عنوان IP الخاص بالـ pod. ومع ذلك، فإن الاتصال بين الـ pods أكثر تعقيدًا. فهو يحتاج إلى مكون منفصل يمكنه توجيه حركة المرور بشكل شفاف من pod على عقدة إلى pod على عقدة أخرى. تُستخدم إضافات شبكة pod لهذه الوظيفة. تتوفر العديد من إضافات شبكة pod، ولكننا سنستخدم Flannel لأنه خيار مستقر وفعال.
إنشاء دليل التشغيل
قم بإنشاء دليل تشغيل Ansible باسم master.yml على جهازك المحلي:
|
1 |
nano ~/kube-cluster/master.yml |
علاوة على ذلك، تحتاج إلى إضافة التشغيل التالي إلى الملف لتهيئة العنقود وتثبيت Flannel:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
- hosts: master become: yes tasks: - name: تهيئة الـ عنقود shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt args: chdir: $HOME creates: cluster_initialized.txt become: yes become_user: root - name: إنشاء .مجلد kube become: yes become_user: ubuntu file: path: $HOME/.kube state: directory mode: 0755 - name: نسخ admin.conf إلى إعدادات 'kube للمستخدم config copy: src: /etc/kubernetes/admin.conf dest: /home/ubuntu/.kube/config remote_src: yes owner: ubuntu - name: تثبيت شبكة Pod become: yes become_user: ubuntu shell: kubectl apply -f https:https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml >> pod_network_setup.txt args: chdir: $HOME creates: pod_network_setup.txt |
إليك تفصيل هذا الـ play:
- المهمة الأولى في هذا الـ play ستقوم بإعداد العنقود عن طريق تشغيل
kubeadm init. لتحديد الشبكة الفرعية الخاصة التي سيتم تخصيص عناوين IP الخاصة بالـ pod لها، نقوم بتمرير الوسيط--pod-network-cidr=10.244.0.0/16. يستخدم Flannel الشبكة الفرعية المذكورة أعلاه افتراضيًا. نحن نستخدم هذا لإخبارkubeadmباستخدام نفس الشبكة الفرعية. - تُستخدم المهمة الثانية لإنشاء دليل
.kubeفي/home/ubuntu. سيحتوي هذا الدليل على معلومات التكوين مثل ملفات مفاتيح المسؤول، المطلوبة للاتصال بالعنقود وعنوان API الخاص بالعنقود. - تُستخدم المهمة الثالثة لنسخ ملف
/etc/kubernetes/admin.confالذي تم إنشاؤه منkubeadm initإلى الدليل الرئيسي للمستخدم غير الجذر. سيسمح لك هذا باستخدامkubectlللوصول إلى العنقود الذي تم إنشاؤه حديثًا. - المهمة الأخيرة تقوم بتشغيل
kubectl applyلتثبيتFlannel.kubectl apply -f descriptor.[yml|json]هي الصيغة لإخبارkubectlبإنشاء الكائنات الموصوفة في ملفdescriptor.[yml|json]. يحتوي ملفkube-flannel.ymlعلى أوصاف الكائنات المطلوبة لإعدادFlannelفي العنقود.
الآن، بعد إضافة النص، تحتاج إلى حفظ الملف وإغلاقه.
تشغيل الـ Playbook
بعد ذلك، تحتاج إلى تنفيذ الـ playbook الخاص بنا ببساطة عن طريق التشغيل على الأجهزة المحلية:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/master.yml |
سيستغرق تنفيذ هذا الأمر بعض الوقت، وبعد ذلك سترى المخرجات التالية:

الآن قم بالاتصال عبر SSH باستعمال الأمر التالي للتحقق من حالة العقدة الرئيسية:
|
1 |
ssh ubuntu@master_ip |
بمجرد الدخول إلى العقدة الرئيسية، قم بتنفيذ:
|
1 |
kubectl get nodes |
سترى الآن المخرجات التالية:

عند الحصول على المخرجات المذكورة أعلاه، يمكنك التأكيد على أن جميع مهام الإعداد قد تم إنجازها بواسطة العقدة الرئيسية ويمكنها البدء في قبول عقد العمل وتنفيذ المهام بمجرد دخولها في حالة جاهزة (Ready). يمكنك الآن إضافة عقد العمل من جهازك المحلي.
الخطوة 5 — إعداد عقد العمل
بعد إعداد العقدة الرئيسية، يمكننا الآن الانتقال إلى خطوتنا التالية وهي إعداد عقد العمل. يمكن إضافة عقد العمل إلى العنقود ببساطة عن طريق تنفيذ أمر واحد على كل خادم عمل. يتم تضمين المعلومات الهامة مثل عنوان IP، ومنفذ خادم API الخاص بالعقدة الرئيسية، والرمز المميز الآمن (secure token) في هذا الأمر. ومع ذلك، يجب أن تلاحظ أنه لن تتمكن جميع العقد من الانضمام إلى العنقود، بل فقط تلك العقد التي تمرر الرمز المميز الآمن هي التي ستتمكن من الانضمام.
إنشاء الـ playbook
سيساعدك هذا الأمر على العودة إلى مساحة العمل الخاصة بك وإنشاء playbook باسم workers.yml:
|
1 |
nano ~/kube-cluster/workers.yml |
أضف النص التالي إلى الملف لإضافة عقد العمل إلى العنقود:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
- hosts: master become: yes gather_facts: false tasks: - name: get join command shell: kubeadm token create --print-join-command register: join_command_raw - name: set join command set_fact: join_command: "{{ join_command_raw.stdout_lines[0] }}" - hosts: workers become: yes tasks: - name: join cluster shell: "{{ hostvars['master'].join_command }} >> node_joined.txt" args: chdir: $HOME creates: node_joined.txt |
إليك ما يفعله الـ playbook. هناك تشغيلان في الكود أعلاه:
- يُستخدم التشغيل الأول للحصول على أمر الانضمام الذي يجب تشغيله على عقد العمل. سيكون تنسيق الأمر كالتالي:
kubeadm join --token sha256:<hash><token><master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>;. تحتاج المهمة إلى الحصول على قيم الرمز المميز (token) والهاش (hash) الصحيحة. بمجرد حصولها على المدخلات الصحيحة، تقوم المهمة بتعيينها كحقيقة (fact) حتى يتمكن التشغيل الثاني من الوصول إلى تلك المعلومات. - تمت كتابة التشغيل الثاني فقط لأداء مهمة فردية – لجعل عقدتي العمل جزءًا من العنقود ببساطة عن طريق تشغيل أمر الانضمام على جميع عقد العمل.
بعد إضافة النص، تحتاج إلى حفظ الملف وإغلاقه.
تشغيل الـ playbook
بعد ذلك، نحتاج إلى تنفيذ الـ playbook الخاص بنا عن طريق تشغيل الأمر التالي على أجهزة العمل:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/workers.yml |
سيستغرق تنفيذ هذا الأمر بعض الوقت، وبعد ذلك سترى المخرجات التالية:

الآن، تم إعداد عنقود Kubernetes الخاص بك بالكامل وهو يعمل بكفاءة مع استعداد عقد العمل لتشغيل أعباء العمل. قبل الانتقال إلى الخطوة التالية، دعنا نتحقق من أن العنقود يعمل كما هو مخطط له.
الخطوة 6 — التحقق من العنقود
قد تكون هناك حالات يفشل فيها العنقود أثناء الإعداد. قد يكون ذلك بسبب خطأ في الشبكة بين العقدة الرئيسية وعقدة العمل، أو مشكلة في العقدة نفسها. لذلك نحن بحاجة إلى التحقق من العنقود قبل جدولة التطبيقات والتأكد من عدم حدوث أي خلل. لهذا، ستحتاج إلى التحقق من الحالة الحالية للعنقود من العقدة الرئيسية للتأكد من أن العقد جاهزة. يمكنك استعادة الاتصال بالأمر التالي إذا لم تكن العقد جاهزة أو إذا انقطع اتصالك:
|
1 |
ssh ubuntu@master_ip |
استخدم الأوامر التالية للحصول على حالة العنقود:
|
1 |
kubectl get nodes |
سيستغرق تنفيذ هذا الأمر بعض الوقت، وبعد ذلك سترى المخرجات التالية:

تحتاج إلى التحقق مما إذا كانت جميع العقد التي تشكل جزءًا من العنقود في حالة الاستعداد. إذا كانت بعض العقد تحتوي على Not Ready كـ STATUS، فهذا يوضح أن عقد العمل لم تنتهِ من إعدادها بعد. ومع ذلك، قبل إعادة تشغيل kubectl get nodes والتحقق من المخرجات المحدثة، يجب عليك الانتظار لمدة خمس إلى عشر دقائق أخرى. إذا كانت بعض العقد لا تزال تظهر Not Ready كحالة لها، يجب عليك الذهاب والتحقق من الخطوات السابقة وإعادة تشغيل الأوامر. فقط إذا كانت العقد تحتوي على القيمة Ready لـ STATUS، فإنها تكون جزءًا من العنقود وجاهزة لتشغيل أعباء العمل. بعد تنفيذ الخطوة السادسة بنجاح، تم الآن التحقق من العنقود الخاص بك. الآن دعنا نجدول تطبيق Nginx كمثال على العنقود.
الخطوة 7 — تشغيل تطبيق على العنقود
إنشاء Deployment
بعد إنشاء العنقود بنجاح، يمكنك نشر أي تطبيق معبأ في حاويات في العنقود الخاص بك. يمكنك استخدام الأوامر التالية أدناه للتطبيقات الأخرى المعبأة في حاويات إذا كنت داخل العقدة الرئيسية. بعد ذلك، نفذ الأمر التالي لإنشاء deployment باسم nginx :
|
1 |
kubectl create deployment nginx --image=nginx |
تحتاج إلى تغيير اسم صورة Docker وأي علامات ذات صلة (مثل المنافذ والأحجام). لإبقاء الأمور مألوفة، يمكنك نشر Nginx باستخدام الـ deployments والـ services لمعرفة كيفية نشر التطبيقات في العنقود.
إن Kubernetes deployment هو كائن مورد في Kubernetes يوفر تحديثات تعريفية للتطبيقات. يتيح لك النشر (deployment) وصف دورة حياة التطبيق، مثل صورة الحاوية (container image)، والنسخ المتطابقة (replicas)، واستراتيجية التحديث. يضمن النشر تشغيل العدد المطلوب من الـ pods وإتاحتها في جميع الأوقات. إذا تعطل pod أثناء دورة حياة المجموعة (cluster)، فإنه يقوم بإنشائه مرة أخرى. كما يتم تسجيل عملية التحديث بالكامل وإصدارها مع خيارات للإيقاف المؤقت والاستمرار والتراجع إلى الإصدارات السابقة. سيساعدك الأمر أعلاه لإنشاء نشر باسم Nginx في نشر pod بحاوية واحدة من صورة Docker الخاصة بـ Nginx في سجل Docker.
إعداد Node Port
بعد ذلك، نحتاج إلى إنشاء NodePort. NodePort هو منفذ مفتوح على كل عقدة في مجموعتك (cluster). يقوم Kubernetes بتوجيه حركة المرور الواردة بشفافية على NodePort إلى خدمتك، حتى لو كان تطبيقك يعمل على عقدة أخرى. لهذا يمكننا استخدام هذا الأمر لإنشاء مورد NodePort باسم Nginx والذي سيقوم بنشر التطبيق علنًا:
|
1 |
kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort |
الخدمة (Service) هي كائن آخر في Kubernetes مسؤول عن كشف واجهة لتلك الـ pods، مما يتيح الوصول إلى الشبكة إما من داخل المجموعة (cluster) أو بين العمليات الخارجية والخدمة. يمكن تعريفها على أنها تجريد فوق الـ pod يوفر عنوان IP واحدًا واسم DNS يمكن من خلاله الوصول إلى الـ pods. باستخدام الخدمة، يسهل جدًا إدارة تكوين موازنة التحميل.
قم بتشغيل الأمر التالي:
|
1 |
kubectl get services |
سيؤدي هذا إلى إخراج نص مشابه لما يلي:

بعد الحصول على المخرجات، سيقوم Kubernetes بتعيين منفذ عشوائي أكبر من 30000 تلقائيًا، مع التأكد أيضًا من أن المنفذ المعين ليس مرتبطًا بالفعل بخدمة أخرى. سيساعدك السطر الثالث من المخرج أعلاه في استرداد المنفذ الذي يعمل عليه Nginx.
للتحقق من أنه يعمل، قم بزيارة http://worker_1_ip:nginx_port أو http://worker_2_ip:nginx_port من خلال متصفح على جهازك المحلي. سترى صفحة ترحيب Nginx المألوفة.
إزالة النشر (Deployment)
إذا كنت ترغب في إزالة تطبيق Nginx، فستحتاج أولاً إلى حذف خدمة nginx من العقدة الرئيسية (master node):
|
1 |
kubectl delete service nginx |
للتحقق من حذف التطبيق نهائيًا، تحتاج إلى تشغيل هذا الأمر:
|
1 |
kubectl get services |
ستحصل على المخرجات التالية:

بعد ذلك، تحتاج إلى حذف النشر (deployment) باستخدام الأمر التالي:
|
1 |
kubectl delete deployment nginx |
يمكنك استخدام هذا الأمر للتحقق مما إذا كان قد تم حذف النشر نهائيًا:
|
1 |
kubectl get deployments |
![]()
الخاتمة:
سيساعدك هذا البرنامج التعليمي على إعداد مجموعة (cluster) بشكل صحيح على Ubuntu 18.04 باستخدام Kubeadm و Ansible. الآن بعد إعداد مجموعتك، يمكنك بسهولة البدء في نشر تطبيقاتك وخدماتك الخاصة.
إليك قائمة بالروابط التي تحتوي على تفاصيل إضافية ستوجهك في هذه العملية:
- Dockerizing applications – يحتوي هذا الرابط على أمثلة ترشدك إلى كيفية تحميل التطبيقات باستخدام Docker. مثل تحويل PostgreSQL إلى حاوية Docker، وخدمة CouchDB، وما إلى ذلك.
- Pod Overview – يعرض هذا الرابط تفاصيل حول كيفية استخدام الـ pod، وآلية عمل الـ pods، وكيفية ارتباط الـ pods بكائنات Kubernetes الأخرى. تعد الـ pods جزءًا مهمًا من Kubernetes، لذا فإن فهمها سيساعدك على النجاح في مهمتك.
- Deployments Overview – سيساعدك هذا على التعرف على عمليات النشر (deployments). يوفر النشر تحديثات تعريفية للـ Pods و ReplicaSets. ستتعلم كيفية تحديث النشر وتدويره والتراجع عنه.
- Services Overview - سيرشدك هذا الرابط حول الخدمات التي تعد كائنًا آخر متكرر الاستخدام في مجموعات Kubernetes. الخدمة في Kubernetes هي تجريد يحدد مجموعة منطقية من الـ Pods وسياسة يمكنك من خلالها الوصول إليها. يعد فهم أنواع الخدمات والخيارات المتاحة لها أمرًا ضروريًا لتشغيل كل من التطبيقات عديمة الحالة (stateless) والتطبيقات ذات الحالة (stateful).
علاوة على ذلك، ألقِ نظرة على دروسنا التعليمية الأخرى التي تركز على Docker و Kubernetes والتي يمكنك العثور عليها في مدونتنا:
- التعرف على Kubernetes
- تنظيف موارد Docker – الصور، والحاويات، ووحدات التخزين
- كيفية تشغيل Docker على CloudSigma (باستخدام CloudInit) محدث
- تثبيت وإعداد Docker على CentOS 7
- كيفية تثبيت & تشغيل Docker على Ubuntu في السحابة العامة
هناك أيضًا العديد من المفاهيم المهمة الأخرى مثل وحدات التخزين, مكونات Ingress، و البيانات السرية التي يمكنك استخدامها أثناء نشر تطبيقات الإنتاج.
حوسبة سعيدة!
التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.