Untuk mengimplementasikan rilis canary ujung ke ujung pada beberapa layanan, Anda dapat mengonfigurasi label lalu lintas guna mengidentifikasi karakteristik lalu lintas dan membagi lalu lintas masuk gateway menjadi lalu lintas reguler dan lalu lintas canary. Karakteristik lalu lintas canary dilewatkan di antara layanan yang digunakan untuk memproses permintaan pengguna, sehingga mewujudkan rilis canary ujung ke ujung. Topik ini menjelaskan cara menggunakan label lalu lintas untuk mengimplementasikan rilis canary ujung ke ujung pada layanan mikro.
Prasyarat
Instance Service Mesh (ASM) Edisi Enterprise atau Edisi Ultimate telah dibuat dengan versi 1.17.2.22 atau lebih baru. Untuk informasi lebih lanjut, lihat Buat Instance ASM atau Perbarui Instance ASM.
Gateway masuk telah dibuat. Untuk informasi lebih lanjut, lihat Buat Gateway Masuk.
Deskripsi fitur
Rilis canary dapat diimplementasikan melalui berbagai metode. Misalnya, Anda dapat menggunakan ASM untuk menerapkan aplikasi dalam mode rilis biru-hijau dan mode rilis bertahap. Mode sampel ini cocok untuk rilis layanan tunggal dan menggunakan VirtualService dari Istio sumber terbuka untuk menentukan bobot lalu lintas setiap versi layanan. Namun, mode ini tidak dapat memenuhi persyaratan dalam skenario rilis canary layanan ganda.
ASM menyediakan fitur rilis canary ujung ke ujung berdasarkan pelabelan lalu lintas dan pengarahan berbasis label. Fitur ini memungkinkan Anda mengimplementasikan rilis canary untuk beberapa layanan secara bersamaan. Selama pengujian canary bisnis, sistem membagi lalu lintas masuk menjadi lalu lintas reguler dan lalu lintas canary serta mengidentifikasi karakteristik lalu lintas. Jika lalu lintas permintaan diidentifikasi sebagai lalu lintas canary, permintaan tersebut diarahkan ke layanan rilis canary. Dengan demikian, sistem tidak hanya mendistribusikan lalu lintas ke layanan backend versi berbeda berdasarkan rasio tertentu, tetapi juga melewatkan karakteristik lalu lintas canary di antara semua layanan yang digunakan untuk memproses permintaan pengguna. Untuk informasi lebih lanjut, lihat Label Lalu Lintas.
Deskripsi konfigurasi
Anda dapat klik di sini untuk mengunduh file konfigurasi contoh. Gambar berikut menunjukkan rantai panggilan layanan dalam contoh:

