التوسُّع باستخدام Kustomize

1. الأهداف

‫Kustomize هي أداة توفّر طريقة لتخصيص إعدادات التطبيقات بدون استخدام نماذج، ما يسهّل استخدام التطبيقات الجاهزة. تتوفّر هذه الأداة كأداة مساعدة مستقلة، وهي مدمجة في kubectl من خلال kubectl apply -k أو يمكن استخدامها كواجهة سطر أوامر مستقلة. للحصول على تفاصيل إضافية، يمكنك الاطّلاع على مزيد من المعلومات على kustomize.io.

في هذا البرنامج التعليمي، ستتعرّف على بعض المفاهيم الأساسية في Kustomize وتستخدمها لإدارة الاختلافات في التطبيقات والبيئات.

عليك إجراء ما يلي:

  • استخدام عميل سطر الأوامر kustomize
  • تجاهل العناصر الشائعة
  • تصحيح بنى yaml الأكبر
  • استخدام طبقات متعددة من العناصر المركّبة

2. إعداد مساحة العمل

  1. افتح محرِّر Cloud Shell من خلال الانتقال إلى عنوان URL التالي

https://ide.cloud.google.com

  1. في نافذة الوحدة الطرفية، أنشئ دليل عمل لهذا البرنامج التعليمي

mkdir kustomize-lab

  1. الانتقال إلى الدليل وتحديد مساحة عمل بيئة التطوير المتكاملة

cd kustomize-lab && cloudshell workspace .

3- استخدام عميل سطر الأوامر kustomize

تستمدّ kustomize قوتها من إمكانية تراكب ملفات YAML الأساسية في Kubernetes وتعديلها باستخدام قيم مخصّصة. ولإجراء ذلك، يتطلّب Kustomize ملفًا أساسيًا يتضمّن تعليمات حول مكان الملفات وما يجب تجاوزه. يتم تضمين Kustomize في نظام Kubernetes المتكامل ويمكن تنفيذه من خلال طرق مختلفة.

في هذا القسم، ستنشئ إعدادًا أساسيًا لـ kustomize وتعالج الملفات باستخدام عميل سطر الأوامر المستقل kustomize.

  1. للبدء، عليك إنشاء مجلد يحتوي على ملفات الإعداد الأساسية

mkdir -p chat-app/base

  1. إنشاء ملف kubernetes deployment.yaml بسيط في المجلد الأساسي

cat <<EOF > chat-app/base/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`metadata:`

  `name: chat-app`

`spec:`

  `containers:`

  `- name: chat-app`

    `image: chat-app-image`

EOF

  1. إنشاء القاعدة kustomization.yaml

يبحث Kustomize عن ملف باسم kustomization.yaml كنقطة دخول. يحتوي هذا الملف على مراجع إلى ملفات الأساس والاستبدال المختلفة، بالإضافة إلى قيم استبدال معيّنة.

أنشئ ملف kustomization.yaml يشير إلى deployment.yaml كموارد أساسية.

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. نفِّذ أمر kustomize على المجلد الأساسي. سيؤدي ذلك إلى إخراج ملفات YAML الخاصة بالنشر بدون أي تغييرات، وهو أمر متوقّع لأنّك لم تتضمّن أي صيغ بعد.

kustomize build chat-app/base

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

(Do Not Execute - Included for reference only)

kustomize build chat-app/base | kubectl apply -f -

تكون هذه الطريقة مفيدة إذا كان هناك حاجة إلى إصدار معيّن من برنامج kustomize.

بدلاً من ذلك، يمكن تنفيذ kustomize باستخدام الأدوات المدمجة في kubectl نفسها. كما في المثال التالي.

(Do Not Execute - Included for reference only)

kubectl apply -k chat-app/base

4. إلغاء العناصر الشائعة

بعد إعداد مساحة العمل والتأكّد من أنّ kustomize يعمل، حان الوقت لتجاوز بعض القيم الأساسية.

يتم تخصيص الصور ومساحات الأسماء والتصنيفات بشكل شائع جدًا لكل تطبيق وبيئة. بما أنّ هذه الحقول تتغيّر بشكل شائع، يتيح لك Kustomize تعريفها مباشرةً في kustomize.yaml، ما يلغي الحاجة إلى إنشاء العديد من التصحيحات لهذه السيناريوهات الشائعة.

تُستخدَم هذه التقنية غالبًا لإنشاء نسخة معيّنة من أحد النماذج. يمكن الآن استخدام مجموعة أساسية واحدة من الموارد لعمليات تنفيذ متعددة من خلال تغيير الاسم ومساحة الاسم فقط.

في هذا المثال، ستضيف مساحة اسم وبادئة اسم وبعض التصنيفات إلى kustomization.yaml.

  1. عدِّل ملف kustomization.yaml ليتضمّن التصنيفات ومساحات الأسماء الشائعة.

انسخ الأوامر التالية ونفِّذها في الوحدة الطرفية

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

namespace: my-namespace

nameprefix: my-

commonLabels:

app: my-app

EOF

  1. تنفيذ أمر الإنشاء

يُظهر تنفيذ عملية الإنشاء في هذه المرحلة أنّ ملف YAML الناتج يحتوي الآن على مساحة الاسم والتصنيفات والأسماء التي تبدأ ببادئة في كل من تعريفات الخدمة وعمليات النشر.

kustomize build chat-app/base

لاحظ كيف يحتوي الناتج على تصنيفات ومساحات أسماء غير موجودة في ملف YAML الخاص بعملية النشر. لاحظ أيضًا كيف تم تغيير الاسم من chat-app إلى my-chat-app

