All Products
Search
Document Center

Alibaba Cloud Service Mesh:Gunakan LoadRampingPolicy untuk melaksanakan peluncuran layanan progresif

Last Updated:Jul 02, 2025

Suite penjadwalan lalu lintas Service Mesh (ASM) mendukung kebijakan peluncuran layanan progresif. Saat meluncurkan layanan baru, Anda dapat mengonfigurasi kebijakan ini untuk secara bertahap meningkatkan lalu lintas yang diterima oleh layanan tersebut, memastikan kelancaran proses peluncuran. Topik ini menjelaskan cara menggunakan LoadRampingPolicy dari suite manajemen lalu lintas untuk melaksanakan peluncuran layanan progresif.

Informasi Latar Belakang

LoadRampingPolicy mendefinisikan kebijakan peluncuran layanan progresif dengan memungkinkan peningkatan bertahap permintaan yang diterima oleh layanan. Kebijakan ini bekerja menggunakan komponen berikut:

  • Pengambil sampel permintaan: Menolak persentase tertentu dari permintaan pada tahap awal peluncuran layanan.

  • Pengukur beban: Memantau beban layanan dalam rentang ambang batas tertentu. Ketika beban stabil, pengambil sampel permintaan secara bertahap mengurangi persentase permintaan yang ditolak hingga hampir semua permintaan diterima.

Dengan LoadRampingPolicy, Anda dapat mencegah kesalahan layanan akibat lonjakan lalu lintas saat meluncurkan layanan baru di kluster. Kebijakan ini juga memeriksa beban layanan secara real-time untuk memastikan peningkatan bertahap lalu lintas yang diterima, sehingga memfasilitasi peluncuran layanan yang lancar.

Prasyarat

Langkah 1: Buat LoadRampingPolicy

  1. Gunakan kubectl untuk terhubung ke instance ASM. Untuk informasi lebih lanjut, lihat Gunakan kubectl pada bidang kontrol untuk mengakses sumber daya Istio.

  2. Buat file LoadRampingPolicy.yaml dengan konten berikut:

    apiVersion: istio.alibabacloud.com/v1
    kind: LoadRampingPolicy
    metadata:
      name: load-ramping
      namespace: istio-system
    spec:
      drivers:
        average_latency_drivers:
          - selectors:
              - service: httpbin.default.svc.cluster.local
            criteria:
              forward:
                threshold: 100
              reset:
                threshold: 200
      start: true
      load_ramp:
        sampler:
          selectors:
            - service: httpbin.default.svc.cluster.local
        steps:
          - duration: 0s
            target_accept_percentage: 1
          - duration: 300s
            target_accept_percentage: 100.0

    Tabel berikut menjelaskan beberapa bidang. Untuk informasi lebih lanjut tentang bidang terkait, lihat Deskripsi bidang LoadRampingPolicy.

    Bidang

    Deskripsi

    langkah-langkah

    Definisi fase peluncuran. Dalam contoh ini, dua fase peluncuran didefinisikan. Definisi ini mengharuskan persentase permintaan yang diterima oleh pengambil sampel permintaan dalam 300 detik mendekati 100%.

    pemilih

    Layanan tempat kebijakan peluncuran progresif diterapkan. Dalam contoh ini, httpbin.default.svc.cluster.local digunakan. Ini menunjukkan bahwa peluncuran progresif dilakukan pada layanan httpbin.default.svc.cluster.local.

    kriteria

    Menentukan tolok ukur pengukuran beban layanan. Dalam contoh ini, bidang kriteria mendefinisikan konten berikut: (1) Ketika latensi rata-rata layanan kurang dari 100 ms, peluncuran layanan berlanjut. (2) Ketika latensi rata-rata layanan lebih dari 200 ms, peluncuran layanan diatur ulang dan pengambil sampel permintaan menolak permintaan pada persentase penolakan maksimum.

  3. Jalankan perintah berikut untuk mengonfigurasi kebijakan peluncuran layanan progresif:

    kubectl apply -f LoadRampingPolicy.yaml

Langkah 2: Verifikasi apakah LoadRampingPolicy berlaku

