فهم سكافولد

1. الأهداف

Skaffold هي أداة تتولى سير العمل لإنشاء تطبيقك ونشره ونشره. ويمكنك استخدام Skaffold لإعداد مساحة عمل للتطوير المحلي بسهولة، وتبسيط عملية التطوير الداخلية، ودمجه مع أدوات أخرى، مثل Kustomize وHelm للمساعدة في إدارة بيانات Kubernetes.

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

وسوف تقوم بما يلي:

  • إعداد Skaffold وتفعيله للتطوير المحلي
  • إنشاء تطبيق Golang بسيط وتشغيله
  • إدارة نشر التطبيقات المحلية باستخدام Skaffold
  • عرض البيانات ونشر التطبيق

2. قبل البدء

جارٍ تحضير مساحة العمل

  1. افتح محرِّر Cloud Shell من خلال الانتقال إلى عنوان URL التالي:
https://shell.cloud.google.com

السماح بملفات تعريف الارتباط التابعة لجهات خارجية انقر على "الموقع لا يعمل". ثم "السماح بملفات تعريف الارتباط".

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. إذا لم يسبق لك إجراء ذلك، استنسِخ مصدر التطبيق في النافذة الطرفية باستخدام الأمر التالي:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. تغيير إلى دليل المستودع المنسوخ:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. يمكنك ضبط مساحة عمل Cloud Shell على الدليل الحالي من خلال تنفيذ الأمر التالي:
cloudshell workspace .

جارٍ تحضير مشروعك

  1. تأكَّد من ضبط مشروعك على Google Cloud بشكلٍ صحيح من خلال تنفيذ الأمر التالي:
gcloud config set project {{project-id}}

3- بدء استخدام Skaffold

  1. شغِّل الأمر التالي لإنشاء ملف إعداد Skaffold ذي المستوى الأعلى، skaffold.yaml:
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. افتح الملف "skaffold.yaml" في جزء IDE. هذا هو ملف الإعداد ذو المستوى الأعلى الذي يحدد مسار سكافولد.

لاحظ تنسيق YAML الشبيه بـ Kubernetes والأقسام التالية في YAML:

  • build
  • deploy
  • profiles

تحدد هذه الأقسام كيفية إنشاء التطبيق ونشره، بالإضافة إلى تحديد الملفات الشخصية لكل هدف نشر.

يمكنك قراءة المزيد من المعلومات حول القائمة الكاملة لمراحل سكافولد في المستندات ضمن "مراحل مسار سكافولد".

4. إنشاء

يحتوي القسم build على الإعدادات التي تحدِّد طريقة إنشاء التطبيق. في هذه الحالة، يمكنك الاطّلاع على إعدادات كيفية التعامل مع علامات git، بالإضافة إلى قسم artifacts الذي يحدِّد صور الحاويات التي تتألف منها التطبيق.

بالإضافة إلى ذلك، يمكنك في هذا القسم الاطّلاع على مرجع Dockerfile الذي سيتم استخدامه لإنشاء الصور. بالإضافة إلى ذلك، يتيح Skaffold أدوات إنشاء أخرى، مثل Jib وMaven وGradle وBuildpacks وBazel المتوافقة مع السحابة الإلكترونية والنصوص البرمجية المخصّصة. يمكنك الاطِّلاع على مزيد من المعلومات عن هذه الإعدادات في مستندات إصدار Skaffold.

5- النشر

يحتوي القسم deploy على إعدادات تحدِّد كيفية نشر التطبيق. في هذه الحالة، يمكنك الاطّلاع على مثال لعملية نشر تلقائية تهيئ Skaffold لاستخدام أداة Kustomize.

توفّر الأداة Kustomize وظيفة إنشاء بيانات Kubernetes من خلال دمج مجموعة من ملفات YAML المكوّنة من المكوّنات الشائعة (ضمن دليل base) مع "تراكب" واحد أو أكثر. تتوافق عادةً مع هدف واحد أو أكثر للنشر، عادةً ما يكون ذلك لمطوّري البرامج والاختبار والتقسيم المرحلي والإنتاج أو ما شابه ذلك.

في هذا المثال، يمكنك رؤية تركيبَين لثلاثة أهداف، dev، وstaging، وprod. سيتم استخدام تراكب dev أثناء التطوير المحلي وتراكبات المراحل والإنتاج عند النشر باستخدام Skaffold.

6- ملفات التعريف

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

يمكن للإعداد في قسم profiles أن يحل محل أي عناصر أو تصحيحها من الإعدادات الرئيسية (مثل الأقسام build أو test أو deploy).

كمثال على ذلك، افتح الملف overlays > prod > deployment.yaml. لاحظ أنه تم تكوين عدد النسخ المتماثلة للتطبيق هنا ليكون ثلاثة، مما يُلغي الإعداد الأساسي.

  1. افتح الملف التالي app > main.go في جزء IDE. هذا تطبيق golang بسيط يكتب سلسلة إلى stdout كل ثانية.
  2. يُرجى العلم أنّ التطبيق يُخرج أيضًا اسم مجموعة Kubernetes التي يتم تشغيلها.

عرض الملف الشامل

  1. افتح الملف "app > Dockerfile" في جزء IDE. يحتوي هذا الملف على سلسلة من الأوامر لإنشاء صورة حاوية التطبيق للملف main.go، وتتم الإشارة إليه في ملف skaffold.yaml ذي المستوى الأعلى.

7. التطور مع سكافولد

ضبط بيئة Kubernetes

  1. شغِّل الأمر التالي للتأكّد من أنّ مجموعة Kubernetes المحلية تعمل وتم ضبطها:
minikube start

