1. סקירה כללית
בשיעור ה-Lab הזה תלמדו להגדיר צינור עיבוד נתונים לפיתוח רציף (CD) ב-GKE באמצעות Cloud Build. בשיעור ה-Lab הזה נסביר איך להפעיל משימות של Cloud Build לאירועי git שונים, וגם נציג דפוס פשוט של הפצות קנרי אוטומטיות ב-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%.*}; donecat 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 הרשאות לאשכול.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) וייצור:יוצרים את ה-Deployment (פריסה) והשירותים של הייצור ושל גרסה ראשונית (canary) באמצעות פקודות
kubectl apply. השירות שנפרס כאן ינתב תנועה גם לפריסות של גרסה ראשונית (canary) וגם לפריסות של prod.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 שפועלים בקצה הקדמי, כולל שלושה לתנועת Production ואחד לגרסאות איטרטיביות לקהל מצומצם (canary release). כלומר, שינויים בגרסה איטרטיבית לקהל מצומצם (canary release) ישפיעו רק על משתמש אחד מתוך 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 כשמתבצעת פעולת commit בכל ענף חוץ מ-main. קובץ Cloud Build שבו נעשה שימוש כאן ייצור באופן אוטומטי מרחב שמות ופריסה לכל ההסתעפויות הקיימות או החדשות, ויאפשר למפתחים לראות תצוגה מקדימה של הקוד שלהם לפני השילוב עם ההסתעפות הראשית.
- הגדרת הטריגר:הרכיב המרכזי בטריגר הזה הוא השימוש בפרמטר
branchNameכדי להתאים ל-main, ובפרמטרinvertRegexשמוגדר כ-true ומשנה את התבניתbranchNameכך שתתאים לכל דבר שהוא לאmain. לעיון, הנה השורות הרלוונטיות ב-build/branch-trigger.json. בנוסף, השורות האחרונות בקובץ Cloud Build שמשמש עם הטריגר הזה יוצרות מרחב שמות שנקרא על שם הענף שהפעיל את העבודה, ואז פורסות את האפליקציה והשירות במרחב השמות החדש. לעיון, הנה השורות הרלוונטיות בקובץ"branchName": "main", "invertRegex": true
build/branch-cloudbuild.yaml אחרי שהבנתם את המנגנונים שבהם נעשה שימוש, יוצרים את הטריגר באמצעות פקודת gcloud שבהמשך.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/servicesgcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/branch-trigger.json - כדי לבדוק את הטריגר, עוברים אל הדף Cloud Build Triggers במסוף.מעבר אל Triggers
- יצירת ענף חדש:
git checkout -b new-feature-1 - משנים את הקוד כדי לציין v1.1Edit
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 - כדי לבדוק את הסטטוס של הבנייה, עוברים אל הדף Cloud Build History במסוף.עוברים אל Builds אחרי שהבנייה מסתיימת, ממשיכים לשלב הבא.
- מאחזרים את כתובת ה-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) - בודקים את הפלט של הגרסה של השירות. התוכן צריך להיות Hello World v1.0
curl http://$BRANCH_IP
6. אוטומציה של פריסות עבור הענף הראשי של git
לפני שמשחררים קוד לסביבת Production, נהוג לשחרר קוד לקבוצת משנה קטנה של תנועה בזמן אמת לפני העברת כלל התנועה לבסיס ה-code base החדש.
בקטע הזה מטמיעים טריגר שמופעל כשמבצעים קומיט של קוד לענף הראשי. הטריגר פורס את פריסה של גרסה ראשונית (canary) שמקבלת 25% מכל התנועה בזמן אמת לגרסה החדשה.
- מגדירים את הטריגר לענף הראשי:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json - כדי לבדוק את הטריגר החדש, עוברים אל הדף Cloud Build Triggers במסוף.מעבר אל Triggers
- ממזגים את הענף עם השורה הראשית ומבצעים push למאגר המרוחק:
git checkout main git merge new-feature-1 git push gcp main - כדי לבדוק את ה-build בתהליך, עוברים אל הדף Cloud Build History במסוף.עוברים אל Builds אחרי שה-build מסתיים, ממשיכים לשלב הבא.
- בודקים כמה תשובות מהשרת. מריצים את הפקודה הבאה ורואים שכ-25% מהתשובות מציגות את התשובה החדשה Hello World v1.1
כשמוכנים להמשיך, לוחצים עלwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+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 History במסוף.מעבר אל Builds
- בדיקת כמה תגובות מהשרת מריצים את הפקודה הבאה ורואים ש-100% מהתגובות מציגות את התגובה החדשה Hello World v1.1. יכול להיות שיעבור זמן מה עד שהפודים החדשים יופעלו ויבדקו את תקינותם ב-GKE
כשמוכנים להמשיך, לוחצים עלwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+cכדי לצאת מהלולאה.מזל טוב! יצרתם טריגרים של CI/CD ב-Cloud Build לענפים ולתגים כדי לפרוס את האפליקציות שלכם ב-GKE.
8. הסרת המשאבים
מחיקת הפרויקט
- במסוף Cloud, עוברים אל הדף 'ניהול משאבים'.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.