Men-deploy aplikasi ke target secara canary

Panduan memulai ini menunjukkan cara menggunakan Cloud Deploy untuk mengirimkan contoh image aplikasi 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 di panduan memulai ini.)

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

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

Dalam panduan memulai ini, Anda akan melakukan hal-hal berikut:

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

    Anda juga dapat melakukan deployment 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 (bawaan) 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 hingga 50%.

  7. Melanjutkan rilis untuk men-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. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Aktifkan API Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage.

    Mengaktifkan API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Aktifkan API Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage.

    Mengaktifkan API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

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

    gcloud components update
    

  13. 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-tama, 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 spesifik Anda.
      • 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 menyertakan 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
      

Membuat lingkungan runtime

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, dan Anda tidak perlu melakukan apa pun di sini.

Menyiapkan konfigurasi dan manifes aplikasi Skaffold

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

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

  1. Buka jendela terminal.

  2. Buat direktori baru dan navigasikan ke dalamnya.

    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 tersebut. Namun, Anda juga dapat meminta Cloud Deploy untuk membuatkannya, untuk aplikasi non-produksi 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 sederhana, yang diterapkan ke cluster untuk men-deploy aplikasi.

    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 Layanan dan Deployment yang diperlukan untuk deployment canary, ditambah resource HTTPRoute dan Gateway yang diperlukan untuk menggunakan Gateway API.

    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 file konfigurasi layanan Cloud Run, yang diterapkan pada waktu deployment untuk membuat layanan Anda di Cloud Run.

Membuat target dan pipeline pengiriman Anda

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

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 ke layanan Cloud Deploy:

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

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

  2. Konfirmasi pipeline dan target Anda:

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

    Buka halaman Pipeline pengiriman

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

    visualisasi pipeline pengiriman di Konsol Google Cloud

Membuat rilis

Rilis adalah resource Cloud Deploy pusat yang mewakili perubahan yang sedang 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:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc

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

Kita beralih ke fase stabil

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

Setelah melewati fase canary, sekarang kita siap memulai fase stabil, yang membawa traffic ke 100%. Setelah itu, kita akan membuat rilis lain, dan itu akan menjalankan canary.

Dalam situasi nyata, Anda biasanya akan menjalankan deployment canary di mana aplikasi Anda sudah berjalan, sehingga melewatkan fase ini akan jarang terjadi.

Lihat rilis di Konsol Google Cloud

Setelah Anda membuat rilis pertama, peluncuran tersebut akan dibuat, dan Anda dapat melihat rilis serta peluncuran tersebut 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 Pipeline pengiriman

  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

    Dan rilis Anda akan dicantumkan 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 "Tertunda di muka", dan target yang ditampilkan dalam visualisasi pipeline memiliki link ke "Lanjut ke stabil".

Melanjutkan fase peluncuran

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

  1. Pada visualisasi pipeline, klik Maju ke stabil.

  2. Saat diminta, klik Lanjutan untuk mengonfirmasi.

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

pipeline pengiriman dalam fase stabil

Menjalankan deployment canary

Karena rilis pertama melewati fase canary, kita akan membuat rilis lain, yang kali ini akan 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:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc
    

    Setelah beberapa menit, peluncuran akan dibuat, dan kali ini tahap canary dijalankan:

    pipeline pengiriman memulai fase canary

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

    visualisasi pipeline pengiriman di Konsol Google Cloud, dengan aplikasi yang di-deploy hingga 50%

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

  2. Klik Advanced Launch, lalu klik Advanced saat diminta.

    Tindakan ini akan melanjutkan peluncuran ke fase "stabil", men-deploy aplikasi hingga 100%.

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

Pembersihan

Agar akun Google Cloud Anda tidak dikenakan 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, serta 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 selanjutnya