1. מטרות
Skaffold הוא כלי שמטפל בתהליך העבודה של פיתוח, דחיפה ופריסה של האפליקציה. אפשר להשתמש ב-Skaffold כדי להגדיר בקלות סביבת פיתוח מקומית, לייעל את לולאת הפיתוח הפנימית ולשלב עם כלים אחרים כמו Kustomize ו-Helm כדי לנהל את המניפסטים של Kubernetes.
במדריך הזה תלמדו על כמה מעקרונות הליבה של Skaffold, תוכלו להשתמש בו כדי להפוך את לולאת הפיתוח הפנימית שלכם לאוטומטית, ואז לפרוס אפליקציה.
אתם:
- הגדרה והפעלה של Skaffold לפיתוח מקומי
- פיתוח והרצה של אפליקציית Golang פשוטה
- ניהול הפריסה של אפליקציות מקומיות באמצעות Skaffold
- עיבוד מניפסטים ופריסה של האפליקציה
2. לפני שמתחילים
הכנת סביבת העבודה
- כדי לפתוח את העורך של Cloud Shell, עוברים לכתובת ה-URL הבאה:
https://shell.cloud.google.com
מאשרים את השימוש בקובצי cookie של צד שלישי. לוחצים על 'האתר לא פועל' ואז על 'אישור קובצי Cookie'.
- אם עדיין לא עשיתם זאת, בחלון הטרמינל משכפלים את מקור האפליקציה באמצעות הפקודה הבאה:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- עוברים לספריית המאגר המשוכפל:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
- כדי להגדיר את סביבת העבודה ב-Cloud Shell לספרייה הנוכחית, מריצים את הפקודה הבאה:
cloudshell workspace .
הכנת הפרויקט
- מריצים את הפקודה הבאה כדי לוודא שהפרויקט ב-Google Cloud מוגדר כראוי:
gcloud config set project {{project-id}}
3. תחילת העבודה עם Skaffold
- מריצים את הפקודה הבאה כדי ליצור את קובץ התצורה ברמת העליונה של 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
- פותחים את הקובץ
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
. שימו לב שמספר הרפליקות של האפליקציה מוגדר כאן לשלוש, ומבטל את הגדרת הבסיס.
ניווט בקוד המקור של האפליקציה.
- פותחים את הקובץ
app > main.go
בחלונית של סביבת הפיתוח המשולבת. זוהי אפליקציית golang פשוטה שכותבת מחרוזת ל-stdout
בכל שנייה. - שימו לב שהאפליקציה גם מוציאה את השם של ה-pod ב-Kubernetes שבו היא פועלת.
הצגת קובץ ה-Docker
- פותחים את הקובץ
app > Dockerfile
בחלונית IDE. הקובץ הזה מכיל רצף של הנחיות ליצירת קובץ האימג' של קונטיינר האפליקציה עבור הקובץmain.go
, והוא מופיע בקובץskaffold.yaml
ברמה העליונה.
7. פיתוח באמצעות Skaffold
הגדרת סביבת Kubernetes
- מריצים את הפקודה הבאה כדי לוודא שאשכול Kubernetes המקומי פועל ומוגדר:
minikube start
התהליך עשוי להימשך כמה דקות. אם האשכול התחיל בהצלחה, אתם אמורים לראות את הפלט הבא:
Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
- מריצים את הפקודה הבאה כדי ליצור מרחבי שמות של Kubernetes עבור
dev
, staging
ו-prod
:
kubectl apply -f namespaces.yaml
הפלט אמור להיראות כך:
namespace/dev created namespace/staging created namespace/prod created
שימוש ב-Skaffold לפיתוח מקומי
- מריצים את הפקודה הבאה כדי ליצור את האפליקציה ולפרוס אותה באשכול Kubernetes מקומי שפועל ב-Cloud Shell:
skaffold dev
תהליך ה-build של קונטיינר של האפליקציה אמור להימשך כמה דקה, ואז הפלט של האפליקציה חוזר על עצמו בכל שנייה:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx
חשוב לזכור ששם ה-pod המדויק ישתנה מהפלט הגנרי שצוין למעלה.
ביצוע שינויים באפליקציה
עכשיו, כשהאפליקציה פועלת באשכול Kubernetes המקומי, אפשר לבצע שינויים בקוד, ו-Skaffold יבנה מחדש את האפליקציה ופורס אותה מחדש באשכול באופן אוטומטי.
- פותחים את הקובץ
app > main.go
בחלונית של סביבת הפיתוח המשולבת, ומשנים את מחרוזת הפלט:
"Hello world from pod %s!\n"
אל:
"Hello Skaffold world from pod %s!\n"
אחרי שתבצעו את השינוי, אתם אמורים לראות ש-Skaffold בונה מחדש את התמונה ולפרוס אותה מחדש באשכול. השינוי בפלט אמור להופיע בחלון הטרמינל.
- עכשיו, גם בקובץ app > main.go בחלונית של סביבת הפיתוח המשולבת (IDE), משנים את השורה:
time.Sleep(time.Second * 1)
עד
time.Sleep(time.Second * 10)
שוב, האפליקציה אמורה להיבנות מחדש ולהופיע מחדש, עם שורת הפלט שמופיעה כל 10 שניות.
ביצוע שינויים בהגדרות של Kubernetes
בשלב הבא תבצעו שינוי בהגדרות של Kubernetes, ו-Skaffold שוב יבצע פריסה מחדש באופן אוטומטי.
- פותחים את הקובץ
base > deployment.yaml
בסביבת הפיתוח המשולבת (IDE) ומשנים את השורה:
replicas: 1
עד
replicas: 2
אחרי שתפרסו מחדש את האפליקציה, אמורים להופיע שני פולדים שפועלים – לכל אחד מהם יהיה שם שונה.
- עכשיו משנים את אותה שורה בקובץ
base > deployment.yaml
חזרה ל:
replicas: 1
אחד מה-pods אמור להסיר מהשירות, כך שיישאר רק אחד.
- לסיום, מקישים על
Ctrl-C
בחלון המסוף כדי להפסיק את הפיתוח המקומי ב-Skaffold.
חיתוך של פריט תוכן
בשלב הבא תיצורו גרסה חדשה על ידי יצירה של קובץ אימג' לגרסה החדשה ופריסה שלו באשכול.
- כדי ליצור את הגרסה, מריצים את הפקודה הבאה:
skaffold build --file-output artifacts.json
הפקודה הזו תיצור את קובץ האימג' הסופי (אם יש צורך) ותפיק את פרטי הגרסה לקובץ artifacts.json
.
אם רוצים להשתמש בכלי כמו Cloud Deploy כדי לפרוס את האפליקציה באשכולות, הקובץ הזה מכיל את פרטי המהדורה. המשמעות היא שהארטיפקטים לא ניתנים לשינוי במסלול ל-production.
- מריצים את הפקודה הבאה כדי להציג את התוכן של הקובץ
artifacts.json
:
cat artifacts.json | jq
שימו לב שהקובץ מכיל את ההפניה ל-image שתשמש בפריסה הסופית.
פריסה בסביבת Staging
- מריצים את הפקודה הבאה כדי לפרוס את הגרסה באמצעות פרופיל
staging
:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail
בסיום הפריסה, אתם אמורים לראות פלט משני רצפי מודעות דומים לפלט הבא:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
- כדי להפסיק את הפלט של Skaffold, מקישים על Ctrl-C בחלון הטרמינל.
- מריצים את הפקודה הבאה כדי לוודא שהאפליקציה פועלת באשכול:
kubectl get all --namespace staging
אמורים להופיע שני שמות נפרדים של מודולים, כי בפרופיל staging
של האפליקציה צוין שצריכים להיות שני רפליקות בפריסה.
פריסה בסביבת הייצור
- עכשיו מריצים את הפקודה הבאה כדי לפרוס את הגרסה באמצעות פרופיל
prod
:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail
בסיום הפריסה, אתם אמורים לראות פלט משלושה רצפי מודעות דומים לפלט הבא:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
- כדי להפסיק את הפלט של Skaffold, מקישים על Ctrl-C בחלון הטרמינל.
אמורים להופיע שלושה שמות Pod נפרדים, כי הפרופיל prod
של האפליקציה מציין שאמור להיות שלוש רפליקות בפריסה.
- מריצים את הפקודה הבאה כדי לוודא שהאפליקציה פועלת באשכול:
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:
הסרת המשאבים
- מריצים את הפקודה הבאה כדי לכבות את האשכולות המקומיים:
minikube delete