להבין את Skaffold

1. מטרות

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

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

תצטרכו:

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

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

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

  1. פותחים את Cloud Shell Editor בכתובת ה-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 Pipeline Stages (שלבי צינור 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 מכיל הגדרות שקובעות את תצורות ה-build, הבדיקה והפריסה בהקשרים שונים. בדרך כלל, הקשרים השונים הם סביבות שונות בצינור הפריסה של האפליקציה, כמו staging או prod בדוגמה הזו. המשמעות היא שאתם יכולים לנהל בקלות קובצי מניפסט שהתוכן שלהם צריך להיות שונה בסביבות יעד שונות, בלי לחזור על הגדרות סטנדרטיות.

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

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

  1. פותחים את הקובץ הבא app > main.go בחלונית IDE. זוהי אפליקציית golang פשוטה שכותבת מחרוזת ל-stdout בכל שנייה.
  2. שימו לב שהאפליקציה מוציאה גם את השם של ה-Pod של 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

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

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

שימו לב שהשם המדויק של ה-pod יהיה שונה מהפלט הכללי שמופיע למעלה.

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

עכשיו שהאפליקציה פועלת באשכול 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 בסביבת הפיתוח המשולבת ומשנים את השורה:
replicas: 1

עד

replicas: 2

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

  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

אחרי שהפריסה תושלם, אמור להופיע פלט משני פודים שדומה לזה שמופיע כאן:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. מקישים על Ctrl-C בחלון הטרמינל כדי להפסיק את הפלט של Skaffold.
  2. מריצים את הפקודה הבאה כדי לראות שהאפליקציה פועלת באשכול:
kubectl get all --namespace staging

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

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