Peluncuran kanari standar hanya mencakup satu layanan dalam satu waktu. Ketika versi kanari dari layanan hulu memanggil layanan hilir, permintaan tersebut kembali ke versi dasar layanan hilir, yang mungkin tidak kompatibel. Peluncuran kanari ujung ke ujung mengatasi hal ini dengan mengarahkan lalu lintas bertag melalui versi kanari setiap layanan dalam rantai panggilan, bahkan ketika beberapa layanan tidak memiliki penerapan kanari. Microservices Engine (MSE) menyebarkan konteks kanari secara otomatis di seluruh panggilan antarlayanan. Dikombinasikan dengan Application Load Balancer (ALB) Ingress untuk pemisahan lalu lintas di gerbang, solusi ini menghadirkan peluncuran kanari ujung ke ujung tanpa perubahan pada kode bisnis Anda.
Cara kerja
ALB Ingress memisahkan lalu lintas masuk berdasarkan nama domain dan mengirimkan lalu lintas kanari ke versi kanari layanan pertama. MSE kemudian menyebarkan tag kanari melalui setiap panggilan berikutnya, sehingga setiap layanan hilir mengarahkan permintaan ke versi kanarinya sendiri.
Alur panggilan dalam contoh ini:
Client request --> ALB Ingress gateway --> Application A --> Application B --> Application C
-
Permintaan ke
www.aliyundoc.comdiarahkan ke lingkungan dasar (versi stabil semua aplikasi). -
Permintaan ke
www.example.comdiarahkan ke lingkungan kanari (versi kanari semua aplikasi).
MSE mengorganisasi peluncuran kanari ujung ke ujung berdasarkan dua konsep:
-
Lane group — sekumpulan aplikasi yang berpartisipasi dalam rantai panggilan.
-
Lane — lingkungan isolasi lalu lintas (misalnya "canary") dalam suatu lane group. Setiap lane diidentifikasi oleh sebuah tag, misalnya
gray.
Skenario contoh
Arsitektur aplikasi dalam contoh ini:
-
Gerbang ALB Ingress — memisahkan lalu lintas di lapisan ingress
-
Tiga aplikasi Spring Cloud — pusat transaksi (Application A), pusat komoditas (Application B), dan pusat inventaris (Application C)
-
Nacos — menangani penemuan layanan di antara aplikasi
-
Metode akses — berbasis klien atau berbasis HTML
Application A dapat berupa aplikasi Spring Boot. Urutan panggilan: gerbang ALB Ingress > Application A > Application B > Application C.
Pengarahan berbasis domain memisahkan lingkungan dasar dari lingkungan kanari:
| Domain | Lingkungan |
|---|---|
www.aliyundoc.com |
Dasar (versi stabil) |
www.example.com |
Kanari (versi baru) |

