العودة إلى المدونة

نشر تطبيق PHP على عنقود Kubernetes باستخدام Ubuntu 18.04

نشر تطبيق PHP على عنقود Kubernetes باستخدام Ubuntu 18.04

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

يعمل Nginx كوكيل لـ PHP-FPM أثناء تشغيل تطبيق PHP. تعد إدارة هاتين الخدمتين في حاوية واحدة عملية صعبة. يساعدنا Kubernetes في إدارتهما في حاويتين مختلفتين ويقلل من المتاعب. كما يتيح للمستخدمين إعادة استخدام الحاويات وعدم القلق بشأن بناء صورة الحاوية الخاصة بهم لكل إصدار جديد من PHP/Nginx.

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

المتطلبات الأساسية

  1. فهم أساسي لـ Kubernetes (k8s) وكائناته. راجع هذا الدليل للحصول على نظرة عامة مفصلة على نظام Kubernetes البيئي.
  2. عنقود Kubernetes يعمل وجاهز على Ubuntu 18.04. اتبع هذا البرنامج التعليمي لـ إنشاء عنقود Kubernetes الخاص بك باستخدام kubeadm.
  3. بالإضافة إلى ذلك، تحتاج إلى استضافة كود تطبيقك على عنوان URL عام، على سبيل المثال، GitHub.

الخطوة 1: إنشاء خدمات PHP-FPM و Nginx

ستساعدك هذه الخطوة في إنشاء خدمات PHP-FPM و Nginx. توفر أي خدمة إمكانية الوصول إلى مجموعة من الـ pods داخل العنقود. يمكن لجميع الخدمات الموجودة في العنقود الاتصال ببعضها البعض بأسمائها، دون عناوين IP. ستوفر خدمة PHP-FPM وخدمة Nginx إمكانية الوصول إلى pods الخاصة بـ PHP-FPM و Nginx، على التوالي.

ستحتاج إلى إخبار خدمة PHP-FPM بكيفية العثور على pods الخاصة بـ Nginx لأنها ستعمل كوكيل لـ pods الخاصة بـ PHP-FPM. لهذا، ستستفيد من الاكتشاف التلقائي للخدمات في Kubernetes’ وتستخدم أسماء سهلة القراءة لتوجيه الطلب إلى الخدمة المعنية.

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

  1. apiVersion: إصدار Kubernetes API الذي ينتمي إليه التعريف.
  2. kind: نوع كائن Kubernetes الذي ينشئه ملف YAML هذا. على سبيل المثال: service، أو job، أو pod.
  3. metadata: يتم تعريف اسم الكائن والـ labels المختلفة التي قد يرغب المستخدم في تطبيقها على هذا الكائن تحت هذه العلامة.
  4. spec: تحتوي هذه العلامة على مواصفات الكائن الخاص بك، مثل متغيرات البيئة (ENVs)، وصورة الحاوية المراد استخدامها، والمنافذ التي ستكون خدمة الحاوية متاحة من خلالها.
إنشاء خدمة PHP-FPM

للبدء، يجب عليك إنشاء دليل للاحتفاظ بتعريف كائن Kubernetes الخاص بك. قم بتسجيل الدخول إلى العقدة الرئيسية (master node) الخاصة بك وأنشئ دليلاً باسم “definitions:”

قم بتغيير الدليل إلى دليل definitions:

بعد ذلك، قم بإنشاء ملف خدمة PHP-FPM كملف php_service.yaml :

بعد ذلك، قم بتعيين apiVersion و kind في ملف php_fpm_service.yaml :

قم بتسمية خدمتك باسم php أو php-fpm لأنها ستوفر إمكانية الوصول إلى تطبيق PHP-FPM الخاص بك:

قم بتسمية خدمة php الخاصة بك بـ tier: backend حيث سيتم تشغيل تطبيق PHP خلف هذه الخدمة:

