להבין את Skaffold

1. מטרות

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

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

אתם:

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

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

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

  1. כדי לפתוח את העורך של Cloud Shell, עוברים לכתובת ה-URL הבאה:
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.

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

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

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

  1. פותחים את הקובץ app > main.go בחלונית של סביבת הפיתוח המשולבת. זוהי אפליקציית 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

חשוב לזכור ששם ה-pod המדויק ישתנה מהפלט הגנרי שצוין למעלה.

ביצוע שינויים באפליקציה

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

  1. פותחים את הקובץ app > main.go בחלונית של סביבת הפיתוח המשולבת, ומשנים את מחרוזת הפלט:
"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

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

  1. עכשיו משנים את אותה שורה בקובץ base > deployment.yaml חזרה ל:
replicas: 1

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

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

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

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

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

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

אם רוצים להשתמש בכלי כמו Cloud Deploy כדי לפרוס את האפליקציה באשכולות, הקובץ הזה מכיל את פרטי המהדורה. המשמעות היא שהארטיפקטים לא ניתנים לשינוי במסלול ל-production.

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

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

פריסה בסביבת 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

אמורים להופיע שני שמות נפרדים של מודולים, כי בפרופיל 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

הפלט אמור לכלול שורות שדומות לשורות הבאות, שמציגות את הפריסה בסביבת הייצור:

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