Dalam contoh ini, ketika Layanan A memanggil Layanan B, Layanan A berisi logika implementasi kode untuk melewatkan header HTTP my-trace-id. Untuk informasi lebih lanjut, lihat file konfigurasi main.go di jalur src/mock-abc/go/main.go.
Jika Anda menggunakan aplikasi lain, pastikan aplikasi tersebut berisi logika untuk melewatkan header HTTP. Fungsi selanjutnya bergantung pada header HTTP.
Langkah 1: Terapkan layanan contoh di kluster ACK
Aktifkan injeksi proxy sidecar otomatis untuk namespace yang diinginkan (namespace default dalam contoh ini). Untuk informasi lebih lanjut, lihat Aktifkan Injeksi Proxy Sidecar Otomatis.
Gunakan kubectl untuk terhubung ke kluster ACK berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk menerapkan layanan contoh.
Untuk informasi lebih lanjut tentang file YAML, lihat Deskripsi Konfigurasi.
kubectl apply -n default -f application-base.yaml kubectl apply -n default -f application-canary.yaml
Langkah 2: Konfigurasikan aturan pengarahan awal
Buat file bernama routing.yaml dan salin konten berikut ke file tersebut:
Gunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk mengonfigurasi aturan pengarahan:
kubectl apply -n default -f routing.yamlPeriksa apakah layanan versi berbeda dapat diakses.
Dapatkan alamat IP publik gateway masuk di Konsol ASM. Untuk informasi lebih lanjut, lihat Langkah 2: Dapatkan Alamat IP Gateway Masuk ASM.
Jalankan perintah berikut untuk mengonfigurasi variabel lingkungan.
xxxxadalah alamat IP yang diperoleh di Sublangkah a.export ASM_GATEWAY_IP=xxxxJalankan perintah berikut untuk memeriksa apakah layanan versi berbeda dapat diakses:
for i in {1..200}; do curl -H'my-asm-prefer-tag: version-base' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;Output yang Diharapkan:
-> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)Output menunjukkan bahwa kebijakan pengarahan beban seimbang acak diadopsi untuk aliran lalu lintas dari gateway masuk ke Layanan A dan dari Layanan A ke Layanan B. Header
my-asm-prefer-tagatau header permintaan lain yang ditentukan menggunakan perintahcurltidak mengubah kebijakan pengarahan acak.
Langkah 3: Konfigurasikan label lalu lintas untuk layanan contoh
ASM memungkinkan Anda mengonfigurasi label lalu lintas menggunakan CustomResourceDefinition (CRD) TrafficLabel dan mengarahkan lalu lintas ke workload berbeda berdasarkan label lalu lintas. Untuk informasi lebih lanjut, lihat Label Lalu Lintas.
Buat file bernama trafficlabel.yaml dan salin konten berikut ke file tersebut:
Deskripsi Konfigurasi:
Label lalu lintas
trafficlabel-nsberlaku untuk semua layanan di namespace default, seperti layanan mocka dan mockb yang diterapkan dalam contoh ini. Label lalu lintasingressgatewayhanya berlaku untuk gateway ingressgateway.Dalam contoh ini, header permintaan
my-asm-prefer-tagdigunakan untuk membedakan versi. Oleh karena itu, setel parameter pertama dalamgetExternalInboundRequestHeaderkemy-asm-prefer-tag. Modifikasi konfigurasi berdasarkan kebutuhan bisnis Anda.Dalam contoh ini,
my-trace-idadalah header HTTP yang perlu dilewatkan. Oleh karena itu, setel parameter kedua dalamgetExternalInboundRequestHeaderkemy-trace-id. Modifikasi konfigurasi berdasarkan kebutuhan bisnis Anda.
Gunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk mengonfigurasi label lalu lintas:
kubectl apply -f trafficlabel.yaml
Langkah 4: Konfigurasikan aturan pengarahan berbasis label
Anda dapat mengonfigurasi aturan pengarahan berbasis label untuk mengontrol aliran lalu lintas.
1. Periksa rilis canary di sisi penyedia layanan
Periksa apakah pengarahan lalu lintas dari Layanan A ke Layanan B sesuai harapan. Secara spesifik, periksa apakah lalu lintas canary yang mengalir ke Layanan A diteruskan ke versi rilis canary Layanan B, dan apakah lalu lintas dasar yang mengalir ke Layanan A diteruskan ke versi dasar Layanan B.
Gambar berikut menunjukkan aliran lalu lintas setelah aturan pengarahan berbasis label dikonfigurasi untuk Layanan B:
Buat file bernama vs-tf-mockb.yaml dan salin konten berikut ke file tersebut:
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-mockb spec: hosts: - mockb http: - route: - destination: host: mockb subset: $asm-labels-sampleJalankan perintah berikut untuk membuat aturan pengarahan berlaku untuk Layanan A:
kubectl apply -n default -f vs-tf-mockb.yamlJalankan perintah berikut untuk memeriksa apakah lalu lintas canary yang mengalir ke Layanan A diteruskan ke versi rilis canary Layanan B:
for i in {1..200}; do curl -H'my-asm-prefer-tag: version-canary' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;Output yang Diharapkan:
-> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)Jalankan perintah berikut untuk memeriksa apakah lalu lintas dasar yang mengalir ke Layanan A diteruskan ke versi dasar Layanan B:
for i in {1..200}; do curl -H'my-asm-prefer-tag: version-base' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;Output yang Diharapkan:
-> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70) -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)Hasil menunjukkan bahwa lalu lintas canary masuk dan lalu lintas dasar masuk yang mengalir ke Layanan A tidak diarahkan ke versi yang diharapkan dari Layanan B. Anda perlu mengonfigurasi aturan pengarahan berbasis label lalu lintas untuk Layanan A. Untuk informasi lebih lanjut, lanjutkan ke langkah berikutnya.
2. Periksa fitur rilis canary ujung ke ujung
Konfigurasikan file aturan pengarahan berbasis label lalu lintas bernama a-vs-tf.yaml untuk Layanan A dan buat file tersebut berlaku untuk gateway masuk. Hasil yang diharapkan adalah lalu lintas canary permintaan masuk pertama kali diteruskan ke versi rilis canary Layanan A dan kemudian ke versi rilis canary Layanan B, dan lalu lintas dasar pertama kali diteruskan ke versi dasar Layanan A dan kemudian ke versi dasar Layanan B.
Gambar berikut menunjukkan aliran lalu lintas setelah aturan pengarahan berbasis label dikonfigurasi untuk Layanan A:
Buat file bernama vs-tf-mocka.yaml dan salin konten berikut ke file tersebut:
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-gateway-mocka spec: gateways: - simple-gateway hosts: - "*" http: - route: - destination: host: mocka subset: $asm-labels-sampleJalankan perintah berikut untuk membuat aturan pengarahan berlaku untuk gateway masuk:
kubectl apply -n default -f vs-tf-mocka.yamlJalankan perintah berikut untuk memeriksa apakah lalu lintas canary permintaan masuk pertama kali diteruskan ke versi rilis canary Layanan A dan kemudian ke versi rilis canary Layanan B:
for i in {1..200}; do curl -H'my-asm-prefer-tag: version-canary' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;Output yang Diharapkan:
-> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)Jalankan perintah berikut untuk memeriksa apakah lalu lintas dasar permintaan masuk pertama kali diteruskan ke versi dasar Layanan A dan kemudian ke versi dasar Layanan B:
for i in {1..200}; do curl -H'my-asm-prefer-tag: version-base' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;Output yang Diharapkan:
-> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
3. Periksa apakah distribusi lalu lintas berbasis bobot yang sesuai dengan pengarahan berbasis label memenuhi persyaratan
Gambar berikut menunjukkan aliran lalu lintas setelah aturan pengarahan berbasis bobot dan label dikonfigurasi untuk Layanan A:
Buat file bernama vs-tf-mocka-90-10.yaml dan salin konten berikut ke file tersebut:
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-gateway-mocka spec: gateways: - simple-gateway hosts: - "*" http: - route: - destination: host: mocka subset: version-base weight: 90 - destination: host: mocka subset: $asm-labels-sample weight: 10Jalankan perintah berikut untuk membuat aturan pengarahan berlaku untuk gateway masuk:
kubectl apply -n default -f vs-tf-mocka-90-10.yamlJalankan perintah berikut untuk memeriksa apakah lalu lintas canary permintaan masuk diteruskan ke versi rilis canary dan versi dasar Layanan A:
for i in {1..200}; do curl -H'my-asm-prefer-tag: version-canary' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;Output yang Diharapkan:
-> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130) -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)Hasil menunjukkan bahwa sekitar 90% lalu lintas canary permintaan masuk diteruskan ke versi dasar Layanan A, dan sekitar 10% diteruskan ke versi rilis canary Layanan A. Menurut aturan pengarahan di atas, sekitar 90% lalu lintas permintaan diteruskan ke versi dasar Layanan A, dan sisanya 10% diteruskan berdasarkan nilai header
my-asm-prefer-tag. Perintah permintaan menetapkan nilaimy-asm-prefer-tagkeversion-canary. Oleh karena itu, 10% lalu lintas permintaan diteruskan ke versi rilis canary Layanan A.Jalankan perintah berikut untuk memeriksa apakah semua lalu lintas dasar permintaan masuk diteruskan ke versi dasar Layanan A:
for i in {1..200}; do curl -H'my-asm-prefer-tag: version-base' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;Output yang Diharapkan:
-> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93) -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)Menurut aturan pengarahan di atas, sekitar 90% lalu lintas permintaan diteruskan ke versi dasar Layanan A, dan sisanya 10% diteruskan berdasarkan nilai header
my-asm-prefer-tag. Perintah permintaan menetapkan nilaimy-asm-prefer-tagkeversion-base. Oleh karena itu, 10% lalu lintas permintaan diteruskan ke versi dasar Layanan A.