التوسُّع باستخدام 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. التغيير إلى الدليل وإعداد مساحة عمل IDE

cd kustomize-lab && cloudshell workspace .

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

ترجع أهمية kustomize إلى القدرة على تركيب ملفات yaml قاعدة Kubernetes وتعديلها بقيم مخصّصة. لتنفيذ هذا الإجراء، يجب إنشاء ملف أساسي يتضمّن تعليمات حول مكان الملفات وما يجب تجاوزه. يتم تضمين 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 لتطبيق الناتج مباشرةً كما في المثال التالي. يؤدي ذلك إلى بث مخرجات أمر الإصدار مباشرةً إلى الأمر kubectlapply.

(عدم التنفيذ - تضمين كمرجع فقط)

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

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

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

(عدم التنفيذ - تضمين كمرجع فقط)

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/publish.yaml الذي أنشأته في الخطوة السابقة. في المقابل، تحتوي رموز التصحيح هذه على متغيّرات بيئة فريدة للمطوّرين والإنتاج.

  1. تنفيذ ملفات YAML المعروضة في kustomize للدليل الأساسي

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

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

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. تنفيذ ملفات YAML المعروضة في kustomize لدليل المطوّر

يمكنك الآن تنفيذ الصِيَغ الخاصة بمطوّري البرامج والإنتاج من خلال تنفيذ الأوامر التالية في الوحدة الطرفية.

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

bases:

- ../base

namespace: dev

nameprefix: dev-

commonLabels:

env: dev

patches:

- deployment.yaml

EOF

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

  1. تنفيذ ملفات YAML المعروضة في kustomize لدليل الإنتاج

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

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

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

باستخدام ملفات القاعدة والبيئة التي تم إنشاؤها، يمكنك تنفيذ عملية التثبيت لتصحيح الملفات الأساسية.

شغّل الأمر التالي لـ dev لمشاهدة النتيجة المدمجة.

kustomize build chat-app/dev

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

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

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

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

  1. إنشاء مجلد 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" كأساس. بعد ذلك، قم بتصحيح النشر الخاص به.yaml في الأعلى. وستتم بعد ذلك تصحيح مجلدات البيئة مرة أخرى.

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

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

bases:

- ../../shared-kustomize

commonLabels:

app: chat-app

patches:

- deployment.yaml

EOF

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

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>