Dengan perutean subset statis, setiap DestinationRule harus mencantumkan tiap subset secara eksplisit. Ketika versi baru dirilis atau versi lama dihentikan, aturan tersebut harus diperbarui secara manual. Perutean subset dinamis menghilangkan beban ini: Service Mesh (ASM) memantau label workload dan mengelompokkan endpoint ke dalam subset secara otomatis, sehingga aturan perutean tetap mutakhir tanpa perubahan manual.
Contoh end-to-end berikut men-deploy aplikasi multi-versi, mengarahkan permintaan ke versi dan lingkungan tertentu berdasarkan Header HTTP, serta mengonfigurasi perilaku fallback ketika subset target tidak tersedia.
Cara kerja subset dinamis
Pada perutean Istio standar, DestinationRule mencantumkan tiap subset dengan kumpulan label tetap. Saat versi berubah, aturan tersebut harus diperbarui agar sesuai.
Subset dinamis menggunakan pendekatan yang berbeda. Alih-alih mencantumkan tiap subset, Anda menentukan satu atau beberapa kunci pengelompokan (misalnya, version dan stage). ASM memeriksa label pada setiap endpoint di balik suatu layanan dan mengelompokkan endpoint yang memiliki kombinasi kunci-nilai yang sama ke dalam subset yang sama—secara otomatis.
VirtualService kemudian memetakan header permintaan masuk ke kunci pengelompokan tersebut. Misalnya, permintaan yang membawa x-version: v2 dan x-stage: prod akan diarahkan ke subset tempat version=v2 dan stage=prod.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM versi 1.18 atau lebih baru
Kluster Container Service for Kubernetes (ACK) yang ditambahkan ke instans ASM
kubectl yang dikonfigurasi dengan file kubeconfig kluster ACK
Langkah 1: Deploy aplikasi contoh
Contoh ini menggunakan hashicorp/http-echo untuk mensimulasikan deployment multi-lingkungan dan multi-versi:
Lingkungan dev: versi v1, v2, v3
Lingkungan prod: versi v2, v3
Tiap Pod merespons dengan informasi lingkungan, versi, dan alamat IP-nya. Layanan helloworld pada Port 8000 melayani semua Pod, dan Deployment sleep menyediakan client untuk pengujian.