Dalam contoh ini, alat uji stres Fortio digunakan. Untuk informasi lebih lanjut, lihat bagian Instalasi Fortio di situs web GitHub.

  1. Jalankan perintah berikut untuk melakukan uji stres pada aplikasi HTTPBin:

    fortio load -c 10 -qps 0 -t 300s -allow-initial-errors -a http://${IP address of the ASM ingress gateway}/status/200
    Catatan

    Ganti ${IP address of the ASM ingress gateway} dalam perintah sebelumnya dengan alamat IP gateway masuk ASM Anda. Untuk informasi lebih lanjut tentang cara mendapatkan alamat IP gateway masuk ASM, lihat sublangkah 1 dari Langkah 3 dalam topik Gunakan sumber daya Istio untuk merutekan lalu lintas ke versi layanan yang berbeda.

    Output yang diharapkan:

    ...
    # target 50% 0.0613214
    # target 75% 0.0685102
    # target 90% 0.0756739
    # target 99% 0.0870132
    # target 99.9% 0.115361
    Sockets used: 31529 (for perfect keepalive, would be 10)
    Uniform: false, Jitter: false
    Code 200 : 26718 (45.9 %)
    Code 403 : 31510 (54.1 %)
    Response Header Sizes : count 58228 avg 111.04245 +/- 120.6 min 0 max 243 sum 6465780
    Response Body/Total Sizes : count 58228 avg 185.18012 +/- 52.32 min 137 max 243 sum 10782668
    All done 58228 calls (plus 10 warmup) 51.524 ms avg, 194.1 qps

    Output menunjukkan bahwa latensi rata-rata permintaan adalah 51 ms, yang berada dalam rentang yang diizinkan. Kode status 403 dikembalikan untuk sekitar setengah dari permintaan. Selama 300 detik pengujian, persentase permintaan yang diterima oleh layanan meningkat dari 1% menjadi 100%.

  2. Jalankan perintah berikut untuk melakukan uji stres pada aplikasi HTTPBin lagi:

    fortio load -c 10 -qps 0 -t 300s -allow-initial-errors -a http://${IP address of the ASM ingress gateway}/status/200

    Output yang diharapkan:

    ...
    # target 50% 0.0337055
    # target 75% 0.0368905
    # target 90% 0.0396488
    # target 99% 0.0791
    # target 99.9% 0.123187
    Sockets used: 455 (for perfect keepalive, would be 10)
    Uniform: false, Jitter: false
    Code 200 : 82959 (99.5 %)
    Code 403 : 445 (0.5 %)
    Response Header Sizes : count 83404 avg 240.71018 +/- 17.63 min 0 max 243 sum 20076192
    Response Body/Total Sizes : count 83404 avg 241.44115 +/- 7.649 min 137 max 243 sum 20137158
    All done 83404 calls (plus 10 warmup) 35.970 ms avg, 278.0 qps

    Output menunjukkan bahwa hanya 0,5% permintaan yang ditolak, dan persentase permintaan yang diterima mencapai 99,5%. Ini menunjukkan bahwa peluncuran layanan progresif telah selesai.

  3. Hapus LoadRampingPolicy.

    1. Gunakan kubectl untuk terhubung ke instance ASM. Untuk informasi lebih lanjut, lihat Gunakan kubectl pada bidang kontrol untuk mengakses sumber daya Istio.

    2. Jalankan perintah berikut untuk menghapus LoadRampingPolicy setelah layanan diluncurkan:

    kubectl delete loadrampingpolicy load-ramping -n istio-system
    Penting

    Dalam contoh ini, LoadRampingPolicy mensimulasikan peluncuran progresif layanan selama 300 detik. Karena Anda mengatur bagian criteria.reset.threshold, setelah memverifikasi hasil kebijakan peluncuran layanan progresif, Anda harus secara manual menghapus LoadRampingPolicy untuk mencegah peluncuran progresif dipicu lagi karena fluktuasi latensi layanan, memastikan layanan berfungsi sesuai harapan.

Referensi

