1. מטרות
Skaffold הוא כלי שמטפל בתהליך העבודה ביצירה, בדחיפה ובפריסה של האפליקציה. אפשר להשתמש ב-Skaffold כדי להגדיר בקלות סביבת עבודה מקומית לפיתוח, לייעל את לולאת הפיתוח הפנימית ולהשתלב עם כלים אחרים כמו Kustomize ו-Helm שעוזרים לנהל את המניפסטים של Kubernetes.
במדריך הזה תלמדו על כמה מעקרונות הליבה של Skaffold, תוכלו להשתמש בו כדי להפוך את לולאת הפיתוח הפנימית שלכם לאוטומטית, ואז לפרוס אפליקציה.
אתם:
- הגדרה והפעלה של Skaffold לפיתוח מקומי
- בנייה והפעלה של אפליקציית golang פשוטה
- ניהול הפריסה של אפליקציות מקומיות באמצעות Skaffold
- עיבוד מניפסטים ופריסת האפליקציה
2. לפני שמתחילים
סביבת העבודה בהכנה
- נכנסים לכתובת ה-URL הבאה כדי לפתוח את העורך של Cloud Shell:
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 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
. שימו לב שמספר הרפליקות של האפליקציה מוגדר כאן להיות שלוש, תוך ביטול ההגדרה הבסיסית.
ניווט בקוד המקור של האפליקציה.
- פותחים את הקובץ הבא
app > main.go
בחלונית IDE. זהו אפליקציית 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
שימו לב שהשם המדויק של רצף המודעות יהיה שונה מהפלט הגנרי שמופיע למעלה.
ביצוע שינויים באפליקציה
עכשיו, כשהאפליקציה פועלת באשכול המקומי של Kubernetes, אתם יכולים לבצע שינויים בקוד ו-Skaffold יבנה מחדש ותפרס מחדש את האפליקציה באשכול באופן אוטומטי.
- פותחים את הקובץ
app > main.go
בחלונית סביבת הפיתוח המשולבת (IDE) ומשנים את מחרוזת הפלט:
"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 כדי לפרוס באשכולות, הקובץ יכלול את פרטי הגרסה. המשמעות היא שלא ניתן לשנות את פריטי המידע שנוצרו בתהליך הפיתוח(Artifact).
- מריצים את הפקודה הבאה כדי לראות את תוכן הקובץ
artifacts.json
:
cat artifacts.json | jq
שימו לב שהקובץ מכיל את ההפניה לתמונה שתופיע בפריסה הסופית.
פריסה ל-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
אמורים להופיע שני שמות Pod נפרדים, כי הפרופיל 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
אתם אמורים לראות פלט שמכיל קווים דומים לפלט הבא, שמציגים את פריסת ה-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