全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan pemantulan trafik lintas kluster pada lapisan service mesh

更新时间:Jun 28, 2025

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

  • Trafik yang dipantulkan terjadi di luar jalur permintaan kritis untuk layanan produksi. Masalah apa pun yang disebabkan oleh trafik yang dipantulkan tidak memengaruhi lingkungan produksi.

  • Permintaan dipantulkan sebagai "fire and forget", yang berarti bahwa responsnya dibuang.

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-mirroring

Aktifkan 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

  1. 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
    ---
  2. Jalankan perintah berikut untuk menerapkan layanan aplikasi httpbin versi v1:

    kubectl apply -f httpbin.yaml

Langkah 2: Konfigurasikan aturan routing untuk gateway ingress di Kluster B

  1. 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: 8000
  2. Jalankan perintah berikut untuk menerapkan aturan routing:

    kubectl apply -f httpbin-gateway.yaml
  3. Jalankan 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}/headers

    Contoh 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.

  1. 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.
  2. Jalankan perintah berikut untuk membuat entri layanan:

    kubectl apply -f httpbin-cluster-b.yaml
  3. Buat file httpbin-gateway.yaml yang berisi konten berikut:

    Konfigurasi YAML mengarahkan semua trafik ke versi v1 layanan httpbin di Kluster A, dan memantulkan trafik ke layanan httpbin di Kluster B. httpbin.mirror.cluster-b adalah 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: v1

    Catatan: 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 bukanlah httpbin.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.

  4. Jalankan perintah berikut untuk menerapkan aturan routing:

    kubectl apply -f httpbin-gateway.yaml
  5. Lihat 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_policies menentukan kebijakan untuk pemantulan trafik permintaan, bidang cluster menentukan layanan ke mana trafik yang dipantulkan dikirim, dan bidang runtime_fraction menentukan rasio trafik yang akan dipantulkan. Bidang numerator diatur ke 500000 dan bidang denominator ke MILLION, yang menunjukkan 50%.