Anda dapat memverifikasi apakah LoadRampingPolicy berlaku pada Grafana. Pastikan instance Prometheus untuk Grafana telah dikonfigurasi dengan suite penjadwalan lalu lintas ASM.

Impor konten berikut ke Grafana untuk membuat dasbor untuk LoadRampingPolicy.

Klik untuk melihat detail

{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": {
          "type": "grafana",
          "uid": "-- Grafana --"
        },
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "fiscalYearStartMonth": 0,
  "graphTooltip": 0,
  "id": 43,
  "links": [],
  "liveNow": false,
  "panels": [
    {
      "datasource": {
        "type": "prometheus",
        "uid": "${datasource}"
      },
      "description": "",
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "drawStyle": "line",
            "fillOpacity": 10,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green",
                "value": null
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": ""
        },
        "overrides": []
      },
      "gridPos": {
        "h": 10,
        "w": 24,
        "x": 0,
        "y": 0
      },
      "id": 1,
      "interval": "10s",
      "options": {
        "legend": {
          "calcs": [],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "v10.1.0",
      "targets": [
        {
          "datasource": {
            "type": "prometheus",
            "uid": "${datasource}"
          },
          "editorMode": "code",
          "expr": "(sum by (policy_name)(rate(sampler_counter_total{decision_type=\"DECISION_TYPE_ACCEPTED\"}[30s])) / sum by (policy_name)(rate(sampler_counter_total{}[30s]))) * 100",
          "intervalFactor": 1,
          "legendFormat": "policy_name={{policy_name}}",
          "range": true,
          "refId": "A"
        }
      ],
      "title": "PERSENTASE DITERIMA",
      "type": "timeseries"
    },
    {
      "datasource": {
        "type": "prometheus",
        "uid": "${datasource}"
      },
      "description": "",
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "palette-classic"
          },
          "custom": {
            "axisCenteredZero": false,
            "axisColorMode": "text",
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "drawStyle": "line",
            "fillOpacity": 10,
            "gradientMode": "none",
            "hideFrom": {
              "legend": false,
              "tooltip": false,
              "viz": false
            },
            "lineInterpolation": "linear",
            "lineWidth": 1,
            "pointSize": 5,
            "scaleDistribution": {
              "type": "linear"
            },
            "showPoints": "auto",
            "spanNulls": false,
            "stacking": {
              "group": "A",
              "mode": "none"
            },
            "thresholdsStyle": {
              "mode": "off"
            }
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green",
                "value": null
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          },
          "unit": ""
        },
        "overrides": []
      },
      "gridPos": {
        "h": 10,
        "w": 24,
        "x": 0,
        "y": 10
      },
      "id": 2,
      "interval": "10s",
      "options": {
        "legend": {
          "calcs": [],
          "displayMode": "list",
          "placement": "bottom",
          "showLegend": true
        },
        "tooltip": {
          "mode": "single",
          "sort": "none"
        }
      },
      "pluginVersion": "v10.1.0",
      "targets": [
        {
          "datasource": {
            "type": "prometheus",
            "uid": "${datasource}"
          },
          "editorMode": "code",
          "expr": "sum by (policy_name)(rate(sampler_counter_total{component_id=\"root.14.1\"}[$__rate_interval])) by (decision_type)",
          "intervalFactor": 1,
          "range": true,
          "refId": "A"
        }
      ],
      "title": "Throughput - Terima/Tolak",
      "type": "timeseries"
    }
  ],
  "refresh": false,
  "schemaVersion": 38,
  "style": "dark",
  "tags": [],
  "templating": {
    "list": [
      {
        "hide": 0,
        "includeAll": false,
        "label": "Sumber Data",
        "multi": false,
        "name": "datasource",
        "options": [],
        "query": "prometheus",
        "refresh": 1,
        "regex": "",
        "skipUrlSync": false,
        "type": "datasource"
      }
    ]
  },
  "time": {
    "from": "now-5m",
    "to": "now"
  },
  "timepicker": {},
  "timezone": "browser",
  "title": "Ringkasan Kebijakan - load-ramping",
  "version": 3,
  "weekStart": ""
}

Dasbor adalah sebagai berikut.

image