Deployment Canary ke GKE dan GKE Enterprise menggunakan jaringan berbasis layanan

Dokumen ini menjelaskan cara mengonfigurasi dan menggunakan deployment canary untuk men-deploy aplikasi Anda ke GKE atau GKE Enterprise menggunakan Cloud Deploy dengan jaringan berbasis layanan.

Deployment canary adalah peluncuran progresif versi baru aplikasi Anda, dengan Anda secara bertahap meningkatkan persentase traffic yang dikirim ke versi baru, sambil memantau performa aplikasi. Hal ini membantu Anda menemukan potensi masalah sejak dini dan meminimalkan dampaknya terhadap pengguna.

Cara kerja deployment canary untuk GKE dan GKE Enterprise dengan jaringan berbasis layanan

  1. Anda memberikan nama resource Deployment dan resource Service.

  2. Cloud Deploy membuat resource Deployment tambahan, dengan nama Deployment saat ini ditambah -canary.

Secrets dan ConfigMaps juga disalin dan diganti namanya dengan -canary.

  1. Cloud Deploy mengubah Layanan untuk menyesuaikan pemilih agar memilih pod dalam Deployment saat ini dan pod canary.

    Cloud Deploy menghitung jumlah pod yang akan digunakan untuk canary berdasarkan penghitungan yang dijelaskan di bagian penyediaan pod. Penghitungan tersebut berbeda, bergantung pada apakah Anda mengaktifkan atau menonaktifkan penyediaan berlebih pod.

    Jika kita melanjutkan ke fase stable, Cloud Deploy menambahkan label yang akan digunakan untuk mencocokkan pod, sehingga label tersebut tersedia untuk menjalankan canary berikutnya.

    Cloud Deploy membuat Deployment yang mencakup persentase pod khusus fase, dan memperbaruinya untuk setiap fase. Hal ini dilakukan dengan menghitung jumlah pod sebagai persentase dari jumlah pod asli. Hal ini dapat menyebabkan pembagian traffic yang tidak tepat. Jika Anda memerlukan pembagian traffic yang tepat, Anda dapat melakukannya menggunakan Gateway API.

  2. Selama fase stable, Deployment -canary akan di-scale down menjadi nol, dan Deployment asli akan digantikan dengan Deployment baru.

    Cloud Deploy tidak mengubah Deployment asli hingga fase stable, kecuali jika Anda menonaktifkan penyediaan berlebih.

Cloud Deploy menyediakan pod untuk mencapai persentase canary yang diminta sedekat mungkin. Hal ini didasarkan pada jumlah pod, bukan traffic ke pod. Jika Anda ingin canary didasarkan pada traffic, Anda harus menggunakan Gateway API.

Untuk canary berbasis jaringan GKE, Anda dapat mengaktifkan atau menonaktifkan penyediaan berlebih pod. Bagian berikut menjelaskan cara Cloud Deploy menghitung jumlah pod yang akan disediakan untuk deployment canary untuk setiap fase canary.

Penyediaan pod dengan penyediaan berlebih diaktifkan

Dengan mengaktifkan penyediaan berlebih (disablePodOverprovisioning: false), Cloud Deploy dapat membuat pod tambahan yang cukup untuk menjalankan persentase canary yang Anda inginkan, berdasarkan jumlah pod yang menjalankan deployment yang ada. Formula berikut menunjukkan cara Cloud Deploy menghitung jumlah pod yang akan disediakan untuk deployment canary untuk setiap fase canary, saat penyediaan berlebih pod diaktifkan:

math.Ceil( percentage * ReplicaCountOfDeploymentOnCluster / (100-percentage))

Dengan formula ini, jumlah replika saat ini (jumlah pod yang sudah Anda miliki, sebelum canary ini) dikalikan dengan persentase canary untuk fase, dan hasilnya dibagi dengan (100 dikurangi persentase).

Misalnya, jika Anda sudah memiliki 4 pod, dan fase kanari Anda adalah 50%, maka jumlah pod kanari adalah 4. (Hasil 100-percentage digunakan sebagai persentase: 100-50=50, diperlakukan sebagai .50.)

Penyediaan berlebih pod adalah perilaku default.

Penyediaan pod dengan penyediaan berlebih dinonaktifkan

Anda dapat menonaktifkan penyediaan berlebih (disablePodOverprovisioning: true), untuk memastikan Cloud Deploy tidak meningkatkan jumlah replika Anda.

Formula berikut menunjukkan cara Cloud Deploy menghitung penyediaan pod untuk deployment canary untuk setiap fase canary, saat kelebihan penyediaan pod dinonaktifkan:

