Anda dapat menggunakan fitur pemantulan trafik untuk memantulkan trafik produksi ke kluster uji atau versi layanan uji. Pengujian dengan trafik produksi yang dipantulkan mengurangi risiko terkait perubahan versi tanpa memengaruhi lingkungan produksi. Topik ini menjelaskan apa itu pemantulan trafik dan cara menggunakannya di seluruh kluster pada lapisan service mesh.
Apa itu pemantulan trafik?
Arsitektur layanan mikro mempercepat pengembangan dan penyebaran aplikasi, tetapi ada risiko dalam mengubah versi layanan. Service Mesh (ASM) menyediakan fitur pemantulan trafik untuk mengurangi risiko tersebut. Fitur ini, juga disebut pembayangan trafik, mengirimkan trafik produksi ke layanan yang dipantulkan secara real-time. Trafik yang dipantulkan terjadi di luar jalur permintaan kritis untuk layanan produksi. Saat trafik dipantulkan, permintaan yang dikirim ke versi layanan yang dipantulkan memiliki header Host/Authority mereka ditambah dengan -shadow. Ini membedakan antara trafik produksi dan trafik yang dipantulkan. Anda dapat menggunakan fitur ini untuk memantulkan trafik produksi ke kluster uji atau versi layanan uji sebelum kluster atau versi layanan tersebut berjalan di lingkungan produksi, sehingga mengurangi risiko terkait perubahan versi.
Manfaat
Manfaat | Deskripsi |
Penerapan versi yang lebih aman dengan lingkungan uji yang lebih mirip produksi | Anda dapat menyalin trafik produksi ke kluster uji atau versi layanan uji dan melakukan pengujian menggunakan kasus penggunaan dan trafik yang dipantulkan. Hasil pengujian yang lebih akurat mengurangi risiko penerapan di lingkungan produksi. |
Lingkungan produksi tidak terpengaruh |
|
Skenario
Pemantulan trafik memungkinkan Anda menguji layanan yang berjalan di lingkungan produksi tanpa memengaruhi pengguna akhir. Anda dapat melakukan pengujian benchmark untuk dua versi layanan guna menentukan apakah versi baru dapat memproses permintaan arah masuk dengan cara yang sama seperti versi yang ada.
Tabel berikut menjelaskan skenario tipikal di mana Anda dapat menggunakan pemantulan trafik.
Skenario | Deskripsi |
Pemantulan Trafik Produksi untuk Uji Coba dan Simulasi | Anda dapat memantulkan trafik dari kluster produksi ke kluster uji untuk pengujian tanpa memengaruhi jalur permintaan kritis di lingkungan produksi. Misalnya, jika ingin mengganti atau mentransformasikan sistem lama menjadi sistem baru, Anda dapat memantulkan dan mengimpor trafik produksi dari sistem lama ke sistem baru untuk uji coba. Jika ingin melakukan penyesuaian arsitektur eksperimental, Anda juga dapat memantulkan trafik produksi untuk simulasi. |
Verifikasi Versi Baru | Anda dapat membandingkan hasil keluaran trafik produksi dan trafik yang dipantulkan secara real-time. Anda dapat menggunakan trafik yang dipantulkan dalam latihan sebelum merilis layanan baru. Semua trafik produksi dapat dipantulkan. Latihan manual tradisional dilakukan berdasarkan data sampel, yang sulit digunakan untuk memprediksi bagaimana layanan akan merespons trafik produksi. Dengan trafik produksi yang dipantulkan, Anda dapat mensimulasikan semua situasi di lingkungan produksi, seperti karakter khusus yang luar biasa dan token yang menderita serangan jahat. Hal ini membantu Anda memahami kemampuan pemrosesan dan pemecahan masalah layanan yang akan dirilis. |
Isolasi Data Basis Data dari Data Uji | Jika ingin menguji kinerja pemrosesan data, Anda dapat mengimpor data uji ke basis data kosong dan kemudian memantulkan trafik produksi ke basis data uji ini. Ini mengisolasi data uji dari data di basis data produksi. |
Pemecahan Masalah Layanan yang Sedang Berjalan | Ketika masalah tak terduga terjadi pada layanan yang sedang berjalan, sulit mereproduksi masalah tersebut di jaringan lokal. Dalam hal ini, Anda dapat memulai layanan sementara dan memantulkan trafik dari layanan yang sedang berjalan ke layanan sementara untuk debugging. Cara pemecahan masalah ini tidak memengaruhi layanan yang sedang berjalan. |
Pencatatan Perilaku Pengguna | Contoh dan data sangat penting untuk algoritma sistem rekomendasi. Tantangan terbesar dari pengujian otomatis tradisional untuk aplikasi yang bergantung pada algoritma adalah kurangnya data perilaku pengguna dunia nyata. Pemantulan trafik memungkinkan Anda menyimpan data perilaku pengguna dalam log. Data log dapat digunakan dalam pengujian simulasi untuk membangun algoritma sistem rekomendasi. Data ini juga dapat digunakan sebagai sumber data besar untuk analisis profil pengguna. |
Kode contoh untuk menggunakan pemantulan trafik
Contoh file YAML berikut menunjukkan cara menggunakan pemantulan trafik di Istio. Dalam contoh ini, VirtualService mengarahkan semua trafik ke subset v1 dan memantulkan trafik ke subset v1-mirroring. Saat permintaan dikirim ke subset v1, permintaan tersebut disalin dan dikirim ke subset v1-mirroring.
Setelah subset v1-mirroring mengirim permintaan ke versi v1 aplikasi, Anda dapat melihat log aplikasi. Anda dapat melihat bahwa ketika aplikasi dipanggil, respons berasal dari subset v1. Anda juga dapat melihat bahwa permintaan dipantulkan ke subset v1-mirroring.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: myapp-traffic-mirroring
spec:
hosts:
- myapp
http:
- route:
- destination:
host: myapp.default.svc.cluster.local
port:
number: 8000
subset: v1
weight: 100
mirror:
host: myapp.default.svc.cluster.local
port:
number: 8000
subset: v1-mirroringAktifkan pemantulan trafik lintas kluster
Pemantulan trafik pada lapisan service mesh sebagian besar digunakan dalam skenario di mana trafik produksi perlu dipantulkan ke lingkungan yang akan dirilis. Oleh karena itu, pemantulan trafik lintas kluster cukup umum. Dalam contoh ini, Kluster A adalah lingkungan produksi dan Kluster B adalah lingkungan uji. Permintaan dikirim ke Kluster A, dan gateway ingress di Kluster A memantulkan trafik ke Kluster B.
Langkah 1: Terapkan layanan aplikasi contoh di Kluster B
Buat file httpbin.yaml yang berisi konten berikut:
apiVersion: v1 kind: ServiceAccount metadata: name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin service: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin-v1 spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 80 ---Jalankan perintah berikut untuk menerapkan layanan aplikasi
httpbinversi v1:kubectl apply -f httpbin.yaml
Langkah 2: Konfigurasikan aturan routing untuk gateway ingress di Kluster B
Buat file httpbin-gateway.yaml yang berisi konten berikut:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: httpbin spec: hosts: - "*" gateways: - httpbin-gateway http: - match: - uri: prefix: /headers route: - destination: host: httpbin port: number: 8000Jalankan perintah berikut untuk menerapkan aturan routing:
kubectl apply -f httpbin-gateway.yamlJalankan perintah berikut untuk mengakses gateway ingress di Kluster B dan periksa apakah layanan berfungsi sesuai harapan:
curl http://{alamat IP gateway ingress di Kluster B}/headersContoh output:
{ "headers": { "Accept": "*/*", "Host": "47.99.XX.XX", "User-Agent": "curl/7.79.1", "X-Envoy-Attempt-Count": "1", "X-Envoy-External-Address": "120.244.XXX.XXX", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=158e4ef69876550c34d10e3bfbd8d43f5ab481b16ba0e90b4e38a2d53ac****;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account" } }Jika hasil di atas dikembalikan, itu menunjukkan bahwa layanan berfungsi sesuai harapan.
Langkah 3: Konfigurasikan aturan akses eksternal di service mesh Kluster A
Host layanan yang dipantulkan menggunakan nama domain eksternal. Anda perlu membuat entri layanan untuk menentukan metode resolusi DNS dari host tersebut.
Buat file httpbin-cluster-b.yaml yang berisi konten berikut:
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: httpbin-cluster-b spec: hosts: - httpbin.mirror.cluster-b location: MESH_EXTERNAL ports: - number: 80 # Menentukan port gateway ingress di Kluster B. name: http protocol: HTTP resolution: STATIC endpoints: - address: 47.95.XX.XX # Menentukan alamat IP gateway ingress di Kluster B.Jalankan perintah berikut untuk membuat entri layanan:
kubectl apply -f httpbin-cluster-b.yamlBuat file httpbin-gateway.yaml yang berisi konten berikut:
Konfigurasi YAML mengarahkan semua trafik ke versi v1 layanan
httpbindi Kluster A, dan memantulkan trafik ke layanan httpbin di Kluster B.httpbin.mirror.cluster-badalah alamat yang digunakan untuk mengakses layanan eksternal.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: httpbin spec: gateways: - httpbin-gateway hosts: - '*' http: - match: - uri: prefix: /headers mirror: host: httpbin.mirror.cluster-b port: number: 80 mirrorPercentage: value: 50 route: - destination: host: httpbin port: number: 8000 subset: v1Catatan: Trafik yang ditujukan untuk httpbin.mirror.cluster-b sama dengan trafik yang ditujukan untuk tujuan aslinya. Satu-satunya perbedaan adalah bahwa header Host/Authority diberi akhiran
-shadow. Dalam konfigurasi YAML di atas, header Host/Authority dari trafik yang dipantulkan bukanlahhttpbin.mirror.cluster-b, tetapi header permintaan asli dengan akhiran-shadow. Bidang host di bagian mirror hanya digunakan untuk menemukan alamat tujuan ke mana trafik diteruskan dan tidak mengubah header Host asli.Jalankan perintah berikut untuk menerapkan aturan routing:
kubectl apply -f httpbin-gateway.yamlLihat config dump Envoy dari pod gateway ingress di Kluster A.
"routes": [ { "match": { "prefix": "/headers", "case_sensitive": true }, "route": { "cluster": "outbound|8000|v1|httpbin.default.svc.cluster.local", "timeout": "0s", "retry_policy": { "retry_on": "connect-failure,refused-stream,unavailable,cancelled,retriable-status-codes", "num_retries": 2, "retry_host_predicate": [ { "name": "envoy.retry_host_predicates.previous_hosts", "typed_config": { "@type": "type.googleapis.com/envoy.extensions.retry.host.previous_hosts.v3.PreviousHostsPredicate" } } ], "host_selection_retry_max_attempts": "5", "retriable_status_codes": [ 503 ] }, "request_mirror_policies": [ { "cluster": "outbound|80||httpbin.mirror.cluster-b", "runtime_fraction": { "default_value": { "numerator": 500000, "denominator": "MILLION" } }, "trace_sampled": false } ],Dalam kode contoh di atas, bidang
request_mirror_policiesmenentukan kebijakan untuk pemantulan trafik permintaan, bidangclustermenentukan layanan ke mana trafik yang dipantulkan dikirim, dan bidangruntime_fractionmenentukan rasio trafik yang akan dipantulkan. Bidangnumeratordiatur ke 500000 dan bidangdenominatorke MILLION, yang menunjukkan 50%.