Dokumen ini menjelaskan cara mengonfigurasi dan menggunakan deployment canary untuk men-deploy aplikasi Anda ke GKE atau GKE Enterprise menggunakan Cloud Deploy dengan mesh layanan Gateway API Kubernetes.
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 menggunakan Gateway API
Selain referensi Deployment dan Service, Anda menyediakan resource HTTPRoute, dengan aturan
backendRefs
yang merujuk ke Service.Cloud Deploy membuat Deployment baru, dengan nama Deployment asli Anda ditambah
-canary
, dan Layanan baru dengan nama Layanan asli ditambah-canary
.Secret, ConfigMap, dan Horizontal Pod Autoscaler juga disalin dan diganti namanya dengan
-canary
.Untuk setiap fase kanaris, Cloud Deploy mengubah HTTPRoute untuk memperbarui bobot antara pod Deployment asli dan pod Deployment kanaris, berdasarkan persentase untuk fase tersebut.
Karena mungkin ada penundaan dalam menyebarkan perubahan pada resource
HTTPRoute
, Anda dapat menyertakan propertirouteUpdateWaitTime
dalam konfigurasi, sehingga sistem menunggu selama jangka waktu yang ditentukan untuk penyebaran ini.Selama fase
stable
, Deployment-canary
akan di-scale down menjadi nol, dan Deployment asli akan diupdate untuk menggunakan Deployment rilis baru.Selain itu, HTTPRoute kini dikembalikan ke versi asli yang Anda berikan.
Cloud Deploy tidak mengubah Deployment atau Service asli hingga fase
stable
.
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.
Selain Deployment
dan Service
, manifes Anda harus menyertakan resource HTTPRoute
yang dikonfigurasi untuk pemisahan traffic, yang mereferensikan Service
dan Gateway terkait.
Mengonfigurasi canary otomatis
Gunakan Kubernetes Gateway API (dengan Istio atau penerapan yang didukung) untuk pemisahan traffic berbasis persentase yang presisi dan dikelola oleh mesh/gateway, yang diatur oleh Cloud Deploy.
Siapkan Resource Gateway API: Pastikan Gateway dan mesh layanan yang mendasarinya (misalnya, Istio) atau pengontrol Gateway dikonfigurasi dengan benar di cluster Anda.
Dalam manifes Kubernetes Anda, yang diberikan ke Cloud Deploy saat Anda membuat rilis, sertakan hal berikut:
HTTPRoute
yang mereferensikan resource Gateway AndaDeployment
Layanan
Konfigurasi pipeline pengiriman dan target yang akan Anda deploy canary:
Konfigurasi untuk target sama dengan target lainnya.
Konfigurasi pipeline pengiriman, dalam urutan progres untuk target tertentu, mencakup stanza
gatewayServiceMesh
untuk mereferensikan konfigurasiHTTPRoute
Kubernetes Gateway API, serta Deployment dan Layanan Anda.strategy: canary: runtimeConfig: kubernetes: gatewayServiceMesh: httpRoute: "ROUTE" service: "SERVICE" deployment: "DEPLOYMENT" routeUpdateWaitTime: "WAIT_TIME" podSelectorLabel: "LABEL" canaryDeployment: percentages: - 50
Di mana...
ROUTE adalah konfigurasi httpRoute yang menentukan perilaku perutean yang Anda inginkan.
SERVICE adalah konfigurasi Layanan Anda, yang diperlukan Cloud Deploy untuk deployment canary ke GKE dan GKE Enterprise.
DEPLOYMENT adalah konfigurasi Deployment Anda, yang diperlukan Cloud Deploy untuk deployment canary ke GKE dan GKE Enterprise.
WAIT_TIME adalah jangka waktu bagi Cloud Deploy untuk menunggu hingga perubahan pada resource
HTTPRoute
selesai diterapkan, untuk menghindari permintaan yang dibatalkan. Misalnya:routeUpdateWaitTime: 60s
Jika Anda menjalankan canary menggunakan Gateway API tanpa Istio, dan Gateway API terhubung ke load balancer, sejumlah kecil traffic mungkin hilang saat instance canary di-scale down. Google Cloud Anda dapat mengonfigurasi setelan ini jika Anda mengamati perilaku ini.
LABEL adalah label pemilih pod. Ini harus cocok dengan pemilih label di Layanan dan Deployment Kubernetes yang ditentukan dalam manifes Anda. Tindakan tersebut bersifat opsional. Defaultnya adalah
app
.
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%) harusstable
.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 Gateway API 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:
gatewayServiceMesh:
httpRoute: "my-route"
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
Men-deploy HTTPRoute ke cluster lain
Jika Anda telah mengonfigurasi canary menggunakan mesh layanan Gateway API, Anda dapat menentukan cluster alternatif non-target tempat HTTPRoute akan di-deploy.
Untuk melakukannya, Anda menggunakan stanza routeDestinations
, dalam konfigurasi strategi canary, untuk mengidentifikasi cluster atau cluster tujuan untuk
HTTPRoute, dan setelan boolean untuk menyebarkan Layanan ke cluster non-target
yang sama. Anda membuat stanza associatedEntities
dalam konfigurasi target
untuk mengidentifikasi cluster.
Konfigurasi
associatedEntities
pada target Anda.Setiap entitas adalah cluster tempat Cloud Deploy akan men-deploy HTTPRoute dan, secara opsional, Layanan Kubernetes. Dalam definisi target, sertakan stanza
associatedEntities
:associatedEntities: [KEY]: gkeClusters: - cluster: [PATH] dnsEndpoint: [true|false] internalIp: [true|false] proxyUrl:
Dengan:
KEY
adalah nama arbitrer untuk grup entitas terkait ini. Anda akan menggunakan nama ini untuk mereferensikan entitas darirouteDestinations
dalam konfigurasi canary.PATH
adalah jalur resource yang mengidentifikasi cluster GKE tempat HTTPRoute (dan secara opsional Service) akan di-deploy.dnsEndpoint
menunjukkan apakah akan menggunakan Endpoint DNS cluster atau tidak jika beberapa endpoint dikonfigurasi. Defaultnya adalahfalse
.internalIp
menunjukkan apakah akan menggunakan IP internal cluster (IP pribadi) atau tidak jika beberapa endpoint dikonfigurasi. Defaultnya adalahfalse
.
Anda dapat menyertakan sejumlah cluster, dengan atau tanpa
internalIp
.Konfigurasi
routeDestinations
di konfigurasi kanari Anda.Setiap tujuan rute mereferensikan stanza
associatedEntities
, dan menunjukkan apakah akan men-deploy Layanan ke cluster alternatif atau tidak. Tambahkan kode berikut di dalam stanzagatewayServiceMesh
dalam konfigurasi canary Anda:routeDestinations: destinationIds: ["KEY"] propagateService: [true|false]
Dengan:
KEY
adalah nama yang Anda konfigurasi di target, dalamassociatedEntities
. Gunakan nama ini untuk mereferensikan entitas darirouteDestinations
dalam konfigurasi canary Anda.Anda juga dapat memberikan nilai
@self
untuk men-deploy HTTPRoute ke target cluster selain tujuan terkait.propagateService
menunjukkan apakah Anda ingin men-deploy Layanan ke cluster terkait atau tidak, selain HTTPRoute. Defaultnya adalahfalse
.
Menjalankan canary GKE atau GKE Enterprise
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.
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.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, misalnyaus-central1
. Wajib diisi.Lihat referensi Google Cloud SDK untuk mengetahui informasi selengkapnya tentang perintah
gcloud deploy rollouts advance
.Google Cloud console
Klik pipeline Anda yang ditampilkan dalam daftar pipeline pengiriman.
Halaman Detail pipeline pengiriman menampilkan representasi grafis dari progres pipeline pengiriman Anda.
Di tab Rollouts, di bagian Delivery pipeline details, klik nama peluncuran Anda.
Halaman detail peluncuran akan ditampilkan untuk peluncuran tersebut.
Perhatikan bahwa dalam contoh ini, peluncuran memiliki fase
canary-50
dan fasestable
. Peluncuran Anda mungkin memiliki lebih banyak fase atau fase yang berbeda.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
Cari tahu cara mengelola siklus proses peluncuran canary Anda.
Pelajari lebih lanjut penyebaran paralel.
Pelajari lebih lanjut strategi deployment Cloud Deploy.