Deploy semua resource dengan kubectl. Untuk informasi selengkapnya, lihat Deploy aplikasi di kluster ACK yang ditambahkan ke instans ASM.
Langkah 2: Arahkan permintaan ke versi dan lingkungan tertentu
Setelah deployment, Kubernetes melakukan load-balancing permintaan ke seluruh Pod helloworld tanpa memandang versi atau lingkungan. Untuk menargetkan kombinasi tertentu, buat DestinationRule yang menentukan kunci pengelompokan dan VirtualService yang memetakan header permintaan ke kunci tersebut.
Buat DestinationRule
Terapkan DestinationRule berikut untuk mengelompokkan endpoint berdasarkan stage dan version. Untuk informasi selengkapnya, lihat Manage destination rules.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: helloworld
namespace: default
spec:
host: helloworld.default.svc.cluster.local
trafficPolicy:
loadBalancer:
dynamicSubset:
subsetSelectors:
- fallbackPolicy: NO_FALLBACK
keys:
- stage
- versionASM membaca label stage dan version dari tiap endpoint dan menghasilkan subset berikut:
| Subset | Pod | Alamat IP |
|---|---|---|
| stage=dev, version=v1 | helloworld-dev-v1-67b6876778-nf7pz | 192.168.0.5 |
| stage=dev, version=v2 | helloworld-dev-v2-68f65bbc99-v957l | 192.168.0.1 |
| stage=dev, version=v3 | helloworld-dev-v3-7f6978bc56-hqzgg | 192.168.0.252 |
| stage=prod, version=v2 | helloworld-prod-v2-b5745b949-p8rc4 | 192.168.0.103 |
| stage=prod, version=v3 | helloworld-prod-v3-6768bf56f8-6bd6h | 192.168.0.104, 192.168.0.6 |
Buat VirtualService
Terapkan VirtualService berikut untuk memetakan Header HTTP ke kunci subset dinamis. Untuk informasi selengkapnya, lihat Manage virtual services.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: helloworld
namespace: default
spec:
hosts:
- helloworld.default.svc.cluster.local
http:
- headerToDynamicSubsetKey:
- header: x-ip
key: '%ip%'
name: default
route:
- destination:
host: helloworld.default.svc.cluster.local
port:
number: 8000VirtualService ini menetapkan dua pemetaan:
Header
x-versionke kunci pengelompokanversion. Nilai default:v3jika header tidak ada.Header
x-stageke kunci pengelompokanstage. Nilai default:prodjika header tidak ada.
Verifikasi perutean
Kirim permintaan yang menargetkan lingkungan dev, versi v1:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: dev' -H 'x-version: v1' helloworld:8000Output yang diharapkan:
Welcome to helloworld stage: dev, version: v1, ip: 192.168.0.5Permintaan mencapai Pod tempat stage=dev dan version=v1, yang mengonfirmasi bahwa perutean subset dinamis berfungsi dengan benar.
Langkah 3: Konfigurasi kebijakan fallback
Versi v1 tidak tersedia di lingkungan prod. Permintaan yang menargetkan stage=prod, version=v1 tidak cocok dengan subset apa pun:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Untuk menangani subset yang tidak cocok, tetapkan fallbackPolicy di DestinationRule. ASM mendukung tiga kebijakan:
| Kebijakan | Perilaku | Direkomendasikan untuk |
|---|---|---|
NO_FALLBACK | Mengembalikan error no healthy upstream. Ini adalah nilai default. | Perutean ketat di mana permintaan yang salah rute harus gagal secepatnya |
ANY_ENDPOINT | Mengarahkan ke endpoint mana pun yang tersedia di seluruh subset | Pengembangan atau pengujian di mana ketersediaan lebih penting daripada presisi |
DEFAULT_SUBSET (direkomendasikan untuk produksi) | Mengarahkan ke subset default yang telah dikonfigurasi sebelumnya | Workload produksi, di mana permintaan yang tidak cocok harus diarahkan ke versi yang diketahui stabil |
NO_FALLBACK
NO_FALLBACK adalah perilaku default. Permintaan yang tidak cocok dengan subset mana pun akan mengembalikan error. Tetapkan secara eksplisit untuk memperjelas maksud fail-fast.
Terapkan DestinationRule berikut. Untuk informasi selengkapnya, lihat Manage destination rules.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: helloworld
namespace: default
spec:
host: helloworld.default.svc.cluster.local
trafficPolicy:
loadBalancer:
dynamicSubset:
subsetSelectors:
- fallbackPolicy: NO_FALLBACK
keys:
- stage
- versionVerifikasi:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Output yang diharapkan:
no healthy upstreamANY_ENDPOINT
Jika tidak ada subset yang cocok, permintaan diarahkan ke endpoint mana pun yang tersedia tanpa memandang label.
Terapkan DestinationRule berikut. Untuk informasi selengkapnya, lihat Manage destination rules.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: helloworld
namespace: default
spec:
host: helloworld.default.svc.cluster.local
trafficPolicy:
loadBalancer:
dynamicSubset:
subsetSelectors:
- fallbackPolicy: ANY_ENDPOINT
keys:
- stage
- versionVerifikasi dengan mengirim dua permintaan. Tiap permintaan mungkin mendarat di Pod yang berbeda:
# Permintaan pertama
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' helloworld:8000Contoh output:
Welcome to helloworld stage: prod, version: v2, ip: 192.168.0.103# Permintaan kedua -- menargetkan subset yang tidak ada
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Contoh output:
Welcome to helloworld stage: dev, version: v2, ip: 192.168.0.1Karena subset prod/v1 tidak ada, permintaan tersebut menggunakan fallback ke endpoint acak.
DEFAULT_SUBSET
Jika tidak ada subset yang cocok, permintaan diarahkan ke subset yang ditentukan dalam defaultSubset. Ini adalah kebijakan yang direkomendasikan untuk workload produksi karena permintaan yang tidak cocok akan diarahkan ke versi yang diketahui stabil, bukan gagal atau tersebar secara acak.
Terapkan DestinationRule berikut. Dalam contoh ini, defaultSubset mengarah ke stage=prod, version=v3. Untuk informasi selengkapnya, lihat Manage destination rules.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: helloworld
namespace: default
spec:
host: helloworld.default.svc.cluster.local
trafficPolicy:
loadBalancer:
dynamicSubset:
defaultSubset:
stage: prod
version: v3
subsetSelectors:
- fallbackPolicy: DEFAULT_SUBSET
keys:
- stage
- versionVerifikasi dengan mengirim dua permintaan ke subset prod/v1 yang tidak ada:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Output yang diharapkan:
Welcome to helloworld stage: prod, version: v3, ip: 192.168.0.6kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Output yang diharapkan:
Welcome to helloworld stage: prod, version: v3, ip: 192.168.0.104Kedua permintaan mendarat di subset default prod/v3. Dua alamat IP berbeda (192.168.0.6 dan 192.168.0.104) mencerminkan load balancing di antara dua replika prod-v3.
Langkah 4: Arahkan ke Pod tertentu berdasarkan alamat IP
Untuk mengunci permintaan ke Pod individual, gunakan atribut bawaan %ip% sebagai kunci pengelompokan. Setiap Pod menjadi subset anggota tunggalnya sendiri.
Buat DestinationRule
Terapkan DestinationRule berikut untuk mengelompokkan Pod berdasarkan alamat IP. Untuk informasi selengkapnya, lihat Manage destination rules.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: helloworld
namespace: default
spec:
host: helloworld.default.svc.cluster.local
trafficPolicy:
loadBalancer:
dynamicSubset:
defaultSubset:
stage: prod
version: v3
subsetSelectors:
- keys:
- '%ip%'Buat VirtualService
Petakan header x-ip ke kunci %ip% sehingga nilai header menentukan IP Pod target. Untuk informasi selengkapnya, lihat Manage virtual services.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: helloworld
namespace: default
spec:
hosts:
- helloworld.default.svc.cluster.local
http:
- headerToDynamicSubsetKey:
- header: x-ip
key: '%ip%'
name: default
route:
- destination:
host: helloworld.default.svc.cluster.local
port:
number: 8000Verifikasi perutean
Kirim beberapa permintaan yang menargetkan IP Pod 192.168.0.6:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-ip: 192.168.0.6' helloworld:8000Output yang diharapkan (konsisten pada setiap panggilan berulang):
Welcome to helloworld stage: prod, version: v3, ip: 192.168.0.6Setiap permintaan mendarat di Pod yang sama, yang mengonfirmasi penguncian berbasis IP.
Referensi bidang CRD
VirtualService
HTTPRoute
ASM memperluas resource HTTPRoute dengan bidang headerToDynamicSubsetKey.
| Bidang | Tipe | Deskripsi |
|---|---|---|
headerToDynamicSubsetKey | HeaderToMetadataSubsetKey[] | Memetakan header permintaan ke kunci pengelompokan subset dinamis. Tiap elemen menentukan satu pemetaan header-ke-kunci. |
HeaderToMetadataSubsetKey
| Bidang | Tipe | Deskripsi |
|---|---|---|
header | string | Nama header permintaan. |
key | string | Nama kunci pengelompokan subset dinamis. Nilai yang diapit tanda persen (misalnya, %ip%) merujuk ke atribut workload bawaan. |
defaultValue | string | Nilai yang digunakan ketika permintaan tidak membawa header yang ditentukan. Jika diabaikan dan header tidak ada, kunci tersebut tidak diatur dan tidak termasuk dalam pencocokan subset. |
DestinationRule
ASM memperluas struktur trafficPolicy dengan bidang dynamicSubset.
TrafficPolicy
| Bidang | Tipe | Deskripsi |
|---|---|---|
dynamicSubset | DynamicSubsetLB | Mengonfigurasi aturan pengelompokan subset dinamis. |
DynamicSubsetLB
| Bidang | Tipe | Deskripsi |
|---|---|---|
defaultSubset | map[string]string | Subset default yang digunakan ketika fallbackPolicy bernilai DEFAULT_SUBSET dan tidak ada subset yang cocok dengan permintaan. |
subsetSelectors | SubsetSelector[] | Daftar aturan pengelompokan. Tiap elemen menentukan dimensi pengelompokan terpisah. |
fallbackPolicy | DynamicSubsetLB_FallbackPolicy | Kebijakan fallback global ketika tidak ada subset yang cocok. Nilai default adalah NO_FALLBACK. |
SubsetSelector
| Bidang | Tipe | Deskripsi |
|---|---|---|
keys | string[] | Dimensi pengelompokan yang dipetakan ke label workload. Misalnya, version mengelompokkan endpoint berdasarkan label version. Atribut workload bawaan seperti %ip% juga didukung. |
fallbackPolicy | DynamicSubsetLB_FallbackPolicy | Kebijakan fallback untuk aturan pengelompokan spesifik ini. Menggantikan kebijakan yang ditetapkan di DynamicSubsetLB. |
DynamicSubsetLB_FallbackPolicy
| Nilai | Deskripsi |
|---|---|
NO_FALLBACK | Mengembalikan error ketika tidak ada subset yang cocok. Ini adalah nilai default. |
ANY_ENDPOINT | Mengarahkan ke endpoint mana pun dari layanan ketika tidak ada subset yang cocok. |
DEFAULT_SUBSET | Mengarahkan ke subset yang ditentukan dalam defaultSubset ketika tidak ada subset yang cocok. |
Atribut workload bawaan
| Atribut | Tipe | Deskripsi |
|---|---|---|
%ip% | string | Alamat IP Pod tempat workload berjalan. |