Anda dapat menggunakan pemuatan seimbang subset dinamis untuk mengimplementasikan manajemen granular dan pengalihan lalu lintas yang fleksibel untuk beban kerja layanan mikro. Dalam skenario di mana beberapa aplikasi dan versi dirilis, Service Mesh (ASM) secara otomatis membagi beban kerja menjadi subset dinamis berdasarkan karakteristik aplikasi. Personel O&M tidak perlu melakukan konfigurasi manual. ASM juga dapat mencocokkan header spesifik dari permintaan dengan karakteristik subset untuk mengimplementasikan pengalihan permintaan yang lebih fleksibel.
Prasyarat
Sebuah kluster Container Service for Kubernetes (ACK) ditambahkan ke instance ASM versi 1.18 atau lebih baru. Untuk informasi lebih lanjut, lihat Tambahkan kluster ke instance ASM.
Deskripsi fitur
ASM memungkinkan Anda menggunakan aturan tujuan untuk membagi beban kerja layanan menjadi subset berbeda menggunakan tag, menggunakan layanan virtual untuk mendeklarasikan aturan pengalihan, dan mengarahkan lalu lintas ke subset tertentu. Metode pengelompokan statis dan pengalihan statis ini relatif sederhana dan dapat memenuhi kebutuhan dalam sebagian besar situasi. Namun, dalam beberapa skenario, metode ini mungkin tidak cukup nyaman. Misalnya, dalam skenario di mana beban kerja dibagi menjadi subset berbeda berdasarkan versi, versi tersebut mungkin terus berkembang. Ini mengharuskan personel O&M menambahkan atau menghapus konfigurasi subset yang sesuai dalam aturan tujuan ketika versi terbaru dirilis atau versi sebelumnya dihentikan. Dalam skenario di mana banyak aplikasi dan versi sering dirilis, memperbarui konfigurasi subset menjadi beban berat bagi personel O&M.
Untuk meningkatkan pengalaman pengguna, ASM mendukung pemuatan seimbang subset dinamis sejak versi 1.18. Anda dapat menentukan dimensi, seperti versi, untuk secara dinamis membagi beban kerja dengan nilai yang sama dalam dimensi yang ditentukan ke subset dinamis yang sama. Jika subnet dinamis digunakan dalam skenario di atas, personel O&M tidak perlu mengonfigurasi subset secara manual untuk setiap versi baru. Saat Anda menerapkan beban kerja, ASM secara otomatis mengklasifikasikan beban kerja ke dalam subset dinamis berdasarkan karakteristik aplikasi. Selain itu, ASM memungkinkan Anda mengonfigurasi header spesifik dalam permintaan untuk mencocokkan karakteristik subset dan mengarahkan permintaan ke subset dinamis tertentu berdasarkan header yang dibawa dalam permintaan.
Langkah 1: Menyebarkan aplikasi
Dalam contoh ini, aplikasi hashicorp/http-echo digunakan, dan dua lingkungan, dev dan prod, diterapkan untuk mensimulasikan lingkungan pengembangan dan produksi masing-masing. Versi v1, v2, dan v3 diterapkan di lingkungan dev, dan hanya versi v2 dan v3 yang diterapkan di lingkungan prod. Setiap aplikasi helloworld mendengarkan port 5678 dan membalas dengan lingkungan dan versinya sendiri saat menerima permintaan. Layanan helloworld diterapkan untuk mengekspos port 8000. Selain itu, layanan helloworld dikaitkan dengan beban kerja yang nilainya tag app adalah helloworld. 
Gunakan kubectl untuk terhubung ke kluster ACK berdasarkan informasi dalam file kubeconfig. Kemudian, gunakan kode YAML berikut untuk menyebarkan versi v1, v2, dan v3 aplikasi helloworld di lingkungan dev, versi v2 dan v3 aplikasi helloworld di lingkungan prod, layanan helloworld, dan aplikasi sleep yang digunakan untuk memulai pengujian. Untuk informasi lebih lanjut tentang cara menyebarkan aplikasi, lihat Menyebarkan aplikasi di kluster ACK yang ditambahkan ke instance ASM.
Langkah 2: Mengakses versi tertentu di lingkungan tertentu
Buat aturan tujuan dan layanan virtual.
Gunakan konten berikut untuk membuat aturan tujuan untuk layanan helloworld. Untuk informasi lebih lanjut, lihat Kelola Aturan Tujuan.
Setelah aplikasi helloworld diterapkan, permintaan yang mengakses layanan helloworld dialokasikan ke pod apa pun dari aplikasi helloworld oleh fitur load balancing Kubernetes secara default. Dalam contoh ini, dua lingkungan dan beberapa versi diterapkan untuk aplikasi helloworld: versi v1, v2, dan v3 di lingkungan dev dan versi v2 dan v3 di lingkungan prod. Untuk mengakses lingkungan dan versi tertentu, Anda harus mengonfigurasi aturan tujuan untuk layanan helloworld.
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: helloworld namespace: default spec: host: helloworld.default.svc.cluster.local trafficPolicy: loadBalancer: dynamicSubset: subsetSelectors: - keys: - stage - versionAturan tujuan di atas mengelompokkan beban kerja layanan helloworld berdasarkan tag stage dan version. Dalam contoh ini, beban kerja yang diterapkan dibagi menjadi subset berikut oleh aturan ini.
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
helloworld-prod-v3-6768bf56f8-6bd6h
192.168.0.6
Gunakan konten berikut untuk membuat layanan virtual untuk layanan helloworld dan buat pemetaan antara permintaan dan subnet dinamis yang ditentukan oleh nilai
key. Untuk informasi lebih lanjut, lihat Kelola Layanan Virtual.Layanan virtual di atas menentukan operasi berikut:
Memetakan header bernama
x-versiondalam permintaan ke kunci subnet bernamaversion. Jika permintaan tidak membawa header bernamax-version, nilai defaultv3digunakan.Memetakan header bernama
x-stagedalam permintaan ke kunci subset bernamastage. Jika permintaan tidak membawa header bernamax-stage, nilai defaultproddigunakan.
Gunakan kubectl untuk terhubung ke kluster ACK berdasarkan informasi dalam file kubeconfig. Kemudian, jalankan perintah berikut untuk mengaktifkan aplikasi sleep mengakses versi v1 aplikasi helloworld di lingkungan dev.
Untuk informasi lebih lanjut tentang cara menggunakan kubectl untuk mengelola kluster, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: dev' -H 'x-version: v1' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: dev, versi: v1, ip: 192.168.0.5Keluaran menunjukkan bahwa permintaan diarahkan ke pod yang
stage-nya adalahdevdanversion-nya adalahv1sesuai harapan.
Langkah 3: Konfigurasikan kebijakan fallback untuk subnet
Versi v1 tidak diterapkan di lingkungan prod. Jika Anda mencoba mengakses versi v1 di lingkungan prod, kesalahan dilaporkan karena subnet tidak ada.
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000
Keluaran yang diharapkan:
no healthy upstream # Kesalahan dilaporkan karena subnet tidak ada.Untuk menghindari kegagalan akses ketika subnet tidak ada, Anda dapat mengonfigurasi kebijakan fallback untuk aturan pengelompokan dinamis. Bagian berikut menjelaskan tiga kebijakan fallback yang didukung oleh pengelompokan dinamis ASM: NO_FALLBACK, ANY_ENDPOINT, dan DEFAULT_SUBSET.
NO_FALLBACK
Ketika kebijakan fallback ini berlaku untuk aturan pengelompokan dinamis, kesalahan no healthy upstream dilaporkan untuk permintaan jika tidak ada subnet yang cocok.
Gunakan aturan tujuan berikut untuk mengatur
fallbackPolicykeNO_FALLBACKuntuk aturan pengelompokan yang ditentukan olehstagedanversion. Untuk informasi lebih lanjut, lihat Kelola Aturan Tujuan.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 - versionJalankan perintah berikut untuk mengakses aplikasi helloworld yang
stage-nya adalahproddanversion-nya adalahv1:kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Keluaran yang Diharapkan:
no healthy upstream # Kesalahan dilaporkan karena subnet tidak ada.
ANY_ENDPOINT
Ketika kebijakan fallback ini berlaku untuk aturan pengelompokan dinamis, permintaan akan diarahkan ke endpoint apa pun dari layanan jika tidak ada subnet yang cocok.
Gunakan aturan tujuan berikut untuk mengatur
fallbackPolicykeANY_ENDPOINTuntuk aturan pengelompokan yang ditentukan olehstagedanversion. Untuk informasi lebih lanjut, lihat Kelola Aturan Tujuan.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 - versionJalankan perintah berikut untuk mengakses aplikasi helloworld yang
stage-nya adalahproddanversion-nya adalahv1.Akses Pertama:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: prod, versi: v2, ip: 192.168.0.103 # Akses pertama diarahkan ke aplikasi helloworld versi v2 di lingkungan prod.Akses Kedua:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: dev, versi: v2, ip: 192.168.0.1 # Akses kedua diarahkan ke aplikasi helloworld versi v2 di lingkungan dev.Keluaran menunjukkan bahwa permintaan diarahkan ke pod acak dari layanan helloworld.
DEFAULT_SUBSET
Ketika kebijakan fallback ini berlaku untuk aturan pengelompokan dinamis, permintaan akan diarahkan ke subnet yang cocok dengan nilai keys yang ditentukan dalam bidang defaultSubset jika tidak ada subnet yang cocok.
Gunakan aturan tujuan berikut untuk mengatur
fallbackPolicykeDEFAULT_SUBSETuntuk aturan pengelompokan yang ditentukan olehstagedanversion, dan konfigurasikankeysdan nilai dalam bidangdefaultSubset. Untuk informasi lebih lanjut, lihat Kelola Aturan Tujuan.key
value
stage
prod
version
v3
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 - versionJalankan perintah berikut untuk mengakses subnet yang
stage-nya adalahproddanversion-nya adalahv1.Akses Pertama:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: prod, versi: v3, ip: 192.168.0.6Akses Kedua:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-stage: prod' -H 'x-version: v1' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: prod, versi: v3, ip: 192.168.0.104Keluaran Sesuai Harapan: Tidak ada subnet yang cocok. Oleh karena itu, fallback dipicu, dan permintaan diarahkan ke subnet yang
stage-nya adalahproddanversion-nya adalahv3.
Langkah 4: Mengakses pod tertentu
Jika Anda ingin mengakses pod tertentu, Anda dapat membagi pod menjadi subnet independen dengan menyetel keys pengelompokan dinamis ASM ke %ip%.
Gunakan aturan tujuan berikut untuk membuat aturan pengelompokan yang mengelompokkan pod berdasarkan alamat IP. Untuk informasi lebih lanjut, lihat Kelola Aturan Tujuan.
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%'Gunakan layanan virtual berikut untuk memetakan header
x-ipdari permintaan ke subset yang ditentukan oleh%ip%, sehingga permintaan dapat mengakses pod yang alamat IP-nya ditentukan olehx-ip. Untuk informasi lebih lanjut, lihat Kelola Layanan Virtual.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: 8000Jalankan perintah berikut untuk mengakses Pod helloworld-prod-v3-6768bf56f8-6bd6h yang alamat IP-nya adalah
192.168.0.6. Lakukan operasi akses beberapa kali.Akses Pertama:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-ip: 192.168.0.6' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: prod, versi: v3, ip: 192.168.0.6Akses Kedua:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-ip: 192.168.0.6' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: prod, versi: v3, ip: 192.168.0.6Akses Ketiga:
kubectl exec -it deploy/sleep -c sleep -- curl -H 'x-ip: 192.168.0.6' helloworld:8000Keluaran yang Diharapkan:
Selamat datang di helloworld stage: prod, versi: v3, ip: 192.168.0.6Keluaran menunjukkan bahwa permintaan diarahkan ke pod dengan alamat IP yang ditentukan
192.168.0.6, yang sesuai harapan.
Deskripsi bidang CRD
VirtualService
HTTPRoute
Bidang headerToDynamicSubsetKey ditambahkan ke sumber daya HTTPRoute untuk ASM.
Bidang
Tipe
Deskripsi
headerToDynamicSubsetKey
Digunakan untuk mengonfigurasi pemetaan header permintaan ke kunci subset dinamis. Setiap elemen dalam array memetakan header ke kunci.
HeaderToMetadataSubsetKey
HeaderToMetadataSubsetKey menentukan pemetaan dari header permintaan ke kunci subset dinamis dan nilai default yang digunakan jika permintaan tidak membawa header yang ditentukan.
Bidang
Tipe
Deskripsi
header
string
Nama header permintaan.
key
string
Nama kunci subset dinamis. Bagian yang diapit oleh tanda persen (%) mendefinisikan atribut bawaan dari beban kerja.
defaultValue
string
Nilai default ini digunakan jika permintaan tidak membawa header yang dipetakan ke kunci. Jika Anda tidak menentukan nilai default dan permintaan tidak membawa header yang dipetakan ke kunci, sistem menganggap bahwa header tersebut hilang dan tidak melakukan pencocokan dari sudut pandang header.
DestinationRule
Dalam ASM, bidang dynamicSubset ditambahkan ke struktur trafficPolicy.
TrafficPolicy
Bidang
Tipe
Deskripsi
dynamicSubset
Digunakan untuk mengonfigurasi aturan pengelompokan dinamis.
DynamicSubsetLB
Bidang
Tipe
Deskripsi
defaultSubset
map[string]string
Digunakan untuk mengonfigurasi subset default. Ketika permintaan tidak cocok dengan subset dinamis apa pun dan kebijakan fallback adalah DEFAULT_SUBSET, subset yang dideklarasikan oleh bidang ini dipilih.
subsetSelectors
Digunakan untuk mengonfigurasi aturan pengelompokan dinamis. Setiap elemen dalam array menunjukkan aturan pengelompokan terpisah.
fallbackPolicy
Menentukan kebijakan fallback yang digunakan ketika subset dinamis tidak cocok. Jika Anda tidak menentukan bidang ini, nilai defaultnya adalah NO_FALLBACK.
SubsetSelector
Bidang
Tipe
Deskripsi
keys
string[]
Daftar dimensi pengelompokan. Nilai-nilainya dipetakan ke tag beban kerja. Misalnya, nilai version menunjukkan bahwa tag bernama version dari beban kerja digunakan sebagai dimensi pengelompokan. Selain tag, atribut bawaan dari beban kerja juga dapat digunakan sebagai dimensi. Untuk informasi lebih lanjut, lihat Atribut bawaan beban kerja.
fallbackPolicy
Menentukan kebijakan fallback yang digunakan ketika tidak ada subset dinamis yang cocok. Jika bidang ini tidak ditentukan, kebijakan fallback yang ditentukan dalam DynamicSubsetLB digunakan.
DynamicSubsetLB_FallbackPolicy
DynamicSubsetLB_FallbackPolicy menentukan nilai enumerasi dari kebijakan fallback untuk pemuatan seimbang subset dinamis. Tabel berikut menjelaskan nilai yang didukung.
Nilai
Deskripsi
NO_FALLBACK
Tidak ada fallback yang dilakukan.
ANY_ENDPOINT
Permintaan akan diarahkan ke endpoint apa pun dari layanan jika tidak ada subnet yang cocok.
DEFAULT_SUBSET
Permintaan akan diarahkan ke subset default jika tidak ada subnet yang cocok.
Atribut bawaan beban kerja
Atribut | Tipe | Deskripsi |
%ip% | string | Alamat IP pod tempat beban kerja berjalan. |
Referensi
Anda dapat mengaktifkan pengumpulan log control-plane dan peringatan berbasis log untuk mendeteksi dan menyelesaikan risiko potensial secara tepat waktu. Untuk informasi lebih lanjut, lihat Aktifkan Pengumpulan Log Control-Plane dan Peringatan Berbasis Log.
Anda dapat menginstal alat diagnostik asmctl untuk mendeteksi masalah konfigurasi potensial di ASM. Untuk informasi lebih lanjut, lihat Instal dan Gunakan asmctl.
Anda dapat menambahkan peringatan audit untuk perubahan pada sumber daya ASM, seperti layanan virtual dan aturan tujuan. Dengan cara ini, peringatan dikirim ke kontak peringatan secara tepat waktu ketika sumber daya penting berubah. Untuk informasi lebih lanjut, lihat Konfigurasikan Peringatan Audit untuk Operasi pada Sumber Daya ASM.
Anda dapat mengonfigurasi aturan manajemen lalu lintas, seperti layanan virtual dan aturan tujuan, untuk mengisolasi versi aplikasi atau aplikasi dengan karakteristik tertentu ke lingkungan runtime independen, yang dikenal sebagai jalur lalu lintas. Selain itu, Anda dapat mengonfigurasi pergeseran lalu lintas, yang mengarahkan lalu lintas ke versi baseline atau aplikasi dengan karakteristik tertentu ketika versi tujuan atau aplikasi tidak tersedia. Untuk informasi lebih lanjut, lihat Gunakan Aturan Lalu Lintas untuk Mengonfigurasi Jalur Lalu Lintas dan Pergeseran Lalu Lintas.
Jika Anda ingin mendapatkan latensi panggilan layanan terendah, Anda dapat menggunakan fitur pengalihan zona sadar untuk memungkinkan klien memanggil layanan tujuan yang diterapkan di zona yang sama terlebih dahulu. Untuk informasi lebih lanjut, lihat Verifikasi Fitur Pengalihan Zona Sadar pada Topologi Instance ASM.