قد يستغرق ذلك عدة دقائق. من المفترض أن ترى النتيجة التالية إذا بدأت المجموعة بنجاح:

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. شغِّل الأمر التالي لإنشاء مساحات اسم Kubernetes لـ dev وstaging وprod:
kubectl apply -f namespaces.yaml

من المفترض أن يظهر لك الناتج التالي:

namespace/dev created
namespace/staging created
namespace/prod created

استخدام سكافولد للتنمية المحلية

  1. شغِّل الأمر التالي لإنشاء التطبيق ونشره في مجموعة Kubernetes محلية تعمل في Cloud Shell:
skaffold dev

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

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

يُرجى العِلم أنّ اسم المجموعة الدقيق سيختلف عن الاسم العام الوارد أعلاه.

إجراء تغييرات على التطبيق

والآن بعد أن تم تشغيل التطبيق في مجموعة Kubernetes المحلية، يمكنك إجراء تغييرات على الرمز، وسيُعيد Skaffold إنشاء التطبيق وإعادة نشره تلقائيًا في المجموعة.

  1. افتح الملف app > main.go في جزء IDE، وغيِّر سلسلة الإخراج:
"Hello world from pod %s!\n"

إلى:

"Hello Skaffold world from pod %s!\n"

عندما تجري التغيير، يجب أن ترى سكافولد يُعيد إنشاء الصورة ويعيد نشرها في المجموعة، مع ظهور التغيير في الإخراج في النافذة الطرفية.

  1. الآن، أيضًا في ملف "app > main.go&quot; في جزء IDE، غيِّر السطر:
time.Sleep(time.Second * 1)

إلى

time.Sleep(time.Second * 10)

مرة أخرى، سترى التطبيق قد تمت إعادة تصميمه وإعادة نشره، مع ظهور سطر المخرجات مرة كل 10 ثوانٍ.

إجراء تغييرات على إعدادات Kubernetes

بعد ذلك، ستُجري تغييرًا على إعدادات Kubernetes، وسيعيد Skaffold تلقائيًا نشر التغييرات.

  1. افتح الملف base > deployment.yaml في بيئة التطوير المتكاملة (IDE) وغيِّر السطر:
replicas: 1

إلى

replicas: 2

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

  1. الآن، قم بتغيير نفس السطر في الملف base > deployment.yaml مرة أخرى إلى:
replicas: 1

من المفترض أن تظهر إحدى المجموعات التي تمت إزالتها من الخدمة بحيث تتبقّى مجموعة واحدة فقط.

  1. أخيرًا، اضغط على Ctrl-C في النافذة الطرفية لإيقاف تنمية "سكافولد" المحلية.

قصّ إصدار

بعد ذلك، يمكنك إنشاء إصدار من خلال إنشاء صورة إصدار ونشره في مجموعة.

  1. نفِّذ الأمر التالي لإنشاء الإصدار:
skaffold build --file-output artifacts.json

سيؤدي هذا الأمر إلى إنشاء الصورة النهائية (إذا لزم الأمر) وإرسال تفاصيل الإصدار في ملف artifacts.json.

إذا أردت استخدام أداة مثل Cloud Deploy (النشر في السحابة الإلكترونية) للنشر في مجموعاتك، يتضمّن هذا الملف معلومات الإصدار. وهذا يعني أن العناصر غير قابلة للتغيير في مسار الحياة.

  1. شغِّل الأمر التالي للاطّلاع على محتوى ملف artifacts.json:
cat artifacts.json | jq

لاحِظ أنّ الملف يحتوي على مرجع للصورة التي سيتم استخدامها في عملية النشر النهائية.

النشر على مراحل

  1. شغِّل الأمر التالي لنشر الإصدار باستخدام ملف staging الشخصي:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

بعد اكتمال النشر، من المفترض أن تظهر لك النتائج من مجموعتَين متشابهتَين على النحو التالي:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. اضغط على Ctrl-C في النافذة الطرفية لإيقاف إخراج Skaffold.
  2. شغِّل الأمر التالي لمراقبة عمل التطبيق في المجموعة:
kubectl get all --namespace staging

من المفترض أن يظهر لك اسمان مختلفان لمجموعات صغيرة، لأنّ الملف الشخصي staging الخاص بالتطبيق يحدِّد أنّه يجب أن تكون هناك نسختان طبق الأصل في عملية النشر.

النشر في قناة الإصدار العلني

  1. شغِّل الآن الأمر التالي لنشر الإصدار باستخدام ملف prod الشخصي:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

بعد اكتمال النشر، من المفترض أن تظهر لك النتائج من ثلاث مجموعات تتشابه مع ما يلي:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. اضغط على Ctrl-C في النافذة الطرفية لإيقاف إخراج Skaffold.

من المفترَض أن تظهر لك ثلاثة أسماء مختلفة لمجموعات متسلسلة، لأنّ الملف الشخصي prod الخاص بالتطبيق يحدِّد أنّ هناك ثلاث نُسخ مطابقة في عملية النشر.

  1. شغِّل الأمر التالي لمراقبة عمل التطبيق في المجموعة:
kubectl get all --namespace prod

من المفترض أن تظهر لك نتيجة تحتوي على أسطر مشابهة لما يلي تعرض عملية نشر المنتج:

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

ومن المفترض أن تظهر أيضًا ثلاث مجموعات تطبيقات قيد التشغيل.

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

8. تهانينا!

تهانينا! لقد أكملت التمرين المعملي Understanding Skaffold وتعلمت كيفية إعداد Skaffold واستخدامه في التطوير المحلي ونشر التطبيقات.

الخطوة التالية:

متابعة تعلم المزيد حول سكافولد:

تنظيف

  1. شغِّل الأمر التالي لإيقاف تشغيل المجموعة المحلية:
minikube delete