פריסת אפליקציה ליעד בשיטת Canary
במדריך למתחילים הזה נסביר איך להשתמש ב-Cloud Deploy כדי לפרוס תמונה של אפליקציה לדוגמה בפריסה של גרסה ראשונית (canary) ל-Google Kubernetes Engine או ל-Cloud Run. (אפשר גם להריץ פריסה של גרסה ראשונית (canary) באשכולות שמצורפים ל-GKE, אבל רק GKE ו-Cloud Run מוצגים במדריך הזה לתחילת העבודה).
פריסה של גרסה ראשונית (canary) מחלקת את התעבורה בין גרסה שכבר נפרסה של האפליקציה לבין הגרסה החדשה. ב-Cloud Run, התעבורה מחולקת לפי האחוזים שמגדירים בצינור העברת הנתונים. GKE פורס את הגרסה החדשה בחלק מה-Pods. במדריך הזה, הפריסה מתבצעת קודם ל-50% מהמשתמשים ואז ל-100%.
במדריך למתחילים הזה יש רק יעד אחד (prod). לכן אנחנו יוצרים רק אשכול GKE אחד או שירות Cloud Run אחד להרצת האפליקציה.
במדריך למתחילים הזה תבצעו את הפעולות הבאות:
יוצרים אשכול GKE אחד או מגדירים שירות Cloud Run אחד.
אפשר לבצע פריסת קנרית גם לאשכולות שמצורפים ל-GKE, אבל במדריך הזה נעשה שימוש רק ב-GKE וב-Cloud Run.
יוצרים הגדרה של Skaffold ומניפסט של Kubernetes כדי לציין את קובץ האימג' של הקונטיינר (שנוצר מראש) שרוצים לפרוס.
מגדירים את צינור עיבוד הנתונים לפריסה ואת יעד הפריסה ב-Cloud Deploy.
כדי להפעיל את צינור ההפצה, יוצרים מהדורה שמופצת באופן אוטומטי ליעד אחד.
בגרסה הראשונה הזו דילגנו על שלב הקנרי.
אפשר לראות את צינור העברת התוכן ואת הגרסה במסוף Google Cloud .
יוצרים גרסה שנייה, הפעם מריצים את שלב הבדיקה הראשונית כדי לפרוס את האפליקציה ל-50%.
מקדמים את הגרסה להשקה ב-100%.
לפני שמתחילים
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud initאם כבר התקנתם את ה-CLI, צריך לוודא שאתם מריצים את הגרסה העדכנית ביותר:
gcloud components update
- מוודאים שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש הרשאות מספיקות.
יכול להיות שלחשבון השירות כבר יש את ההרשאות הנדרשות. השלבים האלה מיועדים לפרויקטים שבהם השבתתם את ההקצאות האוטומטיות של תפקידים בחשבונות שירות שמוגדרים כברירת מחדל.
- קודם מוסיפים את התפקיד
clouddeploy.jobRunner:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@ \ --role="roles/clouddeploy.jobRunner" - מוסיפים את תפקיד המפתח לסביבת זמן הריצה הספציפית.
- ב-GKE וב-GKE עם Gateway API:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@ \ --role="roles/container.developer" - ל-Cloud Run:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@ \ --role="roles/run.developer" -
מוסיפים את התפקיד
iam.serviceAccountUser, שכולל את ההרשאהactAsלפריסה בסביבת זמן הריצה:gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@ \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@ \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
- קודם מוסיפים את התפקיד
יצירת סביבת זמן ריצה
GKE
יוצרים אשכול GKE Autopilot:
gcloud container clusters create-auto canary-quickstart-cluster \
--project=PROJECT_ID \
--region=us-central1
GKE + Gateway API
יצירת אשכול GKE אחד עם הגדרות מומלצות לתמיכה בשימוש ב-Istio:
gcloud container clusters create canary-quickstart-cluster \ --machine-type=n1-standard-1 \ --num-nodes 4 \ --region=us-central1 \ --project=PROJECT_IDמקבלים את פרטי הכניסה לאשכול:
gcloud container clusters get-credentials canary-quickstart-cluster \ --project=PROJECT_ID \ --region=us-central1אם ה-CRD של Kubernetes Gateway API לא נמצאים כבר באשכול, צריך להתקין אותם.
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yamlמפעילים את ההטמעה של בקר השער של Istio על ידי התקנת Istio.
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \ && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
Cloud Run
אם אתם משתמשים ב-Cloud Run, אתם יכולים לדלג על הפקודה הזו. לא צריך לעשות שום דבר בשלב הזה.
הכנת ההגדרה של Skaffold ומניפסט האפליקציה
Cloud Deploy משתמש ב-Skaffold כדי לספק את הפרטים לגבי מה לפרוס ואיך לפרוס אותו בצורה נכונה אל יעד.
במדריך למתחילים הזה יוצרים קובץ skaffold.yaml שמזהה את מניפסט Kubernetes או את תצורת שירות Cloud Run שרוצים לפרוס.
פותחים חלון טרמינל.
יוצרים ספרייה חדשה ועוברים אליה.
GKE
mkdir deploy-canary-quickstart-gke cd deploy-canary-quickstart-gkeGKE + Gateway API
mkdir deploy-canary-quickstart-gke-gatewayapi cd deploy-canary-quickstart-gke-gatewayapiCloud Run
mkdir deploy-canary-quickstart-run cd deploy-canary-quickstart-runיוצרים קובץ בשם
skaffold.yamlעם התוכן הבא:GKE
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - kubernetes.yaml deploy: kubectl: {}GKE + Gateway API
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - kubernetes.yaml deploy: kubectl: {}Cloud Run
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - run.yaml deploy: cloudrun: {}הקובץ הזה הוא הגדרת Skaffold מינימלית, שמזהה את המניפסט. במדריך הזה ליצירת קובץ, אתם יוצרים את הקובץ. אבל אפשר גם לבקש מ-Cloud Deploy ליצור אחד בשבילכם, עבור אפליקציות פשוטות שאינן בסביבת ייצור.
מידע נוסף על הקובץ הזה מופיע ב
skaffold.yamlמאמרי העזרה.יוצרים את מניפסט האפליקציה.
GKE
יוצרים קובץ בשם
kubernetes.yamlבספרייהdeploy-canary-quickstart-gkeעם התוכן הבא:apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app namespace: default spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-image --- apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: selector: app: my-app ports: - protocol: TCP port: 80הקובץ הזה הוא מניפסט של Kubernetes, שמוחל על האשכול כדי לפרוס את האפליקציה. המניפסט הזה כולל את משאבי השירות והפריסה שנדרשים לפריסת קנרית, בנוסף ל-HTTPRoute ולמשאב Gateway שנדרשים לשימוש ב-Gateway API.
קובץ האימג' של קונטיינר שרוצים לפרוס מוגדר כאן כפלייסהולדר,
my-app-image, שמוחלף בקובץ האימג' הספציפי כשיוצרים את הגרסה.GKE + Gateway API
יוצרים קובץ בשם
kubernetes.yamlבספרייהdeploy-canary-quickstart-gke-gatewayapiעם התוכן הבא:kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: my-gateway annotations: networking.istio.io/service-type: "ClusterIP" spec: gatewayClassName: istio listeners: - name: default hostname: "*.example.com" port: 80 protocol: HTTP allowedRoutes: namespaces: from: All --- kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: my-httproute spec: parentRefs: - kind: Gateway name: my-gateway hostnames: - "test.example.com" rules: - backendRefs: - name: my-service port: 80 --- apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-imageהקובץ הזה הוא מניפסט של Kubernetes, שמוחל על האשכול כדי לפרוס את האפליקציה. המניפסט הזה כולל את משאבי השירות והפריסה שנדרשים לפריסת קנרית, בנוסף ל-HTTPRoute ולמשאב Gateway שנדרשים לשימוש ב-Gateway API.
קובץ האימג' של הקונטיינר שרוצים לפרוס מוגדר כאן כפלייסהולדר,
my-app-image, שמוחלף בקובץ האימג' הספציפי כשיוצרים את הגרסה.Cloud Run
יוצרים קובץ בשם
run.yamlבספרייהdeploy-canary-quickstart-runעם התוכן הבא:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-canary-run-service spec: template: spec: containers: - image: my-app-imageהקובץ הזה הוא הגדרה בסיסית של שירות Cloud Run, שמוחלת בזמן הפריסה כדי ליצור את השירות ב-Cloud Run. קובץ האימג' של הקונטיינר שרוצים לפרוס מוגדר כאן כפלייסהולדר,
my-app-image, שמוחלף באימג' הספציפי כשיוצרים את הגרסה.
יצירת צינור העברת נתונים ויעדים
אפשר להגדיר את צינור העברת הנתונים ואת יעדי ההעברה בקובץ אחד או בקבצים נפרדים. במדריך למתחילים הזה, אנחנו יוצרים קובץ אחד לצינור ולמטרה היחידה שלנו:
GKE
יוצרים קובץ בשם clouddeploy.yaml בספרייה deploy-canary-quickstart-gke עם התוכן הבא:
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
kubernetes:
serviceNetworking:
service: "my-service"
deployment: "my-deployment"
canaryDeployment:
percentages: [50]
verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: prod
description: prod GKE cluster
gke:
cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
GKE + Gateway API
יוצרים קובץ בשם clouddeploy.yaml בספרייה deploy-canary-quickstart-gke-gatewayapi עם התוכן הבא:
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
kubernetes:
gatewayServiceMesh:
httpRoute: "my-httproute"
service: "my-service"
deployment: "my-deployment"
canaryDeployment:
percentages: [50]
verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: prod
description: prod GKE cluster
gke:
cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
Cloud Run
יוצרים קובץ בשם clouddeploy.yaml בספרייה deploy-canary-quickstart-run עם התוכן הבא:
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
cloudRun:
automaticTrafficControl: true
canaryDeployment:
percentages: [50]
verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: prod
description: prod Run Service
run:
location: projects/PROJECT_ID/locations/us-central1
רושמים את צינור עיבוד הנתונים ואת היעדים בשירות Cloud Deploy:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_IDעכשיו יש לכם צינור, עם יעד אחד שהוגדר לאסטרטגיית פריסה של קנרית.
מאשרים את הצנרת ואת היעדים:
במסוף Google Cloud , נכנסים לדף Delivery pipelines של Cloud Deploy כדי לראות רשימה של צינורות העברת הנתונים שזמינים לכם.
צינור העברת הנתונים שיצרתם מוצג, והיעד שהגדרתם מופיע בעמודה יעדים.