Catatan penggunaan
-
Jika kluster menggunakan plug-in jaringan Flannel, layanan backend gerbang ALB Ingress harus bertipe NodePort atau LoadBalancer.
-
vSwitch gerbang ALB Ingress harus berada dalam Virtual Private Cloud (VPC) yang sama dengan kluster Container Service for Kubernetes (ACK). Untuk wilayah yang didukung, lihat Wilayah dan zona yang didukung.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Memiliki kluster ACK yang menjalankan Kubernetes V1.18 atau lebih baru. Lihat Buat kluster ACK yang dikelola atau Buat kluster khusus ACK (tidak dilanjutkan)
-
kubectl terhubung ke kluster ACK. Lihat Dapatkan kubeconfig kluster dan hubungkan menggunakan kubectl
-
Komponen ALB Ingress Controller diinstal di kluster. Instal saat pembuatan kluster dengan memilih ALB Ingress untuk Ingress pada langkah Component Configuration, atau instal nanti dari halaman Add-ons. Lihat Kelola komponen
-
Edisi Profesional Microservices Governance diaktifkan di halaman Microservice Governance. Lihat Ikhtisar penagihan Microservices Governance
-
Microservices Governance MSE diaktifkan untuk aplikasi dalam kluster ACK. Lihat Aktifkan Microservices Governance untuk aplikasi mikrolayanan Java dalam kluster ACK atau ACS
Aktifkan Microservices Governance MSE
Aktifkan Microservices Governance di tingkat namespace atau untuk satu aplikasi saja.
Opsi 1: Aktifkan berdasarkan namespace
-
Masuk ke Konsol MSE dan pilih wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
-
Di halaman Application list, klik ACK Application Access.
-
Pada dialog ACK Application Access, atur parameter berikut dan klik OK.
| Parameter | Deskripsi |
|---|---|
| Cluster type | Pilih ACK Cluster, ACK Serverless Cluster, atau ACS Cluster. Jika Anda belum memberi otorisasi kepada ACK untuk memanggil MSE, klik Please Authorize. |
| Cluster Name/ID | Pilih kluster target. Gunakan pencarian berdasarkan kata kunci jika diperlukan. |
| ack-onepilot | Menampilkan status instalasi. Jika belum diinstal, sistem akan menginstalnya secara otomatis saat Anda memilih kluster. Jika Anda menggunakan pengguna Resource Access Management (RAM) tanpa izin yang diperlukan, buka Konsol ACK, buka detail kluster, klik Add-ons, temukan ack-onepilot, lalu klik Install. Lihat Komponen ack-onepilot dan Instal dan tingkatkan komponen governance mikrolayanan MSE. |
| Access Type | Pilih Namespace Access. |
| Cluster Namespace | Pilih namespace target. |
| Microservices Governance Namespace | Pilih namespace governance. |
Setelah ack-onepilot diinstal, agen akan disuntikkan secara otomatis, yang dapat meningkatkan waktu startup aplikasi hingga 10 detik.
Jika kluster tidak berada di salah satu wilayah berikut — Qingdao, Hangzhou, Beijing, Shanghai, Shanghai-Finance Cloud, Shenzhen, Hong Kong (Tiongkok), Singapura, Frankfurt, Sydney, Silicon Valley, atau Virginia — pastikan kluster dapat mengakses Internet dan terhubung ke acm.aliyun.com:8080.
Opsi 2: Aktifkan untuk satu aplikasi
-
Masuk ke Konsol MSE dan pilih wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
-
Di halaman Application list, klik ACK Application Access.
-
Pada dialog ACK Application Access, atur parameter berikut dan klik OK.
| Parameter | Deskripsi |
|---|---|
| Cluster type | Pilih ACK Cluster, ACK Serverless Cluster, atau ACS Cluster. Jika Anda belum memberi otorisasi kepada ACK untuk memanggil MSE, klik Please Authorize. |
| Cluster Name/ID | Pilih kluster target. Gunakan pencarian berdasarkan kata kunci jika diperlukan. |
| ack-onepilot | Menampilkan status instalasi. Lihat Opsi 1 di atas untuk detailnya. |
| Access Type | Pilih Single Application Access. |
| Access Procedure | Ikuti langkah-langkah berikut: 1. Buka Workloads > Deployments di Konsol ACK dan alihkan ke namespace aplikasi. 2. Temukan aplikasi target dan klik View In YAML. 3. Tambahkan label berikut dan klik Update. |
spec:
template:
metadata:
labels:
# Atur ke "on" untuk mengaktifkan governance MSE. Nilai harus diapit tanda kutip ganda.
msePilotAutoEnable: "on"
# Tentukan namespace governance. Jika namespace belum ada, akan dibuat otomatis.
mseNamespace: default
# Tentukan nama aplikasi untuk MSE. Nama harus diapit tanda kutip ganda.
msePilotCreateAppName: "your-deployment-name"
Langkah 1: Terapkan aplikasi demo
Terapkan versi dasar dan kanari dari Aplikasi A, B, dan C, serta server Nacos untuk penemuan layanan. Setiap aplikasi memiliki dua deployment: versi dasar dan versi kanari yang ditandai dengan alicloud.service.tag: gray.
-
Masuk ke ACK console. Pada panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, temukan kluster Anda dan klik namanya. Di panel navigasi kiri, pilih Workloads > Deployments.
-
Pilih namespace dan klik Create from YAML. Salin konten YAML berikut dan klik Create.
# Versi dasar Aplikasi A (pusat transaksi)
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-a
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-a
app: spring-cloud-a
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
imagePullPolicy: Always
name: spring-cloud-a
ports:
- containerPort: 20001
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
# Versi kanari Aplikasi A
# "alicloud.service.tag: gray" mengidentifikasi deployment ini sebagai versi kanari.
# MSE menggunakan label ini untuk mengarahkan trafik bertag kanari ke pod-pod ini.
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a-new
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-a-new
strategy:
template:
metadata:
labels:
# Label ini memberi tahu MSE bahwa pod termasuk dalam lane "gray" (kanari).
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-a
app: spring-cloud-a-new
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
# Mengaktifkan propagasi konteks kanari di seluruh panggilan hilir.
- name: profiler.micro.service.tag.trace.enable
value: "true"
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
imagePullPolicy: Always
name: spring-cloud-a-new
ports:
- containerPort: 20001
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
# Versi dasar Aplikasi B (pusat komoditas)
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-b
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-b
strategy:
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-b
app: spring-cloud-b
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
imagePullPolicy: Always
name: spring-cloud-b
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
# Versi kanari Aplikasi B
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-b-new
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-b-new
template:
metadata:
labels:
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-b
app: spring-cloud-b-new
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
imagePullPolicy: Always
name: spring-cloud-b-new
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
# Versi dasar Aplikasi C (pusat inventaris)
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-c
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-c
app: spring-cloud-c
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
imagePullPolicy: Always
name: spring-cloud-c
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
# Versi kanari Aplikasi C
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c-new
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-c-new
template:
metadata:
labels:
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-c
app: spring-cloud-c-new
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
imagePullPolicy: IfNotPresent
name: spring-cloud-c-new
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
# Server Nacos untuk penemuan layanan
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos-server
spec:
replicas: 1
selector:
matchLabels:
app: nacos-server
template:
metadata:
labels:
app: nacos-server
spec:
containers:
- env:
- name: MODE
value: standalone
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2
imagePullPolicy: Always
name: nacos-server
dnsPolicy: ClusterFirst
restartPolicy: Always
# Layanan server Nacos
---
apiVersion: v1
kind: Service
metadata:
name: nacos-server
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: ClusterIP
Konfigurasikan pengaturan jaringan
Buat dua Service Kubernetes untuk Aplikasi A: satu untuk versi dasar dan satu untuk versi kanari. ALB Ingress mengarahkan lalu lintas ke Service ini berdasarkan nama domain.
# Service untuk versi dasar Aplikasi A
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-base
spec:
ports:
- name: http
nodePort: 32605
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a
sessionAffinity: None
type: NodePort
---
# Service untuk versi kanari Aplikasi A
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-gray
spec:
ports:
- name: http
nodePort: 31622
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a-new
sessionAffinity: None
type: NodePort
Langkah 2: Konfigurasikan pengarahan ALB Ingress
-
Buat objek AlbConfig. Lihat Buat objek AlbConfig.
PentingvSwitch gerbang ALB Ingress harus berada dalam VPC yang sama dengan kluster. Jika tidak, bisnis Anda akan terganggu.
-
Buat resource Ingress. Simpan YAML berikut sebagai
gray-ingress.yaml.-
Untuk kluster yang menjalankan Kubernetes sebelum V1.19:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: demo namespace: default spec: ingressClassName: alb rules: - host: www.aliyundoc.com http: paths: - path: /a backend: serviceName: spring-clud-a-base servicePort: 20001 - host: www.example.com http: paths: - backend: serviceName: spring-cloud-a-gray servicePort: 20001 path: /a pathType: ImplementationSpecific -
Untuk kluster yang menjalankan Kubernetes V1.19 atau lebih baru:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb rules: - host: www.aliyundoc.com http: paths: - path: /a pathType: ImplementationSpecific backend: service: name: spring-clud-a-base port: number: 20001 - host: www.example.com http: paths: - path: /a pathType: ImplementationSpecific backend: service: name: spring-clud-a-base-gray port: number: 20001
-
-
Terapkan resource Ingress:
kubectl apply -f gray-ingress.yaml