تستخدم الخدمة تسميات selector لتحديد الـ pods التي سيتم الوصول إليها. يتم تقديم الخدمة لأي pod يطابق هذه التسميات، بغض النظر عن وقت إنشاء الـ pod. ستتعلم كيفية إضافة تسميات إلى الـ pods الخاصة بك لاحقًا في هذا البرنامج التعليمي.

قم بتضمين tier: backend الذي يخصص الـ pod الخاص بك إلى طبقة backend، بالإضافة إلى تسمية app: php-fpm للإشارة إلى أن الـ pod يقوم بتشغيل تطبيق PHP-FPM. يجب عليك إضافة هذه التسميات بعد قسم metadata :

بعد ذلك، تحتاج إلى الإعلان عن المنفذ للوصول إلى خدمة php-fpm هذه تحت spec. يمكنك إضافة أي منفذ من اختيارك، ولكننا سنستخدم المنفذ 9000 في هذا البرنامج التعليمي:

بمجرد الانتهاء من الخطوات المذكورة أعلاه، سيبدو ملف php_fpm_service.yaml الخاص بك كما يلي:

اضغط على Ctrl + O لحفظ الملف، ثم اضغط على Ctrl + X للخروج من nano.

تطبيق أمر kubectl لإنشاء خدمة PHP

بمجرد إنشاء تعريف الكائن لخدمتك، قم بتشغيل الأمر kubectl apply مع المعامل -f من خلال تحديد ملف php_fpm_service.yaml الخاص بك:

يجب أن تكون مخرجات الأمر أعلاه كما يلي:

قم بتشغيل الأمر أدناه للتحقق من أن خدمة php-fpm قيد التشغيل:

ستتمكن من رؤية خدمة php-fpm قيد التشغيل:

ملاحظة: يدعم Kubernetes أنواعًا مختلفة من أنواع الخدمات. تستخدم خدمة php-fpm نوع الخدمة الافتراضي ClusterIP. يخصص هذا النوع من الخدمات عنوان IP داخليًا ويجعل الخدمة قابلة للوصول من داخل مجموعة Kubernetes فقط.
إنشاء خدمة Nginx

بما أن خدمة PHP-FPM جاهزة الآن، فقد حان الوقت لإنشاء خدمة Nginx أيضًا. قم بإنشاء وفتح ملف YAML جديد لهذه الخدمة باسم nginx_service.yaml في المحرر:

قم بتسمية هذه الخدمة باسم nginx لأنها ستستهدف pods الخاصة بـ Nginx. تنتمي هذه الخدمة أيضًا إلى الـ backend، لذا يجب عليك إضافة التسمية tier: backend إليها:

كما فعلنا في خدمة php-fpm، أضف تسميات المحدد app: nginx و tier: backend لاستهداف الـ pods. أضف منفذ HTTP الافتراضي 80 للوصول إلى هذه الخدمة:

يمكن الوصول إلى خدمة Nginx بشكل عام على الإنترنت من عنوان IP العام. يمكنك إضافة عنوان IP الخاص بـ worker node’s كـ your_public_ip. أضف الأسطر أدناه تحت spec.externalIPs:

يجب أن يبدو ملف nginx_service.yaml الخاص بك مثل الملف أدناه بمجرد إكمال جميع الخطوات المذكورة أعلاه:

احفظ الملف وأغلقه بعد إضافة جميع المعلمات المطلوبة أعلاه.

تطبيق أمر kubectl لإنشاء خدمة Nginx
يجب أن ترى المخرجات أدناه للأمر أعلاه:
الآن، قم بتنفيذ الأمر التالي لعرض جميع الخدمات التي تعمل لديك:
بشغيل الأمر أعلاه، يجب أن تكون قادرًا على رؤية كل من خدمتي PHP-FPM و Nginx قيد التشغيل:
لاحظ أنه إذا كنت ترغب في حذف أي من خدماتك قيد التشغيل، يمكنك تنفيذ الأمر أدناه:

الخطوة 2: إنشاء مساحة تخزين محلية وحجم تخزين دائم (Persistent Volume)

يوفر Kubernetes العديد من المكونات الإضافية للتخزين (storage plug-ins) التي تساعدك على إنشاء مساحة تخزين لبيئتك. سيرشدك هذا الجزء إلى كيفية إنشاء StorageClass وكيف يمكن استخدام فئة التخزين (Storage Class) هذه لاحقًا لإنشاء حجم تخزين دائم (Persistent Volume).

إنشاء مساحة تخزين محلية

أنشئ ملفًا، وليكن باسم storageClass.yaml، في المحرر الخاص بك:

أضف kind كـ "storageClass" و apiVersion كـ "storage.k8s.io/v1" كما يلي:

قم بتسمية StorageClass هذه باسم "my-local-storage" وأضف provisioner و volumeBindingMode كما يلي:

احفظ الملف واخرج منه، ويجب أن يبدو ملف storageClass.yaml النهائي كما يلي:

الآن، قم بإنشاء StorageClass عن طريق تشغيل الأمر kubectl create، كما يلي:

بعد تشغيل الأمر أعلاه، يجب أن تحصل على المخرجات أدناه:

إنشاء حجم تخزين دائم محلي (Persistent Volume)

بعد إنشاء مساحة التخزين المحلية، يمكنك إنشاء حجم التخزين الدائم المحلي الخاص بك. حجم التخزين الدائم، المعروف أيضًا باسم PV، هو مساحة تخزين مخصصة الحجم ومستقلة عن دورة حياة الـ pod. حجم التخزين الدائم المحلي ليس سوى قرص محلي أو دليل متاح على عقدة cluster الخاصة بـ Kubernetes. يتيح حجم التخزين الدائم المحلي هذا لمستخدميه الوصول إلى التخزين المحلي باستخدام طلب حجم تخزين دائم محلي (Persistent Volume Claim) بطريقة بسيطة للغاية وسهلة النقل. يمكنك إنشاء حجم التخزين الدائم المحلي هذا باستخدام فئة التخزين التي أنشأناها للتو. افتح ملفًا، وليكن باسم persistentVolume.yaml، في المحرر الخاص بك:

امنح حجم التخزين الدائم هذا اسمًا، وليكن "my-local-pv":

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

أضف accessModes و persistentVolumeReclaimPolicy، ووفر نفس الـ storageClassName المستخدم في storageClass.yaml:

ملاحظة: يخبرك persistentVolumeReclaimPolicy بما يحدث لـ Persistent Volume بمجرد تحرير مطالبته (Persistent Volume Claim). هناك ثلاثة خيارات صالحة لهذه المعلمة: Retain و Delete و Recycle. في الكود الخاص بنا، سنستخدم الخيار Retain. لمزيد من التفاصيل، يمكنك مراجعة حقل persistentVolumeReclaimPolicy هنا: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#persistentvolumeclaim-v1-core

أضف local.path لـ Persistent Volume الخاص بك كما يلي:

ملاحظة: تأكد من وجود هذا المسار المحلي (/mnt/disk/vol) على عقدة عنقود Kubernetes الخاص بك.

بعد إضافة جميع الحقول المطلوبة، يجب أن يبدو ملف persistentVolume.yaml الخاص بك كما يلي:

ملاحظة: يجب عليك استخدام اسم العقدة الصحيح لجهازك. في هذه الحالة، هو: “worker.”
تحضير وحدة التخزين المحلية (Local Volume)

الآن، نحتاج إلى تحضير وحدة تخزين محلية على عقدة “worker” كما أضفنا في ملف persistentVolume.yaml الخاص بك. قم بتشغيل الأوامر أدناه على العقدة التي قمت بتكوينها في persistentVolume. في هذه الحالة، هي عقدة “worker”:

ملاحظة: تأكد من أن لديك الأذونات الكافية لإنشاء الدليل وتغيير الأذونات كما هو موضح أعلاه. إذا لم يكن الأمر كذلك، فقم بتشغيل الأوامر باستخدام المستخدم المناسب.