יצירת גרסה
הפצה היא המשאב המרכזי ב-Cloud Deploy שמייצג את השינויים שנפרסים. צינור העברת התוכן מגדיר את מחזור החיים של הגרסה הזו. פרטים על מחזור החיים הזה מופיעים במאמר ארכיטקטורת שירות Cloud Deploy.
כדי ליצור משאב release שמייצג את קובץ האימג' של הקונטיינר לפריסה, מריצים את הפקודה הבאה מהספרייה deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi או deploy-canary-quickstart-run:
GKE
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-canary-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
GKE + Gateway API
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-canary-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
Cloud Run
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-canary-demo-app-1 \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
שימו לב לדגל --images=, שמשמש להחלפת ה-placeholder (my-app-image) במניפסט או בהגדרת השירות בתמונה הספציפית שעומדת בדרישות SHA. Google ממליצה ליצור תבניות של קובצי המניפסט בדרך הזו, ולהשתמש בשמות תמונות עם SHA כשיוצרים גרסת הפצה.
כשיוצרים גרסת הפצה, Cloud Deploy יוצר באופן אוטומטי גם משאב של פריסה הדרגתית, כדי לפרוס באופן מיידי ליעד אחד, prod.
אנחנו מדלגים לשלב היציב
בגרסה הראשונה הזו, אנחנו מדלגים על שלב הקנרי ופורסים ל-100% (שלב יציב). הסיבה לכך היא שהאפליקציה לא נפרסה בעבר, ולכן אין אפשרות לחשב 50% מהפודים (ב-GKE) או את אופן חלוקת התנועה בשירות (ב-Cloud Run). הפודים (GKE) או הגרסאות (Cloud Run) עדיין לא קיימים.
דילגנו על שלב הקנרי, ועכשיו אנחנו מוכנים להתחיל את השלב היציב, שבו התנועה מגיעה ל-100%. לאחר מכן, ניצור גרסה נוספת, והיא תבצע את בדיקת הקנרי.
במצב אמיתי, בדרך כלל מבצעים פריסה של גרסה ראשונית (canary) שבה האפליקציה כבר פועלת, ולכן דילוג על השלב הזה יהיה נדיר.
צפייה בגרסה במסוף Google Cloud
אחרי שיצרתם את הגרסה הראשונה, תיווצר ההשקה ותוכלו לראות את הגרסה ואת ההשקה ב Google Cloud מסוף. אפשר גם לראות את התצוגה החזותית של צינור עיבוד הנתונים, שבה מוצג הסטטוס הנוכחי של הגרסה.
במסוף Google Cloud , נכנסים לדף Delivery pipelines של Cloud Deploy כדי לראות את צינור אספקת התוכן my-canary-demo-app-1.
לוחצים על השם של צינור העברת הנתונים 'my-canary-demo-app-1'.
בתרשים של צינור הנתונים מוצג סטטוס הפריסה של האפליקציה. מכיוון שיש רק שלב אחד בצינור, ההדמיה מציגה רק צומת אחד.

