Dalam arsitektur microservices, pengembangan fitur sering kali memerlukan modifikasi pada beberapa layanan. Untuk menguji perubahan tersebut, setiap layanan biasanya memiliki lingkungan canary untuk menangani sebagian traffic. Panduan ini menjelaskan cara memastikan bahwa permintaan yang diarahkan ke lingkungan canary tetap berada di dalamnya sepanjang rantai panggilan. Bahkan jika beberapa layanan dalam rantai tidak memiliki versi canary, permintaan tetap diteruskan dengan benar ke lingkungan canary layanan downstream berikutnya yang tersedia. Dengan menggabungkan routing fleksibel dari gerbang Alibaba Cloud Application Load Balancer (ALB) Ingress dan kemampuan peluncuran kanari ujung ke ujung dari MSE Microservices Governance, Anda dapat menerapkan pola ini tanpa mengubah kode aplikasi.
Prosedur
Catatan penggunaan
Jika Anda menggunakan plug-in jaringan Flannel, Service backend untuk gerbang ALB Ingress hanya mendukung tipe NodePort dan LoadBalancer.
vSwitch instans ALB harus berada dalam VPC (Virtual Private Cloud) yang sama dengan kluster ACK. Untuk informasi lebih lanjut tentang wilayah yang didukung oleh ALB, lihat Wilayah dan zona yang didukung.
Kasus penggunaan: Peluncuran kanari ujung ke ujung dengan routing berbasis domain
Pada kasus ini, arsitektur aplikasi terdiri dari gerbang ALB Ingress dan arsitektur microservice Spring Cloud di backend. Rantai panggilan backend melibatkan tiga layanan: pusat transaksi (Aplikasi A), pusat produk (Aplikasi B), dan pusat inventaris (Aplikasi C). Anda dapat mengakses layanan backend melalui client atau HTML. Server Nacos digunakan untuk service discovery di antara layanan-layanan tersebut.
Anda dapat menggunakan nama domain berbeda untuk membedakan antara lingkungan dasar dan canary. Misalnya, akses www.example.com untuk meminta lingkungan canary dan akses www.aliyundoc.com untuk meminta lingkungan dasar.
Seperti yang ditunjukkan pada gambar berikut, rantai panggilannya adalah Ingress-ALB > A > B > C. Aplikasi A dapat berupa aplikasi Spring Boot.

