להבין את Skaffold

1. מטרות

Skaffold הוא כלי שמטפל בתהליך העבודה ביצירה, בדחיפה ובפריסה של האפליקציה. אפשר להשתמש ב-Skaffold כדי להגדיר בקלות סביבת עבודה מקומית לפיתוח, לייעל את לולאת הפיתוח הפנימית ולהשתלב עם כלים אחרים כמו Kustomize ו-Helm שעוזרים לנהל את המניפסטים של Kubernetes.

במדריך הזה תלמדו על כמה מעקרונות הליבה של Skaffold, תוכלו להשתמש בו כדי להפוך את לולאת הפיתוח הפנימית שלכם לאוטומטית, ואז לפרוס אפליקציה.

אתם:

  • הגדרה והפעלה של Skaffold לפיתוח מקומי
  • בנייה והפעלה של אפליקציית golang פשוטה
  • ניהול הפריסה של אפליקציות מקומיות באמצעות Skaffold
  • עיבוד מניפסטים ופריסת האפליקציה

2. לפני שמתחילים

סביבת העבודה בהכנה

  1. נכנסים לכתובת ה-URL הבאה כדי לפתוח את העורך של Cloud Shell:
https://shell.cloud.google.com

אישור לקובצי Cookie של צד שלישי. לוחצים על "האתר לא פועל" ואז על 'אפשר קובצי Cookie'.

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 Pipeline Stages.

4. פיתוח פתרונות

הקטע build מכיל הגדרות אישיות שמגדירות את אופן בניית האפליקציה. במקרה הזה אפשר לראות את ההגדרות לגבי אופן הטיפול בתגי git, וכן את הקטע artifacts שמגדיר את קובצי האימג' של הקונטיינרים שמרכיבים את האפליקציה.

בנוסף, בקטע הזה אפשר לראות את ההפניה אל Dockerfile שישמשו ליצירת התמונות. Skaffold תומך גם בכלי build אחרים כמו 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 מכיל הגדרות אישיות שמגדירות build, בדיקה ופריסה, בהקשרים שונים. הקשרים שונים הם בדרך כלל סביבות שונות בצינור עיבוד הנתונים לפריסה של אפליקציות, כמו staging או prod בדוגמה הזו. המשמעות היא שאפשר לנהל בקלות מניפסטים שהתוכן שלהם צריך להיות שונה בסביבות יעד שונות, בלי להגדיר שוב את תבנית הבוילרפלייט.

ההגדרות בקטע profiles יכולות להחליף או לתקן כל פריט במערך ההגדרות הראשי (למשל, הקטעים build, test או deploy).

לדוגמה, פותחים את הקובץ overlays > prod > deployment.yaml. שימו לב שמספר הרפליקות של האפליקציה מוגדר כאן להיות שלוש, תוך ביטול ההגדרה הבסיסית.

  1. פותחים את הקובץ הבא app > main.go בחלונית IDE. זהו אפליקציית golang פשוטה שכותבת מחרוזת ל-stdout כל שנייה.
  2. שימו לב שהאפליקציה גם מפיקה את שם ה-pod של Kubernetes שבו היא פועלת.

הצגת קובץ ה-Docker

  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

תהליך ה-build של קונטיינר של האפליקציה אמור להימשך כמה דקה, ואז הפלט של האפליקציה חוזר על עצמו בכל שנייה:

[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&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

אמור להופיע אחד מה-pods שהוסר מהשירות, כך שיישאר רק אחד.

  1. בסוף, לוחצים על Ctrl-C בחלון הטרמינל כדי להפסיק את הפיתוח המקומי של Skaffold.

חיתוך של פריט תוכן

בשלב הבא יוצרים גרסה של קובץ האימג' ופורסים אותה באשכול.

  1. כדי ליצור את הגרסה, מריצים את הפקודה הבאה:
skaffold build --file-output artifacts.json

הפקודה הזו תבנה את התמונה הסופית (במקרה הצורך) ותעביר את פרטי הגרסה לקובץ artifacts.json.

אם תרצו להשתמש בכלי כמו Cloud Deploy כדי לפרוס באשכולות, הקובץ יכלול את פרטי הגרסה. המשמעות היא שלא ניתן לשנות את פריטי המידע שנוצרו בתהליך הפיתוח(Artifact).

  1. מריצים את הפקודה הבאה כדי לראות את תוכן הקובץ artifacts.json:
cat artifacts.json | jq

שימו לב שהקובץ מכיל את ההפניה לתמונה שתופיע בפריסה הסופית.

פריסה ל-Staging

  1. מריצים את הפקודה הבאה לפריסת הגרסה באמצעות הפרופיל staging:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

בסיום הפריסה, אתם אמורים לראות פלט משני רצפי מודעות דומים לפלט הבא:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. כדי להפסיק את הפלט של Skaffold, מקישים על Ctrl-C בחלון הטרמינל.
  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. כדי להפסיק את הפלט של Skaffold, מקישים על Ctrl-C בחלון הטרמינל.

אמורים להופיע שלושה שמות Pod נפרדים, כי הפרופיל prod של האפליקציה מציין שפריסה אמורה להיות עם שלושה רפליקציות נפרדות.

  1. מריצים את הפקודה הבאה כדי לראות אם האפליקציה פועלת באשכול:
kubectl get all --namespace prod

אתם אמורים לראות פלט שמכיל קווים דומים לפלט הבא, שמציגים את פריסת ה-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. מעולה!

מעולה! השלמתם את שיעור ה-Lab הזה Understanding Skaffold ולמדתם איך להגדיר את Skaffold ולהשתמש בו לצורכי פיתוח מקומי ופריסת אפליקציות.

השלב הבא:

מידע נוסף על Skaffold זמין בהמשך:

הסרת המשאבים

  1. מריצים את הפקודה הבאה כדי להשבית את האשכול המקומי:
minikube delete