פריסת אפליקציה למספר יעדים בו-זמנית

בדף הזה נסביר איך להשתמש ב-Cloud Deploy כדי לפרוס אפליקציה לדוגמה לשני יעדים בו-זמנית – פריסה מקבילה.

במדריך למתחילים הזה תבצעו את הפעולות הבאות:

  1. יוצרים שני אשכולות GKE או שני שירותים של Cloud Run.

    אפשר לפרוס במקביל גם לאשכולות שמצורפים ל-GKE, אבל במדריך הזה נעשה שימוש רק ב-GKE וב-Cloud Run.

  2. יוצרים הגדרת Skaffold ומניפסט של Kubernetes או הגדרת שירות של Cloud Run.

  3. הגדרת צינור עיבוד הנתונים לפריסה ויעדי הפריסה ב-Cloud Deploy.

    בצנרת הזו יהיה רק יעד אחד, אבל היעד הזה יהיה יעד מרובה – יעד שמייצג יותר מיעד פריסה אחד. היעד המרובה הזה יכלול שני יעדים בפועל, ויציג את האפליקציה בשני האשכולות או השירותים.

  4. כדי ליצור מופע של צינור ההפצה, יוצרים גרסת הפצה שנפרסת באופן אוטומטי לשני יעדי הפריסה במקביל.

  5. אפשר לראות את ההשקה של בקר התנועה ואת ההשקות של בקרים משניים במסוף Google Cloud .

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. התקינו את ה-CLI של Google Cloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  14. אם ה-CLI כבר מותקן, צריך לוודא שאתם מריצים את הגרסה העדכנית:

    gcloud components update
    

  15. מוודאים שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש הרשאות מספיקות.

    יכול להיות שלחשבון השירות כבר יש את ההרשאות הנדרשות. השלבים האלה מיועדים לפרויקטים שבהם השבתתם את מתן התפקידים האוטומטי לחשבונות שירות שמוגדרים כברירת מחדל.

    1. קודם מוסיפים את התפקיד clouddeploy.jobRunner:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.jobRunner"
      

    2. מוסיפים את תפקיד המפתח לזמן הריצה הספציפי.
      • ב-GKE:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --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@developer.gserviceaccount.com \
            --role="roles/run.developer"
        

    3. מוסיפים את התפקיד iam.serviceAccountUser, שכולל את ההרשאה actAs לפריסה בסביבת זמן הריצה:

      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

יצירת סביבות זמן ריצה

אם אתם מבצעים פריסה ב-Cloud Run, אתם יכולים לדלג על הפקודה הזו.

ב-GKE, יוצרים שני אשכולות: quickstart-cluster-qsprod1 ו-quickstart-cluster-qsprod2, עם הגדרות ברירת מחדל. נקודות הקצה של Kubernetes API באשכולות צריכות להיות נגישות ברשת מהאינטרנט הציבורי. אשכולות GKE נגישים חיצונית כברירת מחדל.

gcloud container clusters create-auto quickstart-cluster-qsprod1 \
                 --project=PROJECT_ID \
                 --region=us-central1 \
                 && gcloud container clusters create-auto quickstart-cluster-qsprod2 \
                 --project=PROJECT_ID \
                 --region=us-west1

הכנת התצורה של Skaffold ומניפסט האפליקציה

‫Cloud Deploy משתמש ב-Skaffold כדי לספק את הפרטים לגבי מה לפרוס ואיך לפרוס אותו בצורה נכונה עבור יעדים נפרדים.