Sebelum memulai
Buat kluster Kubernetes
Buat kluster Kubernetes versi 1.18 atau yang lebih baru. Untuk informasi lebih lanjut, lihat Buat kluster ACK yang dikelola atau Buat kluster khusus ACK (tidak dilanjutkan).
Hubungkan ke kluster ACK dengan kubectl
Hubungkan ke kluster ACK menggunakan kubectl. Untuk informasi lebih lanjut, lihat Hubungkan ke kluster ACK menggunakan kubectl.
Instal komponen ALB Ingress Controller
Instal komponen ALB Ingress Controller untuk kluster ACK Anda. Anda dapat menggunakan salah satu metode berikut:
Saat membuat kluster ACK, pilih ALB Ingress untuk bidang Ingress pada halaman Component Configuration untuk menginstal komponen ALB Ingress Controller.
Jika Anda memiliki kluster ACK yang sudah ada, Anda dapat menginstal komponen ALB Ingress Controller pada halaman Add-ons. Untuk informasi lebih lanjut, lihat Kelola add-on.
Aktifkan MSE Microservices Governance
Pada halaman aktivasi MSE Microservices Governance, aktifkan Edisi Profesional Microservices Governance.
Untuk informasi lebih lanjut tentang penagihan MSE Microservices Governance, lihat Penagihan MSE Microservices Governance.
-
Aktifkan Microservices Governance untuk aplikasi microservice di kluster Container Service for Kubernetes (ACK). Anda dapat memilih metode yang sesuai berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat Aktifkan Microservices Governance untuk aplikasi microservice Java di kluster ACK atau ACS.
Aktifkan Microservices Governance untuk aplikasi dalam namespace ACK
-
Login ke Konsol MSE, lalu pilih wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
-
Pada halaman Application list, klik ACK Application Access.
-
Pada kotak dialog ACK Application Access, konfigurasikan parameter dan klik OK.
Atur Onboarding Type menjadi Namespace atau Single Application. Dari daftar drop-down Container Cluster Namespace, pilih namespace target, misalnya
default. Pada bidang Governance Namespace, masukkan nama untuk namespace yang sesuai.Parameter
Deskripsi
Cluster type
Pilih ACK Cluster, ACK Serverless Cluster, atau ACS Cluster.
CatatanJika Anda belum memberikan otorisasi kepada Container Service for Kubernetes untuk memanggil MSE, klik Authorize Now untuk memberikan izin yang diperlukan.
Cluster Name/ID
Pilih Cluster Name/ID dari kluster yang ingin Anda hubungkan ke pusat governance MSE. Anda dapat mencari kluster berdasarkan kata kunci.
ack-onepilot
Menampilkan status komponen ack-onepilot. Untuk informasi lebih lanjut tentang komponen ini dan cara meningkatkannya, lihat komponen ack-onepilot dan Instal dan tingkatkan komponen governance microservices MSE.
-
Jika ack-onepilot belum diinstal, sistem akan secara otomatis memulai instalasi setelah Anda memilih kluster dan menampilkan pesan "The installation process takes about 1 minute. Wait for a while."
Jika Anda menggunakan Pengguna RAM dan menerima error izin, login ke Konsol Container Service for Kubernetes. Buka kluster target, lalu di panel navigasi kiri, klik Add-ons. Temukan ack-onepilot dan klik Install.
-
Jika ack-onepilot sudah diinstal, UI akan menampilkan versi yang diinstal, misalnya,
Installed 4.2.0.
Catatan-
Anda dapat melihat detail komponen ack-onepilot dengan login ke Konsol Container Service for Kubernetes, buka kluster target, lalu pilih Operations > Add-ons.
-
Setelah ack-onepilot diinstal, komponen tersebut secara otomatis menyuntikkan agen Java. Hal ini dapat meningkatkan waktu startup aplikasi hingga 10 detik.
-
Saat menghubungkan berdasarkan namespace, jika kluster target Anda tidak berada di salah satu wilayah yang tercantum, pastikan kluster tersebut memiliki akses jaringan publik dan dapat terhubung ke acm.aliyun.com:8080: Tiongkok (Qingdao), Tiongkok (Hangzhou), Tiongkok (Beijing), Tiongkok (Shanghai), Shanghai Finance Cloud, Tiongkok (Shenzhen), Hong Kong (Tiongkok), Singapura, Jerman (Frankfurt), Australia (Sydney), AS (Silicon Valley), dan AS (Virginia).
Access Type
Pilih Namespace Access.
Cluster Namespace
Pilih Cluster Namespace.
Microservices Governance Namespace
Pilih Microservices Governance Namespace.
-
Aktifkan Microservices Governance untuk aplikasi
-
Login ke Konsol MSE, lalu pilih wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
-
Pada halaman Application list, klik ACK Application Access.
-
Pada kotak dialog ACK Application Access, konfigurasikan parameter dan klik OK.
Atur Onboarding Type menjadi Single Application. Pada bagian Edit Labels (format YAML), tambahkan label berikut di bawah
spec.template.metadata.labelsdalam file YAML Deployment aplikasi:msePilotAutoEnable: "on"untuk mengaktifkan governance microservices,mseNamespace: defaultuntuk menentukan namespace MSE, danmsePilotCreateAppName: "your-deployment-name"untuk mengatur nama aplikasi. Gantiyour-deployment-namedengan nama Deployment yang sebenarnya.Parameter
Deskripsi
Cluster type
Pilih ACK Cluster, ACK Serverless Cluster, atau ACS Cluster.
CatatanJika Anda belum memberikan otorisasi kepada Container Service for Kubernetes untuk memanggil MSE, klik Authorize Now untuk memberikan izin yang diperlukan.
Cluster Name/ID
Pilih Cluster Name/ID dari kluster yang ingin Anda hubungkan ke pusat governance MSE. Anda dapat mencari kluster berdasarkan kata kunci.
ack-onepilot
Menampilkan status komponen ack-onepilot. Untuk informasi lebih lanjut tentang komponen ini dan cara meningkatkannya, lihat komponen ack-onepilot dan Instal dan tingkatkan komponen governance microservices MSE.
-
Jika ack-onepilot belum diinstal, sistem akan secara otomatis memulai instalasi setelah Anda memilih kluster dan menampilkan pesan "The installation process takes about 1 minute. Wait for a while."
Jika Anda menggunakan Pengguna RAM dan menerima error izin, login ke Konsol Container Service for Kubernetes. Buka kluster target, lalu di panel navigasi kiri, klik Add-ons. Temukan ack-onepilot dan klik Install.
-
Jika ack-onepilot sudah diinstal, UI akan menampilkan versi yang diinstal, misalnya,
Installed 4.2.0.
Catatan-
Anda dapat melihat detail komponen ack-onepilot dengan login ke Konsol Container Service for Kubernetes, buka kluster target, lalu pilih Operations > Add-ons.
-
Setelah ack-onepilot diinstal, komponen tersebut secara otomatis menyuntikkan agen Java. Hal ini dapat meningkatkan waktu startup aplikasi hingga 10 detik.
-
Saat menghubungkan berdasarkan namespace, jika kluster target Anda tidak berada di salah satu wilayah yang tercantum, pastikan kluster tersebut memiliki akses jaringan publik dan dapat terhubung ke acm.aliyun.com:8080: Tiongkok (Qingdao), Tiongkok (Hangzhou), Tiongkok (Beijing), Tiongkok (Shanghai), Shanghai Finance Cloud, Tiongkok (Shenzhen), Hong Kong (Tiongkok), Singapura, Jerman (Frankfurt), Australia (Sydney), AS (Silicon Valley), dan AS (Virginia).
Access Type
Pilih Single Application Access.
Access Procedure
Ikuti langkah-langkah berikut.
Step 1: Di Konsol Container Service for Kubernetes, buka halaman Workloads > Deployments kluster Anda dan alihkan ke namespace aplikasi Anda.
Step 2: Temukan aplikasi target dan klik Edit YAML.
Step 3: Edit bidang
labelsseperti pada contoh berikut dan klik Update.spec: template: metadata: labels: # Setel ke "on" untuk mengaktifkan koneksi. Nilai harus diapit tanda kutip ganda. msePilotAutoEnable: "on" # Tentukan namespace governance target. Jika namespace tidak ada, akan dibuat secara otomatis. mseNamespace: default # Tentukan nama aplikasi yang akan ditampilkan di MSE. Nilai harus diapit tanda kutip ganda. msePilotCreateAppName: "your-deployment-name" -
-
Deploy aplikasi demo
-
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Pada halaman Stateless, pilih namespace, lalu klik Create from YAML. Tempel konten berikut ke editor, lalu klik Create.
Pada contoh ini, tiga aplikasi (A, B, dan C) di-deploy. Versi dasar dan versi canary di-deploy untuk setiap aplikasi. Aplikasi Nacos Server juga di-deploy untuk service discovery.
# Versi dasar aplikasi A --- 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 canary aplikasi A --- 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: 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 - 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 --- 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 canary 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 --- 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 canary 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 # Nacos Server --- 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 # Konfigurasi Service Nacos Server --- 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
Konfigurasikan dua Service Kubernetes untuk aplikasi ingress A: spring-cloud-a-base untuk versi dasar dan spring-cloud-a-gray untuk versi canary.
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
---
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: NodePortLangkah 1: Konfigurasikan routing ALB
Buat objek AlbConfig. Untuk informasi lebih lanjut, lihat Buat AlbConfig.
PentingPastikan vSwitch instans ALB berada dalam VPC yang sama dengan kluster. Jika tidak, layanan Anda mungkin terganggu.
Konfigurasikan Ingress.
Salin konten berikut ke file bernama
gray-ingress.yaml.Untuk kluster dengan versi Kubernetes sebelum 1.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-cloud-a-base servicePort: 20001 - host: www.example.com http: paths: - backend: serviceName: spring-cloud-a-gray servicePort: 20001 path: /a pathType: ImplementationSpecificUntuk kluster dengan versi Kubernetes 1.19 atau yang lebih baru:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb rules: - host: www.aliyundoc.com http: paths: # Konfigurasikan context path. - path: /a pathType: ImplementationSpecific backend: service: name: spring-cloud-a-base port: number: 20001 - host: www.example.com http: paths: # Konfigurasikan context path. - path: /a pathType: ImplementationSpecific backend: service: name: spring-cloud-a-gray port: number: 20001
Jalankan perintah berikut:
kubectl apply -f gray-ingress.yamlJalankan perintah berikut untuk memverifikasi bahwa resource Ingress canary telah dibuat dan gray-ingress telah mendapatkan ADDRESS dari ALB.
shell@Alicloud:~$ kubectl get ing NAME CLASS HOSTS ADDRESS PORTS AGE cafe-ingress alb * alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com 80 29h gray-ingress <none> www.base.com,www.gray.com alb-828vagckg5omzfy4yn.cn-beijing.alb.aliyuncs.com 80 28nJika tidak ada endpoint yang ditampilkan di kolom ADDRESS, periksa event dan lakukan troubleshooting dengan merujuk ke bagian "Sebelum memulai".
Langkah 2: Konfigurasikan peluncuran kanari ujung ke ujung MSE
-
Login ke Konsol MSE, lalu pilih wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Full link Grayscale.
Klik Create Lane Group and Lane. Jika grup lane sudah ada, klik + Create Lane Group.
Pada panel Create Lane Group, konfigurasikan parameter dan klik OK.
Tambahkan aplikasi spring-cloud-a, spring-cloud-b, dan spring-cloud-c ke grup lane.
Di bagian bawah halaman End-to-end Canary Release, klik Create First Split Lane. Pada panel Create Lane, konfigurasikan parameter lane, pilih tag gray, lalu klik OK.
Langkah 3: Verifikasi hasil
Permintaan ke
www.aliyundoc.comdiarahkan ke lingkungan dasar.# Perintah pengujian curl -H"Host:www.aliyundoc.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a # Hasil pengujian A[172.18.XX.XX] -> B[172.18.XX.XX] -> C[172.18.XX.XX]%Permintaan ke
www.example.comdiarahkan ke lingkungan canary.# Perintah pengujian curl -H"Host:www.example.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a # Hasil pengujian Agray[172.18.XX.XX] -> Bgray[172.18.XX.XX] -> Cgray[172.18.XX.XX]%
Pada perintah di atas, alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com adalah titik akhir gerbang ALB Ingress.