Jalur lalu lintas mengarahkan permintaan ke versi layanan tertentu di seluruh rantai panggilan. Misalnya, semua permintaan yang diberi tag v2 mencapai instans v2 dari setiap layanan dalam rantai tersebut. Dalam mode longgar, jika versi yang sesuai tidak tersedia untuk suatu layanan tertentu, lalu lintas secara otomatis dialihkan ke versi garis dasar (baseline) alih-alih gagal. Pendekatan ini memungkinkan rilis canary dan pengujian berbasis versi yang aman pada arsitektur multi-layanan tanpa mewajibkan setiap layanan memiliki semua versi yang dideploy.
Cara kerja
Empat jenis resource bekerja sama untuk mengimplementasikan jalur lalu lintas:
| Resource | Peran |
|---|---|
| OpenTelemetry Instrumentation | Secara otomatis menyebarkan header baggage di seluruh panggilan layanan tanpa perubahan kode |
| ASMHeaderPropagation | CRD khusus ASM yang mengekstrak header tertentu (seperti version) dari konteks baggage dan melampirkannya sebagai header permintaan di seluruh rantai panggilan |
| DestinationRule | Menentukan subset layanan (v1, v2, v3) berdasarkan label pod |
| VirtualService | Mengarahkan permintaan ke subset yang benar dengan mencocokkan header version yang disebarkan, dengan fallback ke subset garis dasar ketika versi target tidak memiliki titik akhir yang sehat |
Alur lalu lintas:
baggage: userId=alice,serverNode=DF%2028,isProduction=falseField fallback yang digunakan dalam rute VirtualService merupakan ekstensi khusus ASM terhadap API Istio VirtualService standar. Field ini dipicu ketika subset target tidak memiliki titik akhir yang sehat, sehingga lalu lintas dialihkan ke subset fallback yang ditentukan alih-alih mengembalikan error. Field ini tidak tersedia di Istio upstream.Header baggage
Baggage adalah mekanisme OpenTelemetry untuk menyebarkan konteks pasangan kunci-nilai (key-value) di seluruh proses dalam jejak terdistribusi (distributed trace). Mekanisme ini menggunakan header HTTP:
baggage: userId=alice,serverNode=DF%2028,isProduction=falseHeader baggage membawa data konteks seperti ID penyewa, ID jejak, dan kredensial keamanan, memungkinkan analisis jejak dan korelasi log tanpa modifikasi kode.
Untuk informasi lebih lanjut tentang jalur lalu lintas, lihat Ikhtisar jalur lalu lintas.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans Service Mesh (ASM) Edisi Perusahaan atau Edisi Ultimate versi 1.21.6.54 atau yang lebih baru — lihat Buat instans ASM atau Perbarui instans ASM
Kluster Kubernetes yang telah ditambahkan ke instans ASM — lihat Tambahkan kluster ke instans ASM
Gerbang masuk (ingress gateway) ASM bernama
ingressgateway— lihat Buat gerbang masukHelm yang telah diinstal di mesin lokal Anda — lihat Install Helm
Langkah 1: Deploy Operator OpenTelemetry dan konfigurasikan auto-instrumentasi
Operator OpenTelemetry secara otomatis menginstrumentasi pod layanan untuk menyebarkan header baggage di seluruh panggilan tanpa perubahan kode.
Deploy Operator OpenTelemetry
Sambungkan ke kluster Kubernetes dengan kubectl. Buat namespace
opentelemetry-operator-system:kubectl create namespace opentelemetry-operator-systemInstal Operator OpenTelemetry dengan Helm:
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts helm install \ --namespace=opentelemetry-operator-system \ --version=0.46.0 \ --set admissionWebhooks.certManager.enabled=false \ --set admissionWebhooks.certManager.autoGenerateCert=true \ --set manager.image.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-operator" \ --set manager.image.tag="0.92.1" \ --set kubeRBACProxy.image.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/kube-rbac-proxy" \ --set kubeRBACProxy.image.tag="v0.13.1" \ --set manager.collectorImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-collector" \ --set manager.collectorImage.tag="0.97.0" \ --set manager.opampBridgeImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/operator-opamp-bridge" \ --set manager.opampBridgeImage.tag="0.97.0" \ --set manager.targetAllocatorImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/target-allocator" \ --set manager.targetAllocatorImage.tag="0.97.0" \ --set manager.autoInstrumentationImage.java.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-java" \ --set manager.autoInstrumentationImage.java.tag="1.32.1" \ --set manager.autoInstrumentationImage.nodejs.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-nodejs" \ --set manager.autoInstrumentationImage.nodejs.tag="0.49.1" \ --set manager.autoInstrumentationImage.python.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-python" \ --set manager.autoInstrumentationImage.python.tag="0.44b0" \ --set manager.autoInstrumentationImage.dotnet.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-dotnet" \ --set manager.autoInstrumentationImage.dotnet.tag="1.2.0" \ --set manager.autoInstrumentationImage.go.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-go-instrumentation" \ --set manager.autoInstrumentationImage.go.tag="v0.10.1.alpha-2-aliyun" \ opentelemetry-operator open-telemetry/opentelemetry-operatorVerifikasi bahwa pod operator sedang berjalan: Output yang diharapkan:
kubectl get pod -n opentelemetry-operator-systemNAME READY STATUS RESTARTS AGE opentelemetry-operator-854fb558b5-pvllj 2/2 Running 0 1m
Konfigurasikan auto-instrumentasi
Buat file instrumentation.yaml untuk mendeklarasikan propagator baggage. Pilih konfigurasi berdasarkan apakah OpenTelemetry Collector telah dideploy di lingkungan Anda.
Tanpa OpenTelemetry Collector — Menonaktifkan ekspor metrik dan pelacakan (tracing) untuk menghindari error saat tidak tersedia titik akhir collector:
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: demo-instrumentation
spec:
env:
- name: OTEL_METRICS_EXPORTER
value: none
propagators:
- baggage
sampler:
argument: "1"
type: always_offDengan OpenTelemetry Collector — Mengaktifkan pelacakan penuh dengan sampling berbasis induk (parent-based):
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: demo-instrumentation
spec:
propagators:
- baggage
sampler:
type: parentbased_traceidratio
argument: "1"Terapkan resource instrumentasi ke namespace default:
kubectl apply -f instrumentation.yamlMen-deploy OpenTelemetry Collector untuk mengumpulkan data observabilitas merupakan praktik terbaik. Untuk detail tentang pengumpulan data tracing ASM, lihat Kumpulkan data tracing ASM ke Managed Service for OpenTelemetry.
Langkah 2: Deploy layanan contoh
Langkah ini mendeploy tiga layanan — mocka, mockb, dan mockc — masing-masing dengan tiga versi (v1, v2, v3). Layanan-layanan ini membentuk rantai panggilan: mocka -> mockb -> mockc. Setiap pod diberi anotasi untuk auto-instrumentasi Java, sehingga header baggage disebarkan secara otomatis.
Aktifkan injeksi proxy sidecar otomatis untuk namespace
default. Lihat Kelola namespace global.Untuk informasi lebih lanjut tentang injeksi sidecar, lihat Aktifkan injeksi proxy sidecar otomatis.
Buat file
mock.yamldengan konten berikut.Poin penting mengenai manifes YAML:
Konfigurasi Tujuan Label ASM_TRAFFIC_TAGMemberi tag setiap pod dengan versinya (v1, v2, atau v3) untuk routing jalur lalu lintas instrumentation.opentelemetry.io/inject-java: "true"Memicu auto-instrumentasi OpenTelemetry untuk kontainer Java instrumentation.opentelemetry.io/container-names: "default"Menentukan kontainer mana yang akan diinstrumentasi Variabel lingkungan upstream_urlMenentukan rantai panggilan: mocka->mockb->mockcDeploy layanan: Dengan auto-instrumentasi yang telah diterapkan, pod secara otomatis menyebarkan header baggage di seluruh rantai panggilan.
kubectl apply -f mock.yaml
Langkah 3: Buat aturan routing untuk jalur lalu lintas
Langkah ini membuat destination rule, CRD ASMHeaderPropagation, virtual service, dan aturan gerbang masuk. Bersama-sama, resource ini mengarahkan permintaan ke versi layanan yang benar berdasarkan header version yang disebarkan, dengan fallback ke v1 ketika versi tersebut tidak tersedia.
Buat destination rule
Destination rule menentukan subset layanan berdasarkan label pod. Tidak semua layanan memiliki ketiga versi tersebut — hal ini sengaja dilakukan untuk menunjukkan perilaku fallback mode longgar.
| Layanan | Subset yang tersedia |
|---|---|
mocka | v1, v2, v3 |
mockb | v1, v3 |
mockc | v1, v2 |
Buat file
dr-mock.yamldengan konten berikut.Sambungkan ke instans ASM dengan kubectl dan terapkan destination rule:
kubectl apply -f dr-mock.yaml
Buat CRD ASMHeaderPropagation
CRD ASMHeaderPropagation memberi tahu ASM header mana yang harus diekstrak dari konteks baggage dan disebarkan di seluruh rantai panggilan. Dalam contoh ini, header version diekstrak agar layanan downstream menerima konteks routing yang benar.
Buat file
propagation.yaml:Field Deskripsi apiVersionistio.alibabacloud.com/v1beta1— grup API khusus ASMkindASMHeaderPropagation— CRD untuk propagasi header dari konteks baggagespec.headersDaftar nama header yang akan diekstrak dari baggage dan disebarkan sebagai header permintaan apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMHeaderPropagation metadata: name: version-propagation spec: headers: - versionSambungkan ke instans ASM dengan kubectl dan terapkan CRD:
kubectl apply -f propagation.yaml
Buat virtual service
Virtual service mengarahkan permintaan ke subset yang benar dengan mencocokkan header version. Setiap aturan mencakup target fallback yang mengarah ke v1 (versi garis dasar). Dalam mode longgar, ketika permintaan menargetkan versi yang tidak tersedia (misalnya, mockb tidak memiliki v2), ASM mengarahkan lalu lintas ke subset fallback alih-alih mengembalikan error.
Buat file
vs-mock.yamldengan konten berikut.Pola routing untuk setiap layanan mengikuti struktur berikut:
# Untuk setiap pencocokan versi, tentukan destinasi utama dan fallback - match: - headers: version: exact: v2 # Cocokkan header version yang disebarkan route: - destination: host: <service>.default.svc.cluster.local subset: v2 # Utama: arahkan ke versi yang cocok fallback: target: host: <service>.default.svc.cluster.local subset: v1 # Fallback: arahkan ke garis dasar jika v2 tidak memiliki titik akhir yang sehatSambungkan ke instans ASM dengan kubectl dan terapkan virtual service:
kubectl apply -f vs-mock.yaml
Buat aturan gerbang masuk
Gerbang masuk mendistribusikan lalu lintas masuk ke berbagai versi layanan berdasarkan bobot dan menetapkan header version pada setiap permintaan agar sesuai dengan versi target.
Buat file
gw-mock.yamldengan konten berikut.Konfigurasi ini mendistribusikan lalu lintas ke v1, v2, dan v3 dari
mockadengan rasio 40:30:30. Untuk setiap permintaan, gerbang menetapkan headerversionke versi target sehingga layanan downstream dalam rantai panggilan menerima konteks routing yang benar melalui propagasi baggage.Sambungkan ke instans ASM dengan kubectl dan terapkan aturan gerbang:
kubectl apply -f gw-mock.yaml
Langkah 4: Verifikasi routing jalur lalu lintas
Dapatkan Alamat IP publik gerbang masuk. Lihat Dapatkan alamat IP gerbang masuk ASM.
Tetapkan IP gerbang sebagai variabel lingkungan: Ganti
<gateway-ip>dengan alamat IP yang sebenarnya.export ASM_GATEWAY_IP=<gateway-ip>Kirim permintaan berulang untuk mengamati distribusi lalu lintas: Output contoh:
for i in {1..100}; do curl http://${ASM_GATEWAY_IP}; echo ''; sleep 1; done-> mocka(version: v1, ip: 192.168.1.27)-> mockb(version: v1, ip: 192.168.1.30)-> mockc(version: v1, ip: 192.168.1.14) -> mocka(version: v2, ip: 192.168.1.28)-> mockb(version: v1, ip: 192.168.1.30)-> mockc(version: v2, ip: 192.168.1.1) -> mocka(version: v3, ip: 192.168.1.26)-> mockb(version: v3, ip: 192.168.1.29)-> mockc(version: v1, ip: 192.168.1.14)Verifikasi hasilnya. Output tersebut mengonfirmasi dua perilaku: Distribusi berbasis bobot: Lalu lintas terbagi di antara v1, v2, dan v3 dengan rasio sekitar 40:30:30. Fallback mode longgar: Ketika suatu versi tidak tersedia untuk layanan tertentu, lalu lintas dialihkan ke v1:
Jalur v2:
mocka-v2->mockb-v1(tidak adamockb-v2, sehingga lalu lintas dialihkan ke v1) ->mockc-v2Jalur v3:
mocka-v3->mockb-v3->mockc-v1(tidak adamockc-v3, sehingga lalu lintas dialihkan ke v1)
Jalur mocka mockb mockc v1 v1 v1 v1 v2 v2 v1 (tidak ada v2, fallback) v2 v3 v3 v3 v1 (tidak ada v3, fallback)