במדריך למתחילים הזה יוצרים קובץ skaffold.yaml, שמזהה את מניפסט האפליקציה שבו יש להשתמש כדי לפרוס את האפליקציה לדוגמה.

  1. פותחים חלון טרמינל.

  2. יוצרים ספרייה חדשה ועוברים אליה.

    GKE

    mkdir deploy-gke-parallel-quickstart
    cd deploy-gke-parallel-quickstart
    

    Cloud Run

    mkdir deploy-run-parallel-quickstart
    cd deploy-run-parallel-quickstart
    
  3. יוצרים קובץ בשם skaffold.yaml עם התוכן הבא:

    GKE

    apiVersion: skaffold/v4beta1
    kind: Config
    manifests:
      rawYaml:
      - k8s-deployment.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta1
    kind: Config
    manifests:
      rawYaml:
      - service.yaml
    deploy:
      cloudrun: {}
    

    הקובץ הזה הוא קובץ תצורה מינימלי של Skaffold. במדריך למתחילים הזה, אתם יוצרים את הקובץ. אבל אפשר גם לבקש מ-Cloud Deploy ליצור אחד בשבילכם, עבור אפליקציות פשוטות שאינן בסביבת ייצור.

    מידע נוסף על הקובץ הזה מופיע בskaffold.yamlמאמרי העזרה.

  4. יוצרים את ההגדרה של האפליקציה – הגדרת שירות ל-Cloud Run או מניפסט של Kubernetes ל-GKE.

    GKE

    יוצרים קובץ בשם k8s-deployment.yaml עם התוכן הבא:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
      namespace: default
    spec:
      replicas: 1 # from-param: ${replicaCount}
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    

    הקובץ הזה הוא מניפסט פשוט של Kubernetes, שמוחל על האשכול כדי לפרוס את האפליקציה. תמונת הקונטיינר לפריסה מוגדרת כאן כ-placeholder, ‏ my-app-image, שמוחלף בתמונה הספציפית כשיוצרים את הגרסה.

    Cloud Run

    יוצרים קובץ בשם service.yaml עם התוכן הבא:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: my-parallel-run-service
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/minScale: 1 # from-param: ${minInstances}
        spec:
          containers:
          - image: my-app-image
    

    הקובץ הזה הוא הגדרה פשוטה של שירות Cloud Run, שמשמש בזמן הפריסה ליצירת שירות Cloud Run. קובץ האימג' של הקונטיינר לפריסה מוגדר כאן כפלייסהולדר, my-app-image, שמוחלף באימג' הספציפי כשיוצרים את הגרסה.

יצירת פייפליין של משלוחים ויעדים

אפשר להגדיר את צינור הנתונים ואת יעדי הנתונים בקובץ אחד או בקבצים נפרדים. במדריך למתחילים הזה מוסבר איך ליצור קובץ יחיד.

  1. יוצרים את צינור ההפצה ואת הגדרת היעד:

    GKE

    בספרייה deploy-gke-parallel-quickstart, יוצרים קובץ חדש: clouddeploy.yaml, עם התוכן הבא:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-parallel-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: qsprod-multi
        profiles: []
        deployParameters:
        - values:
            replicaCount: "1"
          matchTargetLabels:
            label1: label1
        - values:
            replicaCount: "2"
          matchTargetLabels:
            label2: label2
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-multi
    description: production clusters
    multiTarget:
      targetIds: [qsprod-a, qsprod-b]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-a
      labels:
        label1: label1
    description: production cluster 2
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/quickstart-cluster-qsprod1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-b
      labels:
        label2: label2
    description: production cluster 3
    gke:
      cluster: projects/PROJECT_ID/locations/us-west1/clusters/quickstart-cluster-qsprod2
    

    Cloud Run

    בספרייה deploy-run-parallel-quickstart, יוצרים קובץ חדש: clouddeploy.yaml, עם התוכן הבא:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-parallel-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: qsprod-multi
        profiles: []
        deployParameters:
        - values:
            minInstances: "2"
          matchTargetLabels:
            label1: label1
        - values:
            minInstances: "3"
          matchTargetLabels:
            label2: label2
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-multi
    description: production
    multiTarget:
      targetIds: [qsprod-a, qsprod-b]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-a
      labels:
        label1: label1
    description: production us-central1
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-b
      labels:
        label2: label2
    description: production us-west1
    run:
      location: projects/PROJECT_ID/locations/us-west1
    

    שימו לב שהקובץ הזה כולל שלושה יעדים: יעד מרובה ושני יעדי צאצא. אפשר גם להגדיר יעדים בקובץ נפרד, במקום בצינור העברת הנתונים.

    שימו לב גם שצינור העברת הנתונים כולל את deployParameters עם תוויות, ויעדי הצאצא כוללים תוויות שתואמות לפרמטרים האלה. כך תוכלו להעביר ערכים נפרדים ליעדי צאצא נפרדים, אם תרצו. מידע נוסף

  2. רושמים את צינור עיבוד הנתונים ואת היעדים בשירות Cloud Deploy:

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    עכשיו יש לכם צינור עיבוד נתונים עם יעד מרובה אחד שכולל שני יעדים של GKE או Cloud Run, והוא מוכן לפריסת האפליקציה.

  3. מאשרים את הצנרת ואת היעדים:

    במסוף Google Cloud , נכנסים לדף Delivery pipelines של Cloud Deploy כדי לראות רשימה של צינורות העברת הנתונים שזמינים לכם.

    פתיחת הדף Delivery pipelines

    מוצג צינור העברת הנתונים שיצרתם. שימו לב שבעמודה Targets (יעדים) מופיע יעד אחד, למרות שהגדרתם שלושה יעדים (יעד אחד מרובה ויעדי צאצא).clouddeploy.yaml

    הדמיה של תהליך השליחה במסוף Google Cloud

    שימו לב שהיעד היחיד שמופיע הוא היעד המרובה qsprod-multi. יעדים של ילדים לא מוצגים.

