Men-deploy aplikasi ke target secara canary

Panduan memulai ini menunjukkan cara menggunakan Cloud Deploy untuk mengirimkan image aplikasi contoh dalam deployment canary ke Google Kubernetes Engine atau Cloud Run. (Anda juga dapat menjalankan deployment canary ke GKE Enterprise, tetapi hanya GKE dan Cloud Run yang ditampilkan dalam panduan memulai ini.)

Deployment canary memisahkan traffic antara versi aplikasi yang sudah di-deploy dan versi baru. Cloud Run mengalokasikan traffic berdasarkan persentase yang Anda konfigurasi di pipeline pengiriman. GKE men-deploy versi baru ke sebagian pod. Panduan memulai ini di-deploy ke 50% terlebih dahulu, lalu ke 100%.

Dalam panduan memulai ini, hanya ada satu target, (prod). Jadi, kita hanya membuat satu cluster GKE atau satu layanan Cloud Run untuk menjalankan aplikasi Anda.

Dalam panduan memulai ini, Anda akan melakukan hal berikut:

  1. Buat satu cluster GKE atau tentukan satu layanan Cloud Run.

    Anda juga dapat men-deploy canary ke cluster GKE Enterprise, tetapi panduan memulai ini hanya menggunakan GKE dan Cloud Run.

  2. Buat konfigurasi Skaffold dan manifes Kubernetes untuk menentukan image container (yang telah dibuat sebelumnya) yang akan di-deploy.

  3. Tentukan pipeline pengiriman Cloud Deploy dan target deployment Anda.

  4. Panggil pipeline pengiriman Anda dengan membuat rilis, yang otomatis di-deploy ke satu target.

    Rilis pertama ini melewati fase canary.

  5. Lihat pipeline pengiriman dan rilis di konsol Google Cloud .

  6. Buat rilis kedua, kali ini jalankan tahap canary untuk men-deploy aplikasi ke 50%.

  7. Lanjutkan rilis untuk di-deploy hingga 100%.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    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.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  7. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    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.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  13. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  14. Jika Anda sudah menginstal CLI, pastikan Anda menjalankan versi terbaru:

    gcloud components update
    

  15. Pastikan akun layanan Compute Engine default memiliki izin yang memadai.

    Akun layanan mungkin sudah memiliki izin yang diperlukan. Langkah-langkah ini disertakan untuk project yang menonaktifkan pemberian peran otomatis untuk akun layanan default.

    1. Pertama, tambahkan peran 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. Tambahkan peran developer untuk runtime tertentu.
      • Untuk GKE, dan GKE dengan Gateway API:

        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"
        

      • Untuk 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. Tambahkan peran iam.serviceAccountUser, yang mencakup izin actAs untuk men-deploy ke runtime:

      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
      

    Buat lingkungan runtime Anda

    GKE

    Buat satu cluster Autopilot GKE:

     gcloud container clusters create-auto canary-quickstart-cluster \
                      --project=PROJECT_ID \
                      --region=us-central1
    

    GKE + Gateway API

    1. Buat satu cluster GKE, dengan setelan yang direkomendasikan untuk mendukung penggunaan dengan Istio:

      gcloud container clusters create canary-quickstart-cluster \
             --machine-type=n1-standard-1 \
             --num-nodes 4 \
             --region=us-central1 \
             --project=PROJECT_ID
      
    2. Dapatkan kredensial cluster:

      gcloud container clusters get-credentials canary-quickstart-cluster \
             --project=PROJECT_ID \
             --region=us-central1
      
    3. Instal CRD Kubernetes Gateway API jika belum ada di cluster.

      kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
      
    4. Aktifkan implementasi pengontrol Gateway Istio dengan menginstal 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

    Jika menggunakan Cloud Run, Anda dapat melewati perintah ini, Anda tidak perlu melakukan apa pun di sini.

    Menyiapkan konfigurasi Skaffold dan manifes aplikasi Anda

    Cloud Deploy menggunakan Skaffold untuk memberikan detail tentang apa yang akan di-deploy dan cara men-deploy-nya dengan benar ke target Anda.

    Dalam panduan memulai ini, Anda akan membuat file skaffold.yaml, yang mengidentifikasi konfigurasi layanan Cloud Run atau manifes Kubernetes yang akan di-deploy.

    1. Buka jendela terminal.

    2. Buat direktori baru dan buka direktori tersebut.

      GKE

      mkdir deploy-canary-quickstart-gke
      cd deploy-canary-quickstart-gke
      

      GKE + Gateway API

      mkdir deploy-canary-quickstart-gke-gatewayapi
      cd deploy-canary-quickstart-gke-gatewayapi
      

      Cloud Run

      mkdir deploy-canary-quickstart-run
      cd deploy-canary-quickstart-run
      
    3. Buat file bernama skaffold.yaml dengan konten berikut:

      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: {}
      

      File ini adalah konfigurasi Skaffold minimal, yang mengidentifikasi manifes Anda. Untuk panduan memulai ini, Anda akan membuat file. Namun, Anda juga dapat meminta Cloud Deploy membuatnya untuk Anda, untuk aplikasi non-produksi yang sederhana.

      Lihat referensi skaffold.yaml untuk mengetahui informasi selengkapnya tentang file ini.

    4. Buat manifes aplikasi Anda.

      GKE

      Buat file bernama kubernetes.yaml di direktori deploy-canary-quickstart-gke dengan konten berikut:

      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
      

      File ini adalah manifes Kubernetes, yang diterapkan ke cluster untuk men-deploy aplikasi. Manifes ini mencakup resource Service dan Deployment yang diperlukan untuk deployment canary, ditambah HTTPRoute dan resource Gateway yang diperlukan untuk menggunakan Gateway API.

      Image container yang akan di-deploy ditetapkan di sini sebagai placeholder, my-app-image, yang diganti dengan image tertentu saat Anda membuat rilis.

      GKE + Gateway API

      Buat file bernama kubernetes.yaml di direktori deploy-canary-quickstart-gke-gatewayapi dengan konten berikut:

      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
      

      File ini adalah manifes Kubernetes, yang diterapkan ke cluster untuk men-deploy aplikasi. Manifes ini mencakup resource Service dan Deployment yang diperlukan untuk deployment canary, ditambah HTTPRoute dan resource Gateway yang diperlukan untuk menggunakan Gateway API.

      Image container yang akan di-deploy ditetapkan di sini sebagai placeholder, my-app-image, yang diganti dengan image tertentu saat Anda membuat rilis.

      Cloud Run

      Buat file bernama run.yaml di direktori deploy-canary-quickstart-run dengan konten berikut:

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: my-canary-run-service
      spec:
        template:
          spec:
            containers:
            - image: my-app-image
      

      File ini adalah definisi layanan Cloud Run dasar, yang diterapkan pada waktu deployment untuk membuat layanan Anda di Cloud Run. Image container yang akan di-deploy ditetapkan di sini sebagai placeholder, my-app-image, yang diganti dengan image tertentu saat Anda membuat rilis.

    Membuat target dan pipeline pengiriman

    Anda dapat menentukan pipeline dan target pengiriman dalam satu file atau dalam file terpisah. Dalam panduan memulai ini, kita akan membuat satu file untuk pipeline dan satu target:

    GKE

    Buat file bernama clouddeploy.yaml di direktori deploy-canary-quickstart-gke dengan konten berikut:

    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

    Buat file bernama clouddeploy.yaml di direktori deploy-canary-quickstart-gke-gatewayapi dengan konten berikut:

    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

    Buat file bernama clouddeploy.yaml di direktori deploy-canary-quickstart-run dengan konten berikut:

    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
    
    1. Daftarkan pipeline dan target Anda dengan layanan Cloud Deploy:

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

      Sekarang Anda memiliki pipeline, dengan satu target yang dikonfigurasi untuk strategi deployment canary.

    2. Konfirmasi pipeline dan target Anda:

      Di konsol Google Cloud , buka halaman Cloud Deploy Delivery pipelines untuk melihat daftar pipeline pengiriman yang tersedia.

      Buka halaman Delivery pipelines

      Pipeline pengiriman yang baru saja Anda buat akan ditampilkan, dan satu target yang Anda konfigurasi akan tercantum di kolom Target.

      visualisasi pipeline pengiriman di konsol Google Cloud

    Membuat rilis

    Rilis adalah resource Cloud Deploy pusat yang merepresentasikan perubahan yang di-deploy. Pipeline pengiriman menentukan siklus proses rilis tersebut. Lihat arsitektur layanan Cloud Deploy untuk mengetahui detail tentang siklus proses tersebut.

    Untuk membuat resource release yang merepresentasikan image container yang akan di-deploy, jalankan perintah berikut dari direktori deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi, atau 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
    

    Perhatikan flag --images=, yang Anda gunakan untuk mengganti placeholder (my-app-image) dalam manifes atau definisi layanan dengan image spesifik yang memenuhi syarat SHA. Google merekomendasikan agar Anda membuat template manifes dengan cara ini, dan menggunakan nama image yang memenuhi syarat SHA saat pembuatan rilis.

    Saat Anda membuat rilis, Cloud Deploy juga akan otomatis membuat resource peluncuran untuk segera men-deploy ke satu target Anda, prod.

    Kita langsung ke fase stabil

    Dengan rilis pertama ini, kami melewati fase canary, dan men-deploy ke 100% (fase stabil). Hal ini karena aplikasi belum di-deploy sebelumnya, sehingga tidak ada cara untuk menghitung 50% pod (untuk GKE) atau cara membagi traffic untuk layanan (untuk Cloud Run). Pod (GKE) atau revisi (Cloud Run) belum ada.

    Setelah melewati fase canary, kami kini siap memulai fase stabil, yang mengarahkan traffic ke 100%. Setelah itu, kita akan membuat rilis lain, dan rilis tersebut akan menjalankan canary.

    Dalam situasi dunia nyata, Anda biasanya akan menjalankan deployment canary saat aplikasi Anda sudah berjalan, sehingga fase ini jarang dilewati.

    Melihat rilis di Google Cloud console

    Setelah membuat rilis pertama, peluncuran akan dibuat, dan Anda dapat melihat rilis dan peluncuran di konsol Google Cloud . Anda juga dapat melihat visualisasi pipeline, yang menunjukkan status rilis saat ini.

    1. Di konsol Google Cloud , buka halaman Delivery pipelines Cloud Deploy untuk melihat pipeline pengiriman my-canary-demo-app-1.

      Buka halaman Delivery pipelines

    2. Klik nama pipeline pengiriman Anda "my-canary-demo-app-1".

      Visualisasi pipeline menampilkan status deployment aplikasi. Karena hanya ada satu tahap dalam pipeline, visualisasi hanya menampilkan satu node.

      visualisasi pipeline pengiriman di konsol Google Cloud

      Rilis Anda juga tercantum di tab Rilis di bagian Detail pipeline pengiriman.

    3. Klik nama rilis, test-release-001.

      Peluncuran Anda akan muncul di bagian Peluncuran. Anda dapat mengklik peluncuran untuk melihat detailnya, termasuk log deployment.

      peluncuran di konsol Google Cloud

      Perhatikan bahwa status peluncuran adalah "Menunggu persetujuan", dan target yang ditampilkan dalam visualisasi pipeline memiliki link ke "Lanjutkan ke stabil".

    Memajukan fase peluncuran

    Setelah rilis pertama, fase canary dilewati, dan peluncuran menunggu untuk memulai fase "stabil", yang men-deploy aplikasi ke 100%:

    1. Dalam visualisasi pipeline, klik Advance to stable.

    2. Saat diminta, klik Lanjutkan untuk mengonfirmasi.

    Setelah beberapa menit, peluncuran kini berada dalam fase "stabil", dan aplikasi di-deploy ke 100%.

    pipeline pengiriman dalam fase stabil

    Menjalankan deployment canary

    Karena rilis pertama melewatkan fase canary, kita akan membuat rilis lain, yang kali ini menjalankan deployment canary.

    1. Untuk membuat release baru, jalankan perintah berikut dari direktori deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi, atau 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:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
      

      GKE + 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:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
      

      Cloud 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
      

      Setelah beberapa menit, peluncuran akan dibuat, dan kali ini tahap kanari akan dieksekusi:

      pipeline pengiriman yang memulai fase canary

      Setelah fase peluncuran pertama selesai, peluncuran kini berada dalam fase canary:

      visualisasi pipeline pengiriman di konsol Google Cloud , dengan aplikasi yang di-deploy ke 50%

      Artinya, aplikasi kini di-deploy ke 50%. Untuk GKE berbasis serviceNetworking, GKE di-deploy ke setengah pod Anda. Untuk traffic GKE dan Cloud Run berbasis Gateway API dialokasikan sebesar 50%.

    2. Klik Peluncuran Lanjutan, lalu klik Lanjutkan saat diminta.

      Tindakan ini memajukan peluncuran ke fase "stabil", men-deploy aplikasi ke 100%.

      pipeline pengiriman dalam fase stabil, di-deploy ke 100%

    Pembersihan

    Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan pada halaman ini, ikuti langkah-langkah berikut.

    1. Hapus cluster canary-quickstart-cluster (khusus GKE):

      gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
      
    2. Hapus layanan my-canary-run-service (khusus Cloud Run):

      gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID
      
    3. Hapus pipeline pengiriman, target, dan semua resource rilis dan peluncuran:

      gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
      
    4. Hapus bucket Cloud Storage yang dibuat Cloud Deploy.

      Salah satunya diakhiri dengan _clouddeploy, dan yang lainnya adalah [region].deploy-artifacts.[project].appspot.com.

      Buka halaman browser Cloud Storage

    Selesai, Anda telah menyelesaikan panduan memulai ini.

    Langkah berikutnya