(لا يتم نسخ الناتج)

kind: Deployment

metadata:

labels:

`app: my-app`

name: my-chat-app

namespace: my-namespace

5- تعديل بنى yaml الأكبر

توفّر Kustomize أيضًا إمكانية تطبيق تصحيحات تتراكب مع الموارد الأساسية. تُستخدَم هذه التقنية غالبًا لتوفير اختلاف بين التطبيقات والبيئات.

في هذه الخطوة، ستنشئ أشكالًا مختلفة للبيئة لتطبيق واحد يستخدم الموارد الأساسية نفسها.

  1. ابدأ بإنشاء مجلدات للبيئات المختلفة

mkdir -p chat-app/dev

mkdir -p chat-app/prod

  1. اكتب تصحيح المرحلة باستخدام الأمر التالي

cat <<EOF > chat-app/dev/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: dev`

EOF

  1. الآن، اكتب حزمة الإصدار العلني باستخدام الأمر التالي

cat <<EOF > chat-app/prod/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: prod`

EOF

لاحظ أنّ التصحيحات أعلاه لا تحتوي على اسم صورة الحاوية. يتم توفير هذه القيمة في ملف base/deployment.yaml الذي أنشأته في الخطوة السابقة. ومع ذلك، تحتوي هذه التصحيحات على متغيرات بيئية فريدة لكل من بيئة التطوير والإنتاج.

  1. تنفيذ ملفات kustomize YAML للدليل الأساسي

أعِد كتابة ملف kustomization.yaml الأساسي، وأزِل مساحة الاسم وبادئة الاسم لأنّ هذا هو الإعداد الأساسي فقط بدون أي اختلاف. سيتم نقل هذه الحقول إلى ملفات البيئة في لحظات.

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. تنفيذ ملفات kustomize YAML لدليل dev

الآن، نفِّذ الاختلافات في بيئة التطوير والإنتاج من خلال تنفيذ الأوامر التالية في الوحدة الطرفية.

cat <<EOF > chat-app/dev/kustomization.yaml

bases:

- ../base

namespace: dev

nameprefix: dev-

commonLabels:

env: dev

patches:

- deployment.yaml

EOF

لاحظ إضافة القسم patches: إلى الملف. يشير ذلك إلى أنّ kustomize يجب أن يضع هذه الملفات فوق الموارد الأساسية.

  1. تنفيذ ملفات kustomize YAML لدليل prod

cat <<EOF > chat-app/prod/kustomization.yaml

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

  1. تشغيل kustomize لدمج الملفات

بعد إنشاء ملفات الأساس والبيئة، يمكنك تنفيذ عملية kustomize لتعديل ملفات الأساس.

نفِّذ الأمر التالي للمطوّرين للاطّلاع على النتيجة المدمجة.

kustomize build chat-app/dev

يُرجى العِلم أنّ الناتج يحتوي على نتائج مدمجة، مثل التصنيفات من الإعدادات الأساسية وإعدادات التطوير، بالإضافة إلى اسم صورة الحاوية من المجلدات الأساسية ومتغيّر البيئة من مجلدات التطوير.

6. استخدام طبقات متعددة من العناصر المركّبة

تضمّ العديد من المؤسسات فريقًا يساعد في دعم فِرق التطبيقات وإدارة المنصة. في كثير من الأحيان، تريد هذه الفِرق تضمين تفاصيل معيّنة يجب تضمينها في جميع التطبيقات على مستوى جميع البيئات، مثل عامل تسجيل الدخول.

في هذا المثال، ستنشئ مجلدًا shared-kustomize وموارد سيتم تضمينها في جميع التطبيقات بغض النظر عن البيئة التي يتم نشرها فيها.

  1. إنشاء مجلد shared-kustomize

mkdir shared-kustomize

  1. إنشاء deployment.yaml بسيط في المجلد المشترك

cat <<EOF > shared-kustomize/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: logging-agent`

    `image: logging-agent-image`

EOF

  1. إنشاء ملف kustomization.yaml في المجلد المشترك

cat <<EOF > shared-kustomize/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. الإشارة إلى مجلد shared-kustomize من تطبيقك

بما أنّك تريد أن يكون المجلد shared-kustomize هو الأساس لجميع تطبيقاتك، عليك تعديل chat-app/base/kustomization.yaml لاستخدام shared-kustomize كأساس. ثمّ يتم تعديل ملف deployment.yaml الخاص به. بعد ذلك، سيتم تصحيح مجلدات البيئة مرة أخرى فوق ذلك.

انسخ الأوامر التالية ونفِّذها في الوحدة الطرفية

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- ../../shared-kustomize

commonLabels:

app: chat-app

patches:

- deployment.yaml

EOF

  1. تشغيل kustomize وعرض النتائج المدمجة لبيئة التطوير

kustomize build chat-app/dev

يُرجى العِلم أنّ الناتج يحتوي على نتائج مدمجة من قاعدة التطبيق وبيئة التطبيق ومجلدات shared-kustomize. على وجه التحديد، يمكنك الاطّلاع في قسم الحاويات على قيم من جميع المواقع الجغرافية الثلاثة.

(لا تنسخ الناتج)

<pre>

`containers:`

      `- env:`

        `- name: ENVIRONMENT`

          `value: dev`

        `name: chat-app`

      `- image: image`

        `name: app`

      `- image: logging-agent-image`

        `name: logging-agent`

</pre>