יצירת גרסה

הפצה היא המשאב המרכזי ב-Cloud Deploy שמייצג את השינויים שנפרסים. צינור העברת התוכן מגדיר את מחזור החיים של הגרסה הזו. פרטים על מחזור החיים הזה מופיעים במאמר ארכיטקטורת שירות Cloud Deploy.

GKE

מריצים את הפקודה הבאה מהספרייה deploy-gke-parallel-quickstart כדי ליצור משאב release שמייצג את קובץ האימג' של הקונטיינר לפריסה:

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-parallel-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa \
   --to-target=qsprod-multi

Cloud Run

מריצים את הפקודה הבאה מהספרייה deploy-run-parallel-quickstart כדי ליצור משאב release שמייצג את קובץ האימג' של הקונטיינר לפריסה:

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-parallel-demo-app-1 \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a \
   --to-target=qsprod-multi

שימו לב לדגל --images=, שמשמש להחלפת ה-placeholder ‏ (my-app-image) במניפסט או בהגדרת השירות בתמונה הספציפית שעומדת בדרישות SHA. ‫Google ממליצה ליצור תבניות למניפסטים בדרך הזו, ולהשתמש בשמות תמונות עם SHA כשיוצרים גרסת הפצה.

כמו תמיד, כשיוצרים גרסת הפצה, נוצרת אוטומטית פריסה ליעד הראשון בצינור (או, כמו במקרה הזה, ליעד ספציפי שצוין באמצעות --to-target=). במדריך הזה, היעד הזה הוא יעד מרובה, ולכן rollout הוא 'פריסת בקרה' לשני יעדי צאצא, ואין יעדים נוספים בצינור ההפצה. המשמעות היא שהפריסה של האפליקציה מתבצעת בכל מקום כשיוצרים את ההשקה.

צפייה בתוצאות במסוף Google Cloud

אחרי שיצרתם את הגרסה ואת הפריסה של בקר התנועה ואת פריסות המשנה, פריסות המשנה האלה נפרסות (או נמצאות בתהליך פריסה) באשכולות GKE או בשירותי Cloud Run המתאימים.

  1. במסוף Google Cloud , עוברים לדף Delivery pipelines של Cloud Deploy כדי לראות את צינור העברת התוכן my-parallel-demo-app-1.

    פתיחת הדף Delivery pipelines

  2. לוחצים על השם של צינור העברת הנתונים 'my-parallel-demo-app-1'.

    הוויזואליזציה של הצינור מראה את סטטוס הפריסה של האפליקציה. בגלל שיש רק שלב אחד בצינור, בתצוגה החזותית מוצג רק צומת אחד.

    הדמיה של צינור עיבוד נתונים למסירה במסוף Google Cloud

    פריט התוכן יופיע בכרטיסייה פריטי תוכן בקטע פרטים על צינור ההפצה.

  3. לוחצים על שם הגרסה, test-release-001.

    ההשקות שלכם יופיעו בקטע השקות. אפשר ללחוץ על השקה כדי לראות את הפרטים שלה, כולל יומן הפריסה.

    השקות במסוף Google Cloud

הסרת המשאבים

כדי לא לצבור חיובים לחשבון Google Cloud על המשאבים שבהם השתמשתם בדף הזה, פועלים לפי השלבים הבאים:

  1. מחיקה של אשכולות GKE או שירותי Cloud Run:

    GKE

    gcloud container clusters delete quickstart-cluster-qsprod1 --region=us-central1 --project=PROJECT_ID \
    && gcloud container clusters delete quickstart-cluster-qsprod2 --region=us-west1 --project=PROJECT_ID
    

    Cloud Run

    gcloud run services delete my-parallel-run-service --region=us-central1 --project=PROJECT_ID \
    && gcloud run services delete my-parallel-run-service --region=us-west1 --project=PROJECT_ID
    
  2. מוחקים את צינור העברת הנתונים, את היעדים המרובים, את יעדי המשנה, את הגרסה ואת ההשקות:

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  3. מוחקים את הקטגוריות של Cloud Storage שנוצרו על ידי Cloud Deploy.

    אחד מסתיים ב-_clouddeploy והשני הוא [region].deploy-artifacts.[project].appspot.com.

    פתיחת הדף Cloud Storage browser

סיימתם את המדריך למתחילים!

המאמרים הבאים