math.Ceil( (ReplicaCountOfDeploymentOnCluster + ReplicaCountOfCanaryDeploymentOnCluster) * percentage)

Dalam formula ini, ReplicaCountOfCanaryDeploymentOnCluster hanya ada jika sudah ada fase canary. Jika ini adalah fase uji coba pertama, tidak ada ReplicaCountOfCanaryDeploymentOnCluster.

Jika Anda memulai dengan 4 pod, jumlah tersebut dikalikan dengan persentase canary (misalnya, 50%, atau .5) untuk mendapatkan 2. Jadi, deployment asli kini diturunkan skalanya menjadi 2, dan 2 pod baru dibuat untuk deployment canary. Jika Anda kemudian memiliki tahap canary 75%, Anda memiliki 2 (deployment asli) +2 (tahap canary pertama), *.75, untuk mendapatkan 3 pod canary dan 1 pod yang menjalankan deployment asli.

Dengan Cloud Deploy, Anda dapat mengonfigurasi deployment canary ke GKE dan GKE Enterprise dalam satu tahap atau beberapa tahap.

Petunjuk di sini hanya mencakup hal-hal yang khusus untuk konfigurasi canary. Dokumen Men-deploy ke cluster Google Kubernetes Engine berisi petunjuk umum untuk mengonfigurasi dan menjalankan pipeline deployment Anda.

Pastikan Anda memiliki izin yang diperlukan

Selain izin Identity and Access Management lainnya yang Anda perlukan untuk menggunakan Cloud Deploy, Anda memerlukan izin berikut untuk melakukan tindakan tambahan yang mungkin diperlukan untuk deployment canary:

  • clouddeploy.rollouts.advance
  • clouddeploy.rollouts.ignoreJob
  • clouddeploy.rollouts.cancel
  • clouddeploy.rollouts.retryJob
  • clouddeploy.jobRuns.get
  • clouddeploy.jobRuns.list
  • clouddeploy.jobRuns.terminate

Lihat Peran dan izin IAM untuk mengetahui informasi selengkapnya tentang peran yang tersedia yang mencakup izin ini.

Siapkan skaffold.yaml Anda

File skaffold.yaml Anda menentukan cara manifes Kubernetes dirender dan di-deploy. Untuk deployment canary ke GKE/GKE Enterprise, pastikan deployment tersebut mengarah dengan benar ke manifes Anda dan menentukan artefak build yang diperlukan. Tidak ada konfigurasi khusus canary yang diperlukan dalam skaffold.yaml itu sendiri selain yang diperlukan untuk deployment standar. Anda dapat menggunakan profil Skaffold untuk mengelola berbagai variasi manifes untuk fase canary kustom.

Menyiapkan manifes Kubernetes

Manifes Kubernetes Anda harus menyertakan resource Deployment dan resource Service. Service harus menentukan selector yang cocok dengan label pod yang dikelola oleh Deployment. Label default yang dicari Cloud Deploy adalah app, tetapi ini dapat dikonfigurasi di pipeline.

Mengonfigurasi canary otomatis

Konfigurasi canary otomatis langsung dalam definisi pipeline pengiriman untuk tahap GKE atau GKE Enterprise tertentu menggunakan jaringan Layanan Kubernetes standar.

Di tahap pipeline, sertakan properti strategy, sebagai berikut:

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "SERVICE_NAME"
              deployment: "DEPLOYMENT_NAME"
              podSelectorLabel: "LABEL"
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false
          predeploy:
            actions: "PREDEPLOY_ACTION"
          postdeploy:
            actions: "POSTDEPLOY_ACTION"

Dalam konfigurasi ini...

  • SERVICE_NAME adalah nama Layanan Kubernetes, yang ditentukan dalam manifes Anda.

  • DEPLOYMENT_NAME adalah nama Deployment Kubernetes Anda, yang ditentukan dalam manifes Anda.

  • LABEL adalah label pemilih pod. Nilai ini harus cocok dengan pemilih label di Layanan Kubernetes yang ditentukan dalam manifes Anda. Tindakan ini bersifat opsional. Defaultnya adalah app.

  • PERCENTAGES adalah daftar nilai persentase yang dipisahkan koma yang merepresentasikan peningkatan canary Anda, misalnya [5, 25, 50].

    Selain itu, 100 tidak disertakan, karena deployment 100% diasumsikan dalam canary, dan ditangani oleh fase stable

  • Anda dapat mengaktifkan verifikasi deployment (verify: true). Jika melakukannya, tugas verify akan diaktifkan di setiap fase.

  • PREDEPLOY_ACTION

    Sama dengan ACTION_NAME yang Anda gunakan di skaffold.yaml untuk menentukan tindakan kustom yang ingin Anda jalankan sebelum men-deploy.

  • POSTDEPLOY_ACTION

    Sama dengan ACTION_NAME yang Anda gunakan di skaffold.yaml untuk menentukan tindakan kustom yang ingin Anda jalankan setelah men-deploy.