قم بتشغيل الأمر أدناه على العقدة الرئيسية (master node) حيث يوجد ملف persistentVolume.yaml الخاص بك:

يجب أن تحصل على المخرجات أدناه:

بما أنك قمت بإنشاء التخزين المحلي و Persistent Volume بنجاح، يمكنك الآن المضي قدمًا وإنشاء Persistent Volume Claim للاحتفاظ بكود تطبيقك وملفات التكوين.

الخطوة 3: إنشاء Persistent Volume

يجب الحفاظ على أمان كود تطبيقك أثناء إدارة الـ pods أو تحديثها. لهذا الغرض، ستستخدم Persistent Volume، الذي تم إنشاؤه في الخطوة السابقة، والذي يتم الوصول إليه باستخدام PersistentVolumeClaim، أو PVC. يقوم PVC هذا بتركيب (mount) الـ PV في المسار المطلوب.

افتح ملفًا، لنقل code_volume.yaml، في المحرر الخاص بك:

قم بتسمية PVC الخاص بك باسم code عن طريق إضافة المعلمات والقيم أدناه إلى ملفك:

يحتوي قسم spec الخاص بـ PVC على العناصر التالية:

  1. accessModes: هناك قيم مختلفة محتملة لهذا الحقل كما يلي:
    • ReadWriteOnce – يقوم بتركيب وحدة التخزين لعقدة واحدة مع أذونات القراءة والكتابة معًا.
    • ReadOnlyMany – يقوم بتركيب وحدة التخزين للعديد من العقد مع إذن القراءة فقط.
    • ReadWriteMany – يقوم بتركيب وحدة التخزين للعديد من العقد مع أذونات القراءة والكتابة معًا.
  2. resources: يحدد مساحة التخزين المطلوبة.

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

الآن، قم بالتصريح عن فئة التخزين التي سيستخدمها تجميع Kubernetes لتخصيصها لوحدات التخزين. استخدم فئة التخزين my-local-storage، التي تم إنشاؤها في الخطوة السابقة، هنا لـ storageClassName الخاص بك:

بعد إكمال الخطوات المذكورة أعلاه، يجب أن يبدو ملف code_volume.yaml الخاص بك كما يلي:

الآن احفظ الملف واخرج منه.

إنشاء PVC

قم بإنشاء PVC الخاص بالكود عن طريق تشغيل الأمر kubectl apply:

يجب أن تحصل على المخرجات التالية التي تشير إلى أنه تم إنشاء الكائن بنجاح وأنه جاهز لتتمكن من تثبيت PVC الخاص بك بحجم 1 جيجابايت كوحدة تخزين:

يمكنك تنفيذ الأمر التالي للتحقق من وحدة التخزين الدائمة (PV) المتاحة:

يجب أن تكون مخرجات الأمر أعلاه كما يلي:

جميع الحقول المذكورة أعلاه، باستثناء Reclaim Policy و Status، هي نظرة عامة على ملف التكوين الخاص بك. تحدد Reclaim Policy ما يحدث لـ PV بمجرد حذف PVC الذي يصل إليها. تؤدي القيمة Delete إلى إزالة PV من تجميع Kubernetes وكذلك من البنية التحتية للتخزين. يمكنك الرجوع إلى وثائق Kubernetes PV للحصول على فهم واضح لـ Reclaim Policy و Status.

يمكنك الآن إنشاء وحدات الـ pod الخاصة بك باستخدام Deployment بعد أن قمت بإنشاء وحدة التخزين الدائمة (Persistent Volume) بنجاح باستخدام التخزين المحلي.

الخطوة 4: إنشاء Deployment لتطبيق PHP-FPM الخاص بك