Jika kolom ADDRESS kosong pada output, periksa event di halaman detail Ingress dan tinjau kembali prasyarat untuk pemecahan masalah.
Langkah 3: Buat lane group dan lane di Konsol MSE
-
Masuk ke Konsol MSE dan pilih wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Full link Grayscale.
-
Klik Create lane groups and lanes.. Jika lane group sudah ada, klik + untuk Create Lane Group.
-
Di panel Create Lane Group, tambahkan tiga aplikasi —
spring-cloud-a,spring-cloud-b, danspring-cloud-c— lalu klik OK. -
Di bagian bawah halaman Full link Grayscale, klik Create First Split Lane. Di panel Create Lane, pilih tag gray dan klik OK.
Verifikasi hasil
Kirim permintaan uji untuk memastikan lalu lintas mengalir dengan benar melalui seluruh rantai panggilan.
Verifikasi pengarahan lingkungan dasar:
curl -H"Host:aliyundoc.base.com" http://<alb-endpoint>/a
Output yang diharapkan:
A[172.18.XX.XX] -> B[172.18.XX.XX] -> C[172.18.XX.XX]%
Tidak ada nama aplikasi yang memiliki akhiran "gray", yang menegaskan bahwa ketiga layanan menangani permintaan menggunakan versi dasarnya.
Verifikasi pengarahan lingkungan kanari:
curl -H"Host:www.example.com" http://<alb-endpoint>/a
Output yang diharapkan:
Agray[172.18.XX.XX] -> Bgray[172.18.XX.XX] -> Cgray[172.18.XX.XX]%
Akhiran "gray" pada setiap nama aplikasi menegaskan bahwa MSE menyebarkan konteks kanari melalui seluruh rantai panggilan — dari Aplikasi A ke B hingga C. Hal ini membuktikan bahwa pengarahan berbasis domain di lapisan ALB dan pengarahan berbasis lane di lapisan MSE berfungsi dengan benar.
Ganti <alb-endpoint> dengan titik akhir aktual gerbang ALB Ingress (misalnya, alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com). Temukan titik akhir ini di output kubectl get ingress.