فهم سكافولد

1. الأهداف

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

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

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

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

2. قبل البدء

تجهيز مساحة العمل

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

السماح بملفات تعريف الارتباط التابعة لجهات خارجية انقر على "الموقع الإلكتروني لا يعمل" (Site not working)، ثم على "السماح بملفات تعريف الارتباط" (Allow Cookies).

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). هذا هو ملف الإعدادات الأعلى مستوى الذي يحدّد مسار Skaffold.

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

  • build
  • deploy
  • profiles

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

يمكنك الاطّلاع على مزيد من المعلومات حول القائمة الكاملة لمراحل Skaffold في مستندات مراحل خط أنابيب Skaffold.

4. إنشاء

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

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

5- النشر

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

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

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

6. الملفات الشخصية

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

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

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

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

عرض ملف Dockerfile

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

7. التطوير باستخدام Skaffold

ضبط بيئة 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

استخدام Skaffold للتطوير على الجهاز

  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"

بعد إجراء التغيير، من المفترض أن يعيد Skaffold إنشاء الصورة وإعادة نشرها في المجموعة، مع ظهور التغيير في الناتج في نافذة الوحدة الطرفية.

  1. الآن، في الملف "app > main.go" في لوحة بيئة التطوير المتكاملة (IDE)، غيِّر السطر التالي أيضًا:
time.Sleep(time.Second * 1)

إلى

time.Sleep(time.Second * 10)

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

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

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

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

إلى

replicas: 2

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

  1. الآن، غيِّر السطر نفسه في الملف base > deployment.yaml إلى:
replicas: 1

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

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

إنشاء إصدار

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

  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

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

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

من المفترض أن يظهر لك اسمان مختلفان لوحدات pod، لأنّ الملف الشخصي 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 واستخدامه للتطوير على الجهاز ونشر التطبيقات.

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

يمكنك مواصلة التعرّف على المزيد من المعلومات حول Skaffold:

تنظيف

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