ستساعدك هذه الخطوة في إنشاء pod الخاص بـ PHP-FPM باستخدام Deployment. تستخدم Deployment الـ ReplicaSets لتوفير طريقة مستقرة لإنشاء وتحديث وإدارة الـ pods الخاصة بك. تقوم Deployment تلقائيًا بالتراجع عن الـ pods الخاصة بها إلى صورة سابقة.

المفتاح spec.selector في Deployment يسرد جميع تسميات الـ pods التي يديرها. كما أنه يستخدم مفتاح template لإنشاء الـ pods المطلوبة.

في هذه الخطوة، سنقدم أيضًا تطبيق Init Containers. تقوم Init Containers بتشغيل بعض الأوامر قبل الحاويات العادية المحددة تحت قالب الـ pod’s. هنا، ستستخدم Init Container موقع GitHub Gist (https://gist.github.com/) للحصول على ملف index.php نموذجي. محتويات الملف النموذجي هي:

إنشاء PHP Deployment

افتح ملفًا جديدًا باسم php_deployment.yaml في المحرر الخاص بك لإنشاء Deployment الخاص بك:

الآن، قم بتسمية كائن Deployment باسم PHP لأن هذا الـ Deployment سيدير كبسولات (pods) PHP-FPM الخاصة بك. أضف التسمية (label) tier: backend لأن الكبسولة (pod) ستنتمي إلى طبقة الـ backend:

باستخدام معامل replica، حدد عدد النسخ التي يجب إنشاؤها من هذه الكبسولة (pod). قد يختلف عدد النسخ المتطابقة (replicas) بناءً على متطلباتك والموارد المتاحة. في هذا البرنامج التعليمي، ستقوم بإنشاء نسخة متطابقة واحدة فقط من الكبسولة الخاصة بك:

أضف app: php و tier:backend من التسميات (labels) تحت مفتاح selector الذي يشير إلى أن هذا الـ Deployment سيدير الكبسولات (pods) التي تطابق هاتين التسميتين:

الآن، يحتاج تعريف كائن الـ pod’s الخاص بك إلى قالب (template) تحت مواصفات الـ Deployment (spec). يحدد هذا القالب المواصفات المطلوبة لإنشاء الكبسولة الخاصة بك. للبدء، أضف التسميات (labels) التي تم تحديدها لـ php service selector و matchLabels الخاصة بالـ Deployment. ثم أضف app:php و tier:backend تحت template.metadata.labels:

ملاحظة: يمكن أن تحتوي الكبسولة (pod) على حاويات (containers) أو وحدات تخزين (volumes) متعددة، وسيحتاج كل منها إلى اسم مختلف لتتمكن من التمييز بينها.  يمكنك تحديد مسار تثبيت (mount path) لكل وحدة تخزين لتثبيت تلك الوحدة بشكل انتقائي في حاوية.

أولاً، تحتاج إلى تحديد جميع وحدات التخزين (volumes) التي ستصل إليها حاوياتك. قم بتسمية وحدة التخزين هذه باسم code لأنك قمت بإنشاء PVC باسم code للاحتفاظ ببرمجية تطبيقك:

بعد ذلك، حدد اسم الحاوية (container) بالإضافة إلى الصورة (image) التي تريد تشغيلها داخل الكبسولة (pod). تتوفر صور متنوعة في متجر Docker (https://hub.docker.com/explore/)، ولكن في هذا البرنامج التعليمي، سنستخدم php:7-fpm صورة:

الآن، قم بتثبيت وحدات التخزين (volumes) التي تحتاج الحاوية إلى الوصول إليها. نظرًا لأن هذه الحاوية ستقوم بتشغيل برمجية php الخاصة بك، فستحتاج إلى الوصول إلى وحدة التخزين code التي تم إنشاؤها في الخطوة السابقة. في هذه الخطوة، ستتعلم أيضًا كيفية نسخ برمجية تطبيقك باستخدام Init Container.

ملاحظة: يمكنك إما استخدام initContainer واحد لتشغيل برنامج نصي (script) يقوم ببناء تطبيقك، أو يمكنك استخدام initContainer واحد لكل أمر، اعتمادًا على مدى تعقيد عملية الإعداد الخاصة بك. تحتاج إلى التأكد من تثبيت وحدات التخزين في الـ initContainer.

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

أولاً، أضف الـ initContainer الخاص بك تحت spec.template.spec وحدد صورة busybox:

بعد ذلك، لتنزيل البرمجية في وحدة التخزين code، سيحتاج الـ Init Container الخاص بك إلى الوصول إليها. قم بتثبيت وحدة التخزين code في المسار /code تحت spec.template.spec.initContainers:

يتطلب كل Init Container تشغيل أمر. سيستخدم هذا الـ Init Container أداة wget لتنزيل code من Github إلى المجلد /code . يمكنك تمرير الخيار -O لتسمية هذا الملف الذي تم تنزيله، ويمكنك تسمية هذا الملف index.php.

ملاحظة: تأكد من أنك تثق بالبرمجية التي تسحبها باستخدام الـ Init Container إلى خادمك. يمكنك فحص الكود المصدري والتأكد من أنك مرتاح لما يفعله.

بالإضافة إلى ذلك، أضف السطور أدناه تحت حاوية التثبيت في spec.template.spec.initContainers:

بعد إكمال كل هذه الخطوات، يجب أن يبدو ملف php_deployment.yaml الخاص بك كما يلي:

يمكنك الآن حفظ الملف والخروج. بعد ذلك، قم بإنشاء Deployment لـ PHP-FPM باستخدام kubectl apply أمر:

يجب أن يمنحك الإنشاء الناجح لـ Deployment المخرجات أدناه:

يبدأ هذا الـ Deployment بتنزيل الصور المحددة، ثم سيطلب PersistentVolume من PersistentVolumeClaim الخاصة بك، ثم يقوم بتشغيل initContainers. بمجرد الانتهاء من هذه الخطوة، ستعمل الحاويات وتقوم بتركيب وحدات التخزين في نقطة التركيب المحددة. بعد إكمال كل هذه الخطوات، سيكون الـ pod الخاص بك قيد التشغيل.

يمكنك تشغيل الأمر أدناه لعرض الـ Deployment الخاص بك:

بعد تشغيل الأمر أعلاه، يجب أن تحصل على المخرجات أدناه:

يمكنك فهم الحالة الحالية لـ Deployment بمساعدة هذه المخرجات. الـ Deployment هو وحدة تحكم تحافظ على الحالة المطلوبة. يحدد حقل DESIRED أنه يحتوي على نسخة متطابقة واحدة من الـ pod المسمى php. ويشير حقل CURRENT إلى عدد النسخ المتطابقة من الحالة DESIRED التي تعمل في الوقت الحالي. بالنسبة لـ pod سليم، يجب أن يتطابق هذا مع الحالة DESIRED. يمكنك معرفة المزيد حول الحقول المتبقية في وثائق Kubernetes Deployments الوثائق.

بعد ذلك، للتحقق من حالة الـ pod قيد التشغيل، يمكنك تشغيل الأمر أدناه:

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

Explanation:

تمثل هذه الأعمدة المعلومات على النحو التالي:

  • Ready: عدد النسخ المتطابقة الحالية/المطلوبة التي تشغل هذا الـ pod.
  • الحالة: حالة الـ pod الخاص بك. تشير Init:0/1 إلى أن حاويات البدء (Init Containers) قيد التشغيل وأن 0 من أصل 1 من حاويات البدء قد انتهت من العمل.
  • إعادات التشغيل: يشير هذا إلى عدد المرات التي تمت فيها إعادة تشغيل هذه العملية لبدء الـ pod.

قد يستغرق الـ pod الخاص بك بضع دقائق لتتغير الحالة إلى podInitializing اعتمادًا على مدى تعقيد البرامج النصية لبدء التشغيل لديك:

يشير هذا إلى أن حاويات البدء (Init Containers) قد تم تشغيلها بنجاح، والآن، يجري تهيئة الحاويات:

كما ترى الآن، فإن الـ pod الخاص بك يعمل بشكل صحيح. ومع ذلك، في حال لم يبدأ الـ pod الخاص بك، يمكنك تشغيل الأوامر أدناه لأغراض تصحيح الأخطاء:

1. لعرض معلومات مفصلة عن الـ pod:

2.  لعرض سجلات الـ pod:

ملاحظة: هناك خيارات متعددة متاحة للأمر “kubectl logs”، يمكنك تشغيل الأمر “kubectl logs –help” لاستكشاف المزيد حول هذا الموضوع.

3. لعرض سجلات حاوية معينة في الـ pod:

تهانينا! لقد قمت بتركيب كود التطبيق بنجاح وأصبحت خدمة PHP-FPM جاهزة للتعامل مع الاتصالات. وبالمثل، يمكنك إنشاء نشر Nginx الخاص بك.

الخطوة 5: إنشاء نشر Nginx الخاص بك

ستوجهك هذه الخطوة إلى كيفية تكوين Nginx باستخدام ConfigMap. يحتفظ الـ ConfigMap بجميع التكوينات المطلوبة بتنسيق مفتاح-قيمة والذي سيتم استخدامه في تعريفات كائنات Kubernetes الأخرى. باستخدام هذا النهج، ستتمتع بالمرونة لإعادة استخدام صورة Nginx أو استبدالها بإصدار مختلف، عند الحاجة. يمكنك تحديث الـ ConfigMap وسيقوم تلقائيًا بتكرار تلك التغييرات في أي pod يقوم بتركيب هذا الـ ConfigMap.

للبدء، افتح ملف nginx_configmap.yaml في المحرر الخاص بك:

الآن، قم بتسمية هذا الـ ConfigMap باسم nginx-config وأضفه إلى الخدمة المصغرة tier: backend :

بالإضافة إلى ذلك، يمكنك إضافة البيانات إلى ConfigMap. أضف مفتاحًا باسم config وأضف جميع محتويات ملف تكوين Nginx كقيمة.

نظرًا لأنه من الممكن لـ Kubernetes توجيه الطلبات إلى المضيفين المعنيين لخدمة ما، يمكنك إدخال اسم خدمة PHP-FPM الخاصة بك تحت المعلمة fastcgi_pass بدلاً من عنوان IP الخاص بها. أضف أسطر الكود التالية إلى ملف nginx_configMap.yaml الخاص بك:

بمجرد الانتهاء، فإن ملف nginx_configMap.yaml الخاص بك سيبدو كالتالي:

يمكنك الآن حفظ الملف والخروج من المحرر. الآن قم بتنفيذ kubectl apply الأمر لإنشاء ConfigMap:

بعد ذلك، يجب أن ترى المخرجات التالية على شاشتك:

لقد قمت بإنشاء Nginx Configmap بنجاح. الآن يمكنك إنشاء Nginx Deployment الخاص بك.

إنشاء Nginx Deployment

للبدء، يمكنك إنشاء ملف جديد باسم nginx_deployment.yaml في المحرر:

قم بتسمية هذا الـ Deployment بـ nginx وأضف علامة tier: backend إليه:

بعد ذلك، حدد عدد النسخ المتطابقة بإضافة حقل replica في مواصفات (spec) الـ Deployment وأضف علامتي app: nginx و tier: backend إليه:

وبالمثل، أضف قالب الـ pod. تأكد من إضافة نفس العلامات التي أضفتها في الـ selector.matchLabels الخاص بالـ Deployment’s. يمكنك إضافة ما يلي:

امنح Nginx حق الوصول إلى PVC الخاص بالكود الذي تم إنشاؤه مسبقًا عن طريق إضافة المعلمات التالية تحت spec.template.spec.volumes:

ملاحظة: يمكن للـ pod تحميل الـ ConfigMap كمستوى تخزين (volume). من خلال تحديد اسم الملف والمفتاح، سنقوم بإنشاء ملف تكون قيمته هي المحتوى. لاستخدام هذا الـ ConfigMap، اضبط المسار (path) على اسم الملف الذي يحتوي على محتويات المفتاح. يمكنك إنشاء ملف site.conf من المفتاح config. أضف ما يلي تحت spec.template.spec.volumes:

تحذير: ستستبدل محتويات المفتاح الـ mountPath الخاص بالـ volume’s إذا لم يتم تحديد ملف. بمعنى آخر، ستفقد جميع المحتويات في المجلد الوجهة إذا لم يتم تحديد مسار بشكل صريح.

الآن، حدد الاسم والصورة (image) والمنفذ (port) الذي تريد استخدامه في الـ pod الخاص بك. هنا، سنستخدم صورة nginx:1.7.9 والمنفذ 80. أضفهم تحت spec.template.spec قسم:

أيضًا، قم بتركيب وحدة تخزين الكود في /code حيث سيحتاج كل من Nginx و PHP-FPM إلى الوصول إلى الملف في نفس المسار:

إن صورة nginx-1.7.9 تقوم تلقائيًا بتحميل أي ملف تكوين ضمن المجلد /etc/nginx/conf.d. الآن، إذا قمنا بتركيب وحدة تخزين التكوين في هذا الدليل، فسيتم إنشاء /etc/nginx/conf.d/site.conf. أضف ما يلي أسفل قسم volumeMount:

بعد إكمال جميع الخطوات المذكورة أعلاه، يجب أن يبدو ملف nginx_deployment.yaml الخاص بك كما يلي:

يمكنك الآن حفظ الملف والخروج منه وإنشاء Nginx Deployment عن طريق تشغيل الأمر التالي:

عند تنفيذ الأمر بنجاح، يجب أن تشاهد المخرجات التالية:

يمكنك سرد جميع عمليات النشر (Deployments) الخاصة بك عن طريق تنفيذ الأوامر أدناه:

يجب أن تشاهد الآن كلاً من عمليات نشر Nginx و PHP-FPM:

kubernetes deployment status

علاوة على ذلك، يمكنك تشغيل الأمر التالي لسرد الـ pods التي تتم إدارتها بواسطة كلا الـ Deployments المذكورة أعلاه:

سترى أن كلا الـ pods لديك يعملان بشكل صحيح على النحو التالي:

kubernetes pod status

بما أن جميع كائنات Kubernetes الخاصة بك نشطة في هذه المرحلة، يمكنك الآن الوصول إلى خدمة Nginx على متصفحك.

قم بتشغيل الأمر التالي لسرد الخدمات:

قم بتدوين الـ External IP الخاص بخدمة Nginx لديك:external ip of nginx Deploy a PHP Application on Kubernetes Cluster with Ubuntu 18.04

الآن، باستخدام الـ External IP هذا لخدمة Nginx، يمكنك زيارة خادمك عن طريق كتابة http://your_public_ip على متصفحك. يجب أن تكون قادرًا على رؤية مخرجات php_info() التي تؤكد أن خدمات Kubernetes الخاصة بك تعمل بشكل صحيح.

خاتمة

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

علاوة على ذلك، ألقِ نظرة على برامجنا التعليمية الأخرى التي تركز على Docker و Kubernetes والتي يمكنك العثور عليها في مدونتنا:

حوسبة سعيدة!

author

Hark Labs

المؤلف · CloudSigma

Preslav Dobrev هو مصمم إبداعي في CloudSigma، يركز على هوية أعمال متسقة باستخدام قنوات التسويق التقليدية والمبتكرة. هو بارع في دمج الرؤية الفنية مع التسويق الاستراتيجي لخلق سرد قصصي مؤثر للعلامة التجارية.

التعليقات

لا توجد تعليقات بعد. كن أول من يعلق.