1. סקירה כללית
שיעור ה-Lab הזה להדגים תכונות ויכולות שנועדו לייעל את תהליך הפיתוח עבור מהנדסי תוכנה שתפקידם לפתח אפליקציות Python בסביבה בקונטיינרים. פיתוח אופייני של קונטיינרים מחייב את המשתמשים להבין את הפרטים של קונטיינרים ואת תהליך הפיתוח של הקונטיינרים. בנוסף, בדרך כלל מפתחים צריכים לפרוץ את התהליך ולצאת מסביבת הפיתוח המשולבת (IDE) שלהם כדי לבדוק את האפליקציות שלהם ולנפות באגים בסביבות מרוחקות. בעזרת הכלים והטכנולוגיות שמוזכרים במדריך הזה, מפתחים יכולים לעבוד ביעילות עם אפליקציות בקונטיינרים בלי לצאת מסביבת הפיתוח המשולבת (IDE).
מה זה Cloud Workstations?
פלטפורמת Cloud Workstations מספקת סביבות פיתוח מנוהלות ב-Google Cloud עם אבטחה מובנית וסביבות פיתוח מוגדרות מראש שאפשר להתאים אישית. גישה ל-Cloud Workstations דרך סביבת פיתוח משולבת (IDE) מבוססת דפדפן, מכמה עורכי קוד מקומיים (כמו VSCode או JetBrains IDEs כמו IntelliJ IDEA Ultimate ו-PyCharm Professional) או דרך SSH.
Cloud Workstations משתמש במשאבים הבאים:
- אדמינים יוצרים אשכולות של תחנות עבודה
- בכל אשכול של תחנות עבודה, האדמינים יוצרים מערך הגדרות אישיות אחד או יותר, שישמשו כתבניות לתחנות עבודה.
- המפתחים יכולים ליצור תחנות עבודה שמגדירות סביבות פיתוח שמספקות Cloud IDE, כלי שפה, ספריות ועוד.
בעזרת Cloud Workstations, אדמינים של IT ואבטחה יכולים להקצות, להתאים, לנהל ולאבטח בקלות את סביבות הפיתוח שלהם. בנוסף, הם מאפשרים למפתחים לגשת לסביבות פיתוח באמצעות הגדרות עקביות וכלים שניתנים להתאמה אישית.
שירות Cloud Workstations עוזר להזיז את האבטחה שמאלה על ידי שיפור מצב האבטחה של סביבות פיתוח האפליקציות. הוא כולל תכונות אבטחה כמו VPC Service Controls, תעבורת נתונים נכנסת (ingress) או תעבורת נתונים יוצאת (egress), אילוץ עדכון תמונות ומדיניות גישה של ניהול זהויות והרשאות גישה (IAM).
מה זה Cloud Code?
ב-Cloud Code יש תמיכה בסביבת פיתוח משולבת (IDE) לכל מחזור הפיתוח של אפליקציות Kubernetes ו-Cloud Run, החל מיצירה והתאמה אישית של אפליקציה חדשה – מתבניות לדוגמה ועד הרצה של האפליקציה הסופית. שירות Cloud Code תומך לאורך כל הדרך עם דוגמאות מוכנות להרצה, קטעי קוד של תצורה מוכנים מראש וחוויית ניפוי באגים מותאמת אישית – הרבה יותר קל לפתח באמצעות Kubernetes ו-Cloud Run!
הנה חלק מהתכונה Cloud Code:
- פיתוח והרצה של אפליקציות ברציפות
- תמיכה בניפוי באגים באפליקציית Kubernetes שנמצאת בפיתוח
- סטרימינג וצפייה ביומן
מידע נוסף על תכונות אחרות של Cloud Code.
מה תלמדו
בשיעור ה-Lab הזה תלמדו שיטות לפיתוח עם קונטיינרים ב-GCP, כולל:
- סקירה של Cloud Workstations
- הפעלה של תחנת העבודה
- בדיקת Cloud Code
- ניפוי באגים ב-Kubernetes
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
- Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-
PROJECT_ID
). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט. - לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
הגדרת סביבה
ב-Cloud Shell, מגדירים את מזהה הפרויקט ואת מספר הפרויקט. שומרים אותם כמשתנים מסוג PROJECT_ID
ו-PROJECT_ID
.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
בשיעור ה-Lab הזה תפרסו קוד ל-GKE. גם תחנות העבודה של Cloud ישמשו כסביבת הפיתוח המשולבת (IDE).
סקריפט ההגדרה שבהמשך מכין את התשתית הזו עבורכם.
- מורידים את סקריפט ההגדרה והופכים אותו לניתן להפעלה.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
- פתיחת הקובץ
setup_with_cw.sh
ועריכה של ערכי הסיסמאות שמוגדרים כרגע כ-CHANGEME - תריצו את סקריפט ההגדרה כדי לעמוד באשכול GKE, שבו תשתמשו בשיעור ה-Lab הזה. תהליך ההגדרה יימשך כ-20 דקות.
./setup_with_cw.sh &
- פותחים את Cloud Workstations במסוף Cloud. צריך להמתין שהאשכול יהיה בסטטוס
READY
לפני שעוברים לשלבים הבאים. - אם הסשן של Cloud Shell התנתק, צריך ללחוץ על Reconnect (התחברות מחדש). ואז מריצים את הפקודה cli של gcloud כדי להגדיר את מזהה הפרויקט. לפני הרצת הפקודה, צריך להחליף את מזהה הפרויקט לדוגמה שבהמשך במזהה הפרויקט ב-qwiklabs.
gcloud config set project qwiklabs-gcp-project-id
- כדי ליצור תצורה של Cloud Workstations, צריך להוריד בטרמינל את הסקריפט הבא ולהריץ אותו.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
אשכול ותצורה של Cloud Workstations
פותחים את Cloud Workstations במסוף Cloud. צריך לוודא שהאשכול נמצא בסטטוס READY
.
אימות הסטטוס של ההגדרות הקיימות.
יוצרים תחנת עבודה חדשה.
שינוי השם ל-my-workstation
ובחירה בהגדרה הקיימת: codeoss-python
.
הפעלה של תחנת העבודה
- מפעילים את תחנת העבודה. תחנת העבודה תתחיל לפעול תוך כמה דקות.
- אפשר להשתמש בקובצי Cookie של צד שלישי על ידי לחיצה על הסמל בסרגל הכתובות.
- לוחצים על "האתר לא פועל?".
- לוחצים על "אפשר להשתמש בקובצי Cookie".
- ברגע שתושק תחנת העבודה, יופיע סביבת פיתוח משולבת (IDE) של Code OSS.
לוחצים על 'סימון כ'בוצע''. בדף 'תחילת העבודה', סביבת הפיתוח המשולבת (IDE) של תחנת העבודה
3. סקירה כללית על Cloud Code
סקירה של סעיפים שונים שזמינים ב-Cloud Code.
- פיתוח Kubernetes. יצירת סביבת פיתוח וניפוי באגים ב-Kubernetes שמשולבת באופן מלא בסביבת הפיתוח המשולבת (IDE). יצירה וניהול של אשכולות ישירות מתוך סביבת הפיתוח המשולבת (IDE).
- ניפוי באגים באפליקציות פועלות. ניפוי באגים בקוד בסביבות הפיתוח המשולבות (IDE) באמצעות Cloud Code ל-VS Code ו-Cloud Code ל-IntelliJ באמצעות תכונות מובנות לניפוי באגים בסביבת פיתוח משולבת (IDE).
- סקירת הפריסות. הצגת המשאבים והמטא-נתונים הבסיסיים לאשכולות Kubernetes ולשירותי Cloud Run. אתם יכולים לאחזר תיאור, לצפות ביומנים, לנהל סודות או להעביר טרמינל ישירות ל-Pod.
- פיתוח מקומי ב-Kubernetes בקלות: במסגרת הפרויקט, Cloud Code לסביבות פיתוח משולב (IDE) משתמש בכלים פופולריים כמו Skaffold, Jib ו-kubectl כדי לספק משוב רציף על הקוד בזמן אמת.
כניסה ל-Google Cloud
- לוחצים על הסמל של Cloud Code ובוחרים באפשרות "Sign in to Google Cloud" (כניסה ל-Google Cloud):
- לוחצים על 'המשך לכניסה'.
- בודקים את הפלט ב-Terminal ופותחים את הקישור:
- מתחברים עם פרטי הכניסה של התלמידים ב-Qwiklabs.
- בוחרים באפשרות 'יש אישור':
- מעתיקים את קוד האימות וחוזרים לכרטיסייה 'תחנת עבודה'.
- מדביקים את קוד האימות ומקישים על Enter.
לוחצים על 'אישור'. אם מופיעה ההודעה הזו, כדי שתוכלו להעתיק את ההדבקה לתחנת העבודה.
4. יצירת אפליקציה חדשה של Python לתחילת פעולה
בקטע הזה יוצרים אפליקציית Python חדשה.
- פותחים חלון Terminal חדש.
- יצירת ספרייה חדשה ופתיחתה כסביבת עבודה
mkdir music-service && cd music-service
code-oss-cloud-workstations -r --folder-uri="$PWD"
- יוצרים קובץ בשם
requirements.txt
ומעתיקים אליו את התוכן הבא
Flask
gunicorn
ptvsd==4.3.2
- יוצרים קובץ בשם
app.py
ומדביקים בו את הקוד הבא
import os
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/")
def hello_world():
message="Hello, World!"
return message
if __name__ == '__main__':
server_port = os.environ.get('PORT', '8080')
app.run(debug=False, port=server_port, host='0.0.0.0')
- יוצרים קובץ בשם
Dockerfile
ומדביקים בו את הפרטים הבאים
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]
הערה: בעזרת FLASK_DEBUG=1 אפשר לטעון מחדש באופן אוטומטי שינויי קוד באפליקציית בקבוקון Python. קובץ ה-Docker הזה מאפשר להעביר את הערך הזה כארגומנט build.
יצירת מניפסטים
בטרמינל, מריצים את הפקודה הבאה כדי ליצור ברירת מחדל של skaffold.yaml
ושל deployment.yaml
- אתחול Skaffold באמצעות הפקודה הבאה
skaffold init --generate-manifests
כשמופיעה בקשה, משתמשים בחיצים כדי להזיז את הסמן ובמקש הרווח כדי לבחור אפשרויות.
בוחרים אפשרות:
8080
לשקעy
כדי לשמור את ההגדרה
עדכון ההגדרות של Skaffold
- שינוי שם האפליקציה שמוגדר כברירת מחדל
- פתיחה של
skaffold.yaml
- בחירת שם התמונה שמוגדר כרגע בתור
dockerfile-image
- לוחצים לחיצה ימנית ובוחרים באפשרות 'שינוי כל המופעים'
- יש להקליד את השם החדש בתור
python-app
- ממשיכים לערוך את קטע ה-build כדי
- הוספת
docker.buildArgs
כדי לעבור אתFLASK_DEBUG=1
- צריך לסנכרן את ההגדרות כדי לטעון את השינויים בקובצי
*.py
מסביבת פיתוח משולבת (IDE) למאגר התגים שפועל
אחרי העריכות, קטע ה-build בקובץ skaffold.yaml
יהיה:
build:
artifacts:
- image: python-app
docker:
buildArgs:
FLASK_DEBUG: "1"
dockerfile: Dockerfile
sync:
infer:
- '**/*.py'
שינוי קובץ התצורה של Kubernetes
- שינוי שם ברירת המחדל
- פתיחת קובץ אחד (
deployment.yaml
) - בחירת שם התמונה שמוגדר כרגע בתור
dockerfile-image
- לוחצים לחיצה ימנית ובוחרים באפשרות 'שינוי כל המופעים'
- יש להקליד את השם החדש בתור
python-app
5. להדרכה על תהליך הפיתוח
אחרי שמוסיפים את הלוגיקה העסקית, אפשר לפרוס את האפליקציה ולבדוק אותה. בקטע הבא מוסבר איך משתמשים בפלאגין של Cloud Code. בין היתר, הפלאגין הזה משתלב עם skaffold כדי לפשט את תהליך הפיתוח. כשפורסים ל-GKE בשלבים הבאים, Cloud Code ו-Skaffold ייצרו באופן אוטומטי את קובץ האימג' של הקונטיינר, העבירו אותו ל-Container Registry ולאחר מכן פורסים את האפליקציה your
ב-GKE. התהליך הזה מתרחש מאחורי הקלעים ומסיר את הפרטים מהתהליך למפתחים.
הוספת אשכול Kubernetes
- הוספת אשכול
- בחירת Google Kubernetes Engine:
- בוחרים פרויקט.
- בוחרים באפשרות 'אשכול python' שנוצר בהגדרה הראשונית.
- האשכול יופיע עכשיו ברשימת אשכולות Kubernetes בקטע Cloud Code. מכאן אפשר לנווט באשכול ולחקור אותו.
פריסה ב-Kubernetes
- בחלונית שבחלק התחתון של Cloud Shell Editor, בוחרים באפשרות Cloud Code כוללת
- בחלונית שמופיעה בחלק העליון, בוחרים באפשרות הפעלה ב-Kubernetes.
אם מוצגת הנחיה, בוחרים באפשרות 'כן' כדי להשתמש בהקשר הנוכחי של Kubernetes.
הפקודה הזו מפעילה build של קוד המקור ולאחר מכן מריצה את הבדיקות. ה-build והבדיקות יימשכו כמה דקות. הבדיקות האלה כוללות בדיקות יחידה ושלב אימות שבודק את הכללים שהוגדרו לסביבת הפריסה. שלב האימות הזה כבר מוגדר, והוא מבטיח שתקבלו אזהרה לגבי בעיות בפריסה גם כשאתם עובדים בסביבת הפיתוח.
- בפעם הראשונה שמריצים את הפקודה, תופיע בחלק העליון של המסך הנחיה לשאול אם אתם רוצים את ההקשר הנוכחי של ה-kubernetes, צריך לבחור באפשרות 'כן'. לקבל את ההקשר הנוכחי ולהשתמש בו.
- בשלב הבא תוצג הודעה שמבקשת באיזה מרשם להשתמש. צריך להקיש על Enter כדי לאשר את ערך ברירת המחדל שצוין
- בוחרים באפשרות 'פלט'. בחלונית התחתונה כדי להציג את ההתקדמות וההתראות. באמצעות התפריט הנפתח, בוחרים באפשרות Kubernetes: Run/Debug.
- בוחרים באפשרות Kubernetes: Run/Debug - Detailed (Kubernetes: הרצה/ניפוי באגים - מפורט). בתפריט הנפתח של הערוץ משמאל כדי להציג פרטים נוספים ויומנים בסטרימינג בשידור חי ממאגרי התגים
בסיום ה-build והבדיקות, כתובת ה-URL http://localhost:8080 תופיע במסגרת Kubernetes: Run/Debug ביומני הכרטיסייה 'פלט'. צפייה.
- בטרמינל של Cloud Code, מעבירים את העכבר מעל כתובת ה-URL הראשונה בפלט (http://localhost:8080) ואז בטיפ הכלי שמופיע, בוחרים באפשרות Open Web Preview.
- תיפתח כרטיסייה חדשה בדפדפן שבה תוצג ההודעה:
Hello, World!
טעינה מחדש מתוך הזיכרון (hot Reload)
- פתיחת הקובץ
app.py
- שינוי של הודעת הפתיחה ל
Hello from Python
שימו לב שבחלון Output
, בתצוגה Kubernetes: Run/Debug
, המעקב מסנכרן את הקבצים המעודכנים עם הקונטיינר ב-Kubernetes.
Update initiated Build started for artifact python-app Build completed for artifact python-app Deploy started Deploy completed Status check started Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress Resource deployment/python-app status updated to In Progress Resource deployment/python-app status completed successfully Status check succeeded ...
- אם עוברים לתצוגה
Kubernetes: Run/Debug - Detailed
, רואים שהיא מזהה שינויים בקבצים, ואז בונה ופורס את האפליקציה מחדש
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
- כדי לראות את התוצאות המעודכנות, צריך לרענן את הכרטיסייה בדפדפן במקום שבו ראיתם את התוצאות הקודמות.
ניפוי באגים
- עוברים לתצוגת ניפוי הבאגים ומפסיקים את השרשור הנוכחי
. אם מוצגת בקשה, תוכלו לפנות מקום אחרי כל הרצה.
- לוחצים על
Cloud Code
בתפריט התחתון ובוחרים באפשרותDebug on Kubernetes
כדי להריץ את האפליקציה במצבdebug
.
- בתצוגה
Kubernetes Run/Debug - Detailed
של החלוןOutput
, שימו לב ש-skaffold יפרוס את האפליקציה הזו במצב ניפוי באגים.
- בפעם הראשונה שתפעילו את הקובץ, תוצג שאלה איפה המקור נמצא בתוך הקונטיינר. הערך הזה קשור לספריות בקובץ Docker.
צריך להקיש על Enter כדי לאשר את ברירת המחדל
תהליך הפיתוח והפריסה של האפליקציה נמשך כמה דקות. אם סשן ניפוי הבאגים מנותק, מריצים מחדש את השלבים ל'ניפוי באגים ב-Kubernetes'. מ"סשנים של פיתוח" .
- בסיום התהליך. יופיע כלי לניפוי באגים, ובכרטיסייה 'פלט' יופיע הכיתוב:
Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully.
וכתובת ה-URL http://localhost:8080 מופיעה.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
- הצבע של שורת הסטטוס התחתונה משתנה מכחול לכתום, כדי לציין שהיא במצב ניפוי באגים.
- בתצוגה
Kubernetes Run/Debug
, ניתן לראות שהופעל מאגר תגים שניתן לניפוי באגים
**************URLs***************** Forwarded URL from service python-app: http://localhost:8080 Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default) Update succeeded ***********************************
שימוש בנקודות עצירה (breakpoint)
- פתיחת הקובץ
app.py
- יש למצוא את ההצהרה שבה כתוב
return message
- כדי להוסיף נקודת עצירה לשורה הזו, לוחצים על הרווח הריק שמימין למספר השורה. יוצג אינדיקטור אדום כדי לציין שנקודת העצירה הוגדרה
- טוענים מחדש את הדפדפן ומציינים שהכלי לניפוי באגים עוצר את התהליך בנקודת העצירה (breakpoint) ומאפשר לכם לחקור את המשתנים והמצב של האפליקציה שרצה מרחוק ב-GKE
- לוחצים למטה לקטע 'משתנים'
- לוחצים על 'מקומיים' כדי להציג את המשתנה
"message"
. - לוחצים לחיצה כפולה על שם המשתנה 'message'. בחלון הקופץ, משנים את הערך למשהו אחר, כמו
"Greetings from Python"
- לוחצים על הלחצן 'המשך' בלוח הבקרה של ניפוי הבאגים
.
- בודקים את התשובה בדפדפן, שמציגה עכשיו את הערך המעודכן שהזנתם.
- איך מפסיקים את 'ניפוי הבאגים' במצב 'הפסקה', לוחצים שוב על לחצן העצירה
ומסירים את נקודת העצירה בלחיצה חוזרת על נקודת העצירה.
6. הסרת המשאבים
מעולה! בשיעור ה-Lab הזה יצרתם מאפס אפליקציית Python חדשה והגדרתם אותה לפעול ביעילות עם קונטיינרים. לאחר מכן פרסתם את האפליקציה וביצעתם ניפוי באגים באשכול GKE מרוחק, בהתאם לתהליך הפיתוח של האפליקציה בסטאק אפליקציות מסורתי.
כדי לפנות מקום אחרי שמשלימים את שיעור ה-Lab:
- מחיקת הקבצים ששימשו בשיעור ה-Lab
cd ~ && rm -rf ~/music-service
- מחיקת הפרויקט כדי להסיר את כל התשתית והמשאבים הקשורים
—
עדכון אחרון: 22.03.23