פריט התוכן יופיע בכרטיסייה פריטי תוכן בקטע פרטים על צינור ההפצה.
לוחצים על שם הגרסה,
test-release-001.ההשקות שלכם יופיעו בקטע השקות. אפשר ללחוץ על השקה כדי לראות את הפרטים שלה, כולל יומן הפריסה.

שימו לב שסטטוס ההשקה הוא 'בהמתנה להתקדמות', וליעד שמוצג בתרשים הצינור יש קישור ל'מעבר לגרסה יציבה'.
התקדמות בשלב ההשקה
אחרי הגרסה הראשונה, דילגנו על שלב ה-canary וההשקה ממתינה להתחלת השלב 'יציב', שבו האפליקציה נפרסת ב-100%:
בתצוגה החזותית של הצינור, לוחצים על העברה לגרסה יציבה.
כשמופיעה בקשה, לוחצים על המשך כדי לאשר.
אחרי כמה דקות, ההשקה נמצאת בשלב 'יציב', והאפליקציה נפרסת ב-100%.

הפעלת פריסה של גרסה ראשונית (canary)
מכיוון שבגרסה הראשונה דילגנו על שלב הקנרי, עכשיו ניצור גרסה נוספת, שבה נבצע פריסת קנרי.
כדי ליצור
releaseחדש, מריצים את הפקודה הבאה מהספרייהdeploy-canary-quickstart-gke,deploy-canary-quickstart-gke-gatewayapiאוdeploy-canary-quickstart-run:GKE
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaaGKE + Gateway API
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaaCloud Run
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296aאחרי כמה דקות, נוצרת השקה, והפעם שלב הקנרי מופעל:

כשהשלב הראשון של ההשקה מסתיים, ההשקה עוברת לשלב הקנרי:

המשמעות היא שהאפליקציה נפרסה עכשיו ל-50%. ב-GKE שמבוסס על serviceNetworking, הוא נפרס למחצית מה-Pods. התנועה ב-GKE וב-Cloud Run שמבוססת על Gateway API מוקצית ל-50%.
לוחצים על הפצה מתקדמת ואז על המשך כשמופיעה בקשה.
הפעולה הזו מעבירה את ההשקה לשלב 'יציב', ומפיצה את האפליקציה ל-100%.

הסרת המשאבים
כדי לא לצבור חיובים לחשבון Google Cloud על המשאבים שבהם השתמשתם בדף הזה:
מחיקת אשכול
canary-quickstart-cluster(GKE בלבד):gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_IDמוחקים את שירות
my-canary-run-service(ב-Cloud Run בלבד):gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_IDמחיקת צינור העברת הנתונים, היעד וכל משאבי ההפצה וההשקה:
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_IDמוחקים את הקטגוריות של Cloud Storage שנוצרו על ידי Cloud Deploy.
אחד מסתיים ב-
_clouddeploy, והשני הוא[region].deploy-artifacts.[project].appspot.com.
סיימתם את המדריך למתחילים.