1. סקירה כללית
בשיעור ה-Lab הזה תלמדו להגדיר צינור עיבוד נתונים לפיתוח רציף (continuous delivery) ל-GKE באמצעות Cloud Build. בשיעור ה-Lab הזה נדגיש איך להפעיל משימות ב-Cloud Build לאירועי git שונים, וגם דפוס פשוט לגרסאות אוטומטיות של גרסה ראשונית (canary) ב-GKE.
כך תבצעו את השלבים הבאים:
- יצירת אפליקציית GKE
- אוטומציה של פריסות להסתעפויות Git
- אוטומציה של פריסות בהסתעפות הראשית ב-Git
- אוטומציה של פריסות של תגי git
2. לפני שמתחילים
במדריך הזה תצטרכו פרויקט ב-Google Cloud. אפשר ליצור פרויקט חדש או לבחור פרויקט שכבר יצרתם:
- בוחרים פרויקט קיים או יוצרים פרויקט חדש ב-Google Cloud.
- מפעילים את החיוב בפרויקט.
3. הכנת הסביבה
- יוצרים משתני סביבה לשימוש במדריך הזה:
export PROJECT_ID=$(gcloud config get-value project) export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') export ZONE=us-central1-b export CLUSTER=gke-progression-cluster export APP_NAME=myapp
- מפעילים את ממשקי ה-API הבאים:
- Resource Manager
- GKE
- Cloud Source Repositories
- Cloud Build
- Container Registry
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ sourcerepo.googleapis.com \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ --async
- משכפלים את המקור לדוגמה ועוברים לספריית שיעור ה-Lab:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression cd gke-progression/labs/gke-progression rm -rf ../../.git
- מחליפים את הערכים הזמניים לשמירת מקום (placeholder) במאגר לדוגמה ב-
PROJECT_ID
:בשלב הזה יוצרים מופעים של קובצי התצורה השונים שייחודיים לסביבה הנוכחית.כדי לראות דוגמה של התבניות שעודכנו, מריצים את הפקודה הבאה.
מריצים את הפקודה הבאה כדי להחליף את המשתנים.cat k8s/deployments/dev/frontend-dev.yaml.tmpl
כדי לראות דוגמה של הקובץ אחרי ההחלפה, מריצים את הפקודה הבאה.for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
cat k8s/deployments/dev/frontend-dev.yaml
- אם לא השתמשתם ב-Git ב-Cloud Shell בעבר, צריך להגדיר את הערכים
user.name
ו-user.email
שבהם רוצים להשתמש:git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_USERNAME"
- שומרים את הקוד מהמאגר לדוגמה ב-Cloud Source Repositories:
gcloud source repos create gke-progression git init git config credential.helper gcloud.sh git remote add gcp https://source.developers.google.com/p/$PROJECT_ID/r/gke-progression git branch -m main git add . && git commit -m "initial commit" git push gcp main
- יוצרים אשכול GKE.
gcloud container clusters create ${CLUSTER} \ --project=${PROJECT_ID} \ --zone=${ZONE}
- נותנים ל-Cloud Build הרשאות ל-cluster.Cloud Build יבצע פריסה של האפליקציה באשכול GKE שלכם, ויהיו צורך בהרשאות כדי לעשות זאת.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
הסביבה שלך מוכנה
4. יצירת אפליקציית GKE
בקטע הזה תיצרו ותפרסו את האפליקציה הראשונית במסלול לסביבת הייצור שבה תשתמשו במדריך הזה.
- פיתוח האפליקציה באמצעות Cloud Build:
gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
- פריסה ידנית בסביבות Canary ובסביבות ייצור:יצירת פריסות ושירותים של סביבת הייצור ושל גרסה ראשונית (canary) באמצעות הפקודות
kubectl apply
.
השירות שנפרס כאן ינתב את התנועה גם לפריסה הקנונית וגם לפריסת הייצור.kubectl create ns production kubectl apply -f k8s/deployments/prod -n production kubectl apply -f k8s/deployments/canary -n production kubectl apply -f k8s/services -n production
- בודקים את מספר ה-Pods הפעילים ומוודאים שיש ארבעה Pods שרצים בחזית, כולל שלושה לתעבורת נתונים בסביבת הייצור ויחידה אחת לגרסאות של גרסה ראשונית (canary). המשמעות היא ששינויים בגרסה הקנונית ישפיעו רק על 1 מתוך 4 (25%) מהמשתמשים.
kubectl get pods -n production -l app=$APP_NAME -l role=frontend
- מאחזרים את כתובת ה-IP החיצונית של השירותים בסביבת הייצור.
אחרי שמאזן העומסים מחזיר את כתובת ה-IP, ממשיכים לשלב הבאkubectl get service $APP_NAME -n production
- אחסון כתובת ה-IP החיצונית לשימוש מאוחר יותר.
export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services $APP_NAME)
- מעיינים באפליקציה בודקים את פלט הגרסה של השירות. צריך להיות כתוב: Hello World v1.0
curl http://$PRODUCTION_IP
מעולה! פרסת את האפליקציה לדוגמה! בשלב הבא תגדירו טריגרים לפריסה רציפה של השינויים.
5. אוטומציה של פריסות להסתעפויות Git
בקטע הזה תגדירו טריגר שיבצע משימת Cloudbuild בכל הסתעפות שאינה main
. בעזרת קובץ Cloud Build שבו תשתמשו כאן ייווצר באופן אוטומטי מרחב שמות ופריסה להסתעפות קיימת או חדשה, וכך המפתחים יוכלו לצפות בתצוגה מקדימה של הקוד לפני השילוב עם ההסתעפות הראשית.
- מגדירים את הטריגר:הרכיב העיקרי של הטריגר הזה הוא השימוש בפרמטר
branchName
כדי לבצע התאמה ל-main
ובפרמטרinvertRegex
שמוגדר כ-True ומשנה את הדפוסbranchName
כך שיתאים לכל דבר שאינוmain
. לידיעתך, השורות הבאות מופיעות ב-build/branch-trigger.json
."branchName": "main", "invertRegex": true
בנוסף, השורות האחרונות בקובץ Cloud Build שבו נעשה שימוש בטריגר הזה יוצרות מרחב שמות שנקרא על שם ההסתעפות שהפעילה את המשימה, ואז האפליקציה והשירות פורסים במרחב השמות החדש. לידיעתך, השורות הבאות מופיעות ב-build/branch-cloudbuild.yaml
kubectl get ns ${BRANCH_NAME} || kubectl create ns ${BRANCH_NAME} kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/deployments/dev kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/services
עכשיו, אחרי שאתם מבינים את המנגנונים שבהם אתם משתמשים, אתם יכולים ליצור את הטריגר באמצעות הפקודה gcloud שלמטה.gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/branch-trigger.json
- כדי לבדוק את הטריגר, נכנסים לדף Cloud Build Triggers במסוף.כניסה לדף Triggers
- יצירת הסתעפות חדשה:
git checkout -b new-feature-1
- משנים את הקוד כך שיציין את גרסה 1.1. עריכת
src/app.py
ומשנים את התשובה מ-1.0 ל-1.1@app.route('/') def hello_world(): return 'Hello World v1.1'
- שומרים את השינוי ודוחפים למאגר המרוחק:
git add . && git commit -m "updated" && git push gcp new-feature-1
- כדי לבדוק את ה-build בתהליך, נכנסים אל דף ההיסטוריה של Cloud Build במסוף.כניסה ל-Buildsאחרי שה-build מסתיים, ממשיכים לשלב הבא
- מאחזרים את כתובת ה-IP החיצונית של שירות ההסתעפות החדש שנפרס.
אחרי שמאזן העומסים מחזיר את כתובת ה-IP, ממשיכים לשלב הבאkubectl get service $APP_NAME -n new-feature-1
- אחסון כתובת ה-IP החיצונית לשימוש מאוחר יותר.
export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=new-feature-1 services $APP_NAME)
- מעיינים ב- applicationCheck את פלט הגרסה של השירות. צריך להיות כתוב: Hello World v1.0
curl http://$BRANCH_IP
6. אוטומציה של פריסות להסתעפות הראשית ב-Git
לפני שחרור הקוד לסביבת הייצור, מקובל לשחרר קוד לקבוצת משנה קטנה של תנועה פעילה לפני ההעברה של כל התנועה לבסיס הקוד החדש.
בקטע הזה תצטרכו להטמיע טריגר שמופעל כשמשייכים את הקוד להסתעפות הראשית. הטריגר פורס את הפריסה של גרסה ראשונית (canary) שמקבלת 25% מכל התנועה בזמן אמת לגרסה החדשה.
- מגדירים את הטריגר להסתעפות הראשית:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json
- כדי לבדוק את הטריגר החדש, נכנסים לדף Cloud Build Triggers (טריגרים) במסוף.כניסה לדף Triggers (טריגרים)
- ממזגים את ההסתעפות לשורה הראשית ודוחפים למאגר המרוחק:
git checkout main git merge new-feature-1 git push gcp main
- כדי לבדוק את ה-build בתהליך, נכנסים אל דף ההיסטוריה של Cloud Build במסוף.כניסה ל-Buildsאחרי שה-build מסתיים, ממשיכים לשלב הבא
- בודקים את התגובות המרובות מה-serverRun באמצעות הפקודה הבאה, ושימו לב שבכ-25% מהתגובות מוצגת התגובה החדשה של Hello World v1.1
כשהכול מוכן, אפשר להמשיך ללחוץ עלwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
Ctrl+c
כדי לצאת מהלולאה.
7. אוטומציה של פריסות לתגי git
אחרי אימות הפריסה של גרסה ראשונית (canary) עם קבוצת משנה קטנה של תנועה, משחררים את הפריסה לשאר התנועה בזמן אמת.
בקטע הזה נסביר איך מגדירים טריגר שמופעל כשיוצרים תג במאגר. הטריגר מסמן את התמונה עם התג המתאים ואז פורס את העדכונים כדי להבטיח ש-100% מהתנועה ניגשת לתמונה המתויגת.
- מגדירים את טריגר התג:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/tag-trigger.json
- כדי לבדוק את הטריגר החדש, נכנסים לדף Cloud Build Triggers (טריגרים) במסוף.כניסה לדף Triggers (טריגרים)
- יוצרים תג חדש בדחיפה למאגר המרוחק:
git tag 1.1 git push gcp 1.1
- כדי לבדוק את ה-build בתהליך, נכנסים לדף ההיסטוריה של Cloud Build במסוף.כניסה ל-Builds
- בודקים את התגובות המרובות מה-serverRun להרצת הפקודה הבאה, והערה: ב-100% מהתשובות מוצגת התגובה החדשה של Hello World v1.1הפעולה עשויה להימשך כמה רגעים בזמן שהקבוצות החדשות נפרסות ונבדקות תקינות ב-GKE
כדי להמשיך, אפשר ללחוץ עלwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
Ctrl+c
כדי לצאת מהלולאה.כל הכבוד! יצרתם טריגרים ל-CI/CD ב-Cloud Build להסתעפויות ולתגים, כדי לפרוס את האפליקציות שלכם ב-GKE.
8. הסרת המשאבים
מחיקת הפרויקט
- במסוף Cloud, עוברים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.