Mengonfigurasi canary kustom

Anda dapat mengonfigurasi canary secara manual, bukan sepenuhnya mengandalkan otomatisasi yang disediakan oleh Cloud Deploy. Dengan konfigurasi canary kustom, Anda menentukan hal berikut dalam definisi pipeline pengiriman:

  • Nama fase peluncuran

    Dalam canary yang sepenuhnya otomatis, Cloud Deploy akan memberi nama fase untuk Anda (misalnya, canary-25, canary-75, stable). Namun, dengan canary kustom, Anda dapat memberi setiap fase nama apa pun, asalkan unik di antara semua fase untuk tahap canary ini, dan mematuhi batasan ID resource. Namun, nama fase akhir (100%) harus stable.

  • Sasaran persentase untuk setiap fase

    Tentukan persentase secara terpisah, per fase.

  • Profil Skaffold yang akan digunakan untuk fase

    Anda dapat menggunakan profil Skaffold terpisah untuk setiap fase, atau profil yang sama, atau kombinasi apa pun. Setiap profil dapat menggunakan manifes Kubernetes yang berbeda. Anda juga dapat menggunakan lebih dari satu profil untuk fase tertentu. Cloud Deploy menggabungkannya.

  • Apakah ada tugas verifikasi untuk fase tersebut

    Ingatlah bahwa jika Anda mengaktifkan verifikasi, Anda juga perlu mengonfigurasi skaffold.yaml untuk verifikasi.

  • Apakah ada tugas pra-deployment atau pasca-deployment untuk fase tersebut

    Jika mengaktifkan tugas pra-deployment atau pasca-deployment, Anda perlu mengonfigurasi skaffold.yaml untuk tugas tersebut.

Semua jenis target didukung untuk canary kustom.

Elemen konfigurasi canary kustom

YAML berikut menunjukkan konfigurasi untuk fase deployment canary yang sepenuhnya kustom:

strategy:
  canary:
    # Custom configuration for each canary phase
    customCanaryDeployment:
      phaseConfigs:
      - phaseId: "PHASE1_NAME"
        percentage: PERCENTAGE1
        profiles: [ "PROFILE_NAME" ]
        verify: true | false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"
      - 
      - phaseId: "stable"
        percentage: 100
        profiles: [ "LAST_PROFILE_NAME" ]
        verify: true|false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"

Dalam YAML ini

  • PHASE1_NAME

    Adalah nama fase. Setiap nama fase harus unik.

  • [ "PROFILE_NAME" ]

    Adalah nama profil yang akan digunakan untuk fase. Anda dapat menggunakan profil yang sama untuk setiap fase, atau profil yang berbeda untuk setiap fase, atau kombinasi apa pun. Selain itu, Anda dapat menentukan lebih dari satu profil. Cloud Deploy menggunakan semua profil yang Anda tentukan, plus profil atau manifes yang digunakan oleh tahap keseluruhan.

  • stable

    Fase akhir harus diberi nama stable.

  • PERCENTAGE1

    Adalah persentase yang akan di-deploy untuk fase pertama. Setiap fase harus memiliki nilai persentase yang unik, dan nilai tersebut harus berupa persentase bilangan bulat (bukan 10.5, misalnya), dan fase harus dalam urutan menaik.

  • verify: true|false

    Memberi tahu Cloud Deploy apakah akan menyertakan tugas verifikasi untuk fase tersebut. Perhatikan bahwa agar setiap fase menggunakan verifikasi, Skaffold menggunakan profil yang sama untuk verifikasi yang ditentukan untuk render dan deployment untuk fase tersebut.

  • PREDEPLOY_ACTION

    Sama dengan ACTION_NAME yang Anda gunakan di skaffold.yaml untuk menentukan tindakan kustom yang ingin Anda jalankan sebelum men-deploy.

  • POSTDEPLOY_ACTION

    Sama dengan ACTION_NAME yang Anda gunakan di skaffold.yaml untuk menentukan tindakan kustom yang ingin Anda jalankan setelah men-deploy.

Persentase untuk fase terakhir harus 100. Fase dijalankan sesuai urutan yang Anda konfigurasi dalam stanza customCanaryDeployment ini, tetapi jika nilai persentase tidak dalam urutan menaik, perintah untuk mendaftarkan pipeline pengiriman akan gagal dengan error.

Perhatikan bahwa konfigurasi untuk canary kustom tidak menyertakan stanza runtimeConfig. Jika Anda menyertakan runtimeConfig, maka dianggap sebagai kenari berbasis layanan kustom.

Mengonfigurasi canary otomatis kustom

Hal ini menggabungkan definisi fase kustom (nama, persentase, profil, verifikasi, hook) dengan pengelolaan traffic otomatis Cloud Deploy untuk GKE atau GKE Enterprise. Anda menentukan fase, tetapi Cloud Deploy menangani manipulasi resource pokok berdasarkan persentase dan runtimeConfig yang dipilih.

Untuk mengonfigurasi ini, sertakan bagian runtimeConfig dengan serviceNetworking dan bagian customCanaryDeployment (yang menentukan phaseConfigs) dalam blok strategy.canary. Cloud Deploy akan menggunakan profil Skaffold yang ditentukan untuk rendering, tetapi akan menyesuaikan traffic secara otomatis sesuai dengan persentase fase dan runtimeConfig.

serialPipeline:
  stages:
  - targetId: gke-prod
    profiles: []
    strategy:
      canary:
        # Include runtimeConfig for automatic traffic management
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "my-app"
              deployment: "my-deployment"
        # Include customCanaryDeployment for phase customization
        customCanaryDeployment:
          phaseConfigs:
          - phaseId: "warmup"
            percentage: 10
            profiles: ["profile-a"] # Profile used for rendering this phase
            verify: true
          - phaseId: "scaling"
            percentage: 50
            profiles: ["profile-b"] # Different profile for this phase
            verify: true
          - phaseId: "stable"
            percentage: 100
            profiles: ["profile-b"] # Can reuse profiles
            verify: true

Menjalankan canary GKE atau GKE Enterprise

  1. Daftarkan Pipeline dan Target: Terapkan file konfigurasi target GKE atau GKE Enterprise dan pipeline pengiriman Anda.

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=gke-targets.yaml --region=REGION
    

    Pipeline pengiriman mencakup konfigurasi canary otomatis atau kustom, untuk runtime yang Anda pilih.

  2. Buat Rilis: Mulai deployment, dengan memberikan nama image.

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
      # e.g., --images=my-cloudrun-service=gcr.io/my-project/my-app:v1.1
      # Add --skaffold-file or --source if not using default Skaffold config discovery
    

    Pipeline pengiriman yang diidentifikasi oleh PIPELINE_NAME berisi konfigurasi canary otomatis atau kustom yang dijelaskan dalam dokumen ini.

  3. Memajukan canary:

    gcloud CLI

    gcloud deploy rollouts advance ROLLOUT_NAME \
                                --release=RELEASE_NAME \
                                --delivery-pipeline=PIPELINE_NAME \
                                --region=REGION
    

    Dengan:

    ROLLOUT_NAME adalah nama peluncuran saat ini yang Anda lanjutkan ke fase berikutnya.

    RELEASE_NAME adalah nama rilis yang menjadi bagian dari peluncuran ini.

    PIPELINE_NAME adalah nama pipeline pengiriman yang Anda gunakan untuk mengelola deployment rilis ini.

    REGION adalah nama region tempat rilis dibuat, misalnya us-central1. Wajib diisi.

    Lihat referensi Google Cloud SDK untuk mengetahui informasi selengkapnya tentang perintah gcloud deploy rollouts advance.

    Google Cloud console

    1. Buka halaman pipeline pengiriman.

    2. Klik pipeline Anda yang ditampilkan dalam daftar pipeline pengiriman.

      Halaman Detail pipeline pengiriman menampilkan representasi grafis progres pipeline pengiriman Anda.

    3. Di tab Rollouts, di bagian Delivery pipeline details, klik nama peluncuran Anda.

      Halaman detail peluncuran akan ditampilkan untuk peluncuran tersebut.

      detail peluncuran di konsol Google Cloud

      Perhatikan bahwa dalam contoh ini, peluncuran memiliki fase canary-50 dan fase stable. Peluncuran Anda mungkin memiliki lebih banyak fase atau fase yang berbeda.

    4. Klik Maju peluncuran.

      Peluncuran dilanjutkan ke fase berikutnya.

Fase yang dilewati

Jika Anda men-deploy canary dan aplikasi Anda belum di-deploy ke runtime tersebut, Cloud Deploy akan melewati fase canary dan menjalankan fase stabil. Lihat Melewati fase untuk pertama kalinya untuk mengetahui penyebabnya.

Langkah berikutnya