All Products
Search
Document Center

Alibaba Cloud Service Mesh:Aktifkan fitur perutean berbasis zona

Last Updated:Mar 20, 2026

Jika Anda mengalami masalah seperti waktu respons layanan yang meningkat atau biaya tambahan akibat latensi jaringan antar zona, Anda dapat menggunakan fitur perutean berbasis zona. Fitur ini memastikan bahwa permintaan layanan diproses terlebih dahulu di zona yang sama, mengurangi latensi transmisi jaringan, menurunkan biaya tambahan dari lalu lintas antar zona, serta meningkatkan efisiensi dan stabilitas keseluruhan layanan. Service Mesh (ASM) memungkinkan Anda menggunakan fitur ini tanpa perlu memodifikasi kode aplikasi. Topik ini menjelaskan cara mengaktifkan fitur ini. Dalam contoh berikut, gateway ingress digunakan untuk mengakses aplikasi HTTPBin.

Prasyarat

  • Cluster telah ditambahkan ke instance ASM.

  • Node dalam cluster Container Service for Kubernetes (ACK) berada di setidaknya dua zona. Dalam topik ini, zona cn-hongkong-b dan cn-hongkong-c digunakan. Anda dapat melihat wilayah dan zona tempat instance Elastic Compute Service (ECS) yang sesuai dengan node cluster berada di Container Service Management Console. Untuk informasi lebih lanjut, lihat Wilayah dan Zona.

    Catatan

    Dalam contoh ini, aplikasi sleep dan helloworld-v1 diterapkan di cn-hongkong-b, sedangkan aplikasi helloworld-v2 diterapkan di cn-hongkong-c. Gunakan zona tempat aplikasi Anda berada.

Catatan penggunaan

Setelah fitur perutean berbasis zona diaktifkan, permintaan dari aplikasi akan dirutekan terlebih dahulu ke aplikasi lain di zona yang sama jika memungkinkan. Untuk memastikan penyeimbangan beban, pastikan beban kerja didistribusikan secara merata di berbagai zona. Anda dapat mengonfigurasi topologySpreadConstraints untuk menyebarkan beban kerja di seluruh zona menggunakan penjadwal. Selain itu, untuk mengecilkan atau memperbesar beban kerja, aktifkan DeScheduling agar beban kerja tetap didistribusikan secara merata selama pengecilan.

Informasi latar belakang

Ketika klien memulai permintaan untuk mengakses layanan, permintaan tersebut diprioritaskan untuk dirutekan ke layanan pada node yang sama atau di zona yang sama dengan klien berdasarkan informasi topologi tentang wilayah dan zona tempat klien berada. Beginilah cara kerja fitur perutean berbasis zona. Perutean berbasis zona adalah fitur penyeimbangan beban yang membuat aliran lalu lintas tetap berada di zona yang sama untuk mengurangi latensi layanan.

Langkah 1: Terapkan aplikasi sampel

  1. Buat file sleep.yaml dengan konten berikut:

    Catatan

    Dalam contoh berikut, aplikasi sleep diterapkan di cn-hongkong-b. Anda dapat menerapkan aplikasi Anda di zona berdasarkan persyaratan bisnis Anda.

    Perluas untuk melihat file sleep.yaml

    # Hak Cipta Istio Authors
    #
    #   Berlisensi di bawah Apache License, Versi 2.0 (the "License");
    #   Anda tidak boleh menggunakan file ini kecuali sesuai dengan Lisensi.
    #   Anda dapat memperoleh salinan Lisensi di
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Kecuali diwajibkan oleh undang-undang atau disepakati secara tertulis, perangkat lunak
    #   yang didistribusikan di bawah Lisensi ini didistribusikan atas dasar "SEBAGAIMANA ADANYA",
    #   TANPA JAMINAN ATAU KONDISI APA PUN, baik tersurat maupun tersirat.
    #   Lihat Lisensi untuk bahasa spesifik yang mengatur izin dan
    #   batasan di bawah Lisensi.
    
    ##################################################################################################
    # Layanan Sleep
    ##################################################################################################
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: failure-domain.beta.kubernetes.io/zone
                    operator: In
                    values:
                      - 'cn-hongkong-b'
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "3650d"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
  2. Jalankan perintah berikut untuk menerapkan aplikasi sleep di cluster ACK:

    kubectl apply -f sleep.yaml
  3. Buat file helloworld.yaml dengan konten berikut:

    Catatan

    Dalam contoh berikut, aplikasi helloworld-v1 diterapkan di cn-hongkong-b dan aplikasi helloworld-v2 diterapkan di cn-hongkong-c. Anda dapat menerapkan aplikasi Anda di zona berdasarkan persyaratan bisnis Anda.

    Perluas untuk melihat file helloworld.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: helloworld
      labels:
        app: helloworld
        service: helloworld
    spec:
      ports:
      - port: 5000
        name: http
      selector:
        app: helloworld
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloworld-v1
      labels:
        app: helloworld
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: helloworld
          version: v1
      template:
        metadata:
          labels:
            app: helloworld
            version: v1
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: failure-domain.beta.kubernetes.io/zone
                    operator: In
                    values:
                      - 'cn-hongkong-b'
          containers:
          - name: helloworld
            image: docker.io/istio/examples-helloworld-v1
            resources:
              requests:
                cpu: "100m"
            imagePullPolicy: IfNotPresent #Always
            ports:
            - containerPort: 5000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloworld-v2
      labels:
        app: helloworld
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: helloworld
          version: v2
      template:
        metadata:
          labels:
            app: helloworld
            version: v2
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: failure-domain.beta.kubernetes.io/zone
                    operator: In
                    values:
                      - 'cn-hongkong-c'
          containers:
          - name: helloworld
            image: docker.io/istio/examples-helloworld-v2
            resources:
              requests:
                cpu: "100m"
            imagePullPolicy: IfNotPresent #Always
            ports:
            - containerPort: 5000
                            
  4. Jalankan perintah berikut untuk menerapkan aplikasi helloworld di cluster ACK:

    kubectl apply -f helloworld.yaml
  5. Jalankan perintah berikut untuk memeriksa informasi pendaftaran layanan yang akan diakses:

    kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')"  -c sleep -- curl localhost:15000/clusters | grep helloworld

    Output yang diharapkan:

    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::region::cn-hongkong
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::zone::cn-hongkong-b
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::sub_zone::
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::canary::false
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::priority::0
    .......
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::region::cn-hongkong
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::zone::cn-hongkong-c
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::sub_zone::
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::canary::false
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::priority::0

    Output menunjukkan bahwa kedua aplikasi helloworld memiliki prioritas yang sama priority::0. Oleh karena itu, ketika klien sleep memanggil layanan helloworld, kedua aplikasi helloworld memiliki kebijakan perutean yang sama.

Langkah 2: Aktifkan fitur perutean berbasis zona

Gunakan aturan tujuan untuk memprioritaskan aplikasi helloworld di zona klien. Aktifkan fitur perutean berbasis zona untuk layanan helloworld.default.svc.cluster.local.

Catatan

Anda dapat mengaktifkan fitur ini dengan mengonfigurasi parameter berikut: consecutive5xxErrors, interval, dan baseEjectionTime. Dalam contoh ini, failover dipicu ketika permintaan pertama gagal.

  1. Buat file helloworld-failover.yaml dengan konten berikut:

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: helloworld-failover
      namespace: default
    spec:
      host: helloworld.default.svc.cluster.local
      trafficPolicy:
        connectionPool:
          http:
            maxRequestsPerConnection: 1
        loadBalancer:
          localityLbSetting:
            enabled: true
          simple: ROUND_ROBIN
        outlierDetection:
          baseEjectionTime: 1m
          consecutive5xxErrors: 1
          interval: 1s
                            
  2. Jalankan perintah berikut untuk melihat prioritas pod:

    kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')"  -c sleep -- curl localhost:15000/clusters | grep helloworld
                            

    Output yang diharapkan:

    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::region::cn-hongkong
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::zone::cn-hongkong-b
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::sub_zone::
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::canary::false
    outbound|5000||helloworld.default.svc.cluster.local::172.28.32.49:5000::priority::0
    .......
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::region::cn-hongkong
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::zone::cn-hongkong-c
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::sub_zone::
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::canary::false
    outbound|5000||helloworld.default.svc.cluster.local::172.28.33.155:5000::priority::1

    Dalam output, prioritas kedua aplikasi helloworld berbeda, yaitu priority::0 dan priority::1, masing-masing. Output menunjukkan bahwa fitur perutean berbasis zona berfungsi ketika klien sleep memanggil layanan helloworld.

Langkah 3: Verifikasi fitur perutean berbasis zona

Kirim permintaan untuk memanggil layanan helloworld dari aplikasi sleep pada klien yang berlokasi di zona cn-hongkong-b. Setelah fitur perutean berbasis zona diaktifkan, semua lalu lintas dirutekan ke aplikasi helloworld-v1 di zona yang sama dengan klien. Aplikasi sleep dan helloworld-v1 diterapkan di cn-hongkong-b, sedangkan aplikasi helloworld-v2 diterapkan di cn-hongkong-c.

  1. Jalankan perintah berikut beberapa kali untuk mengakses layanan helloworld:

    kubectl exec  -c sleep "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')"  -- curl -sSL helloworld:5000/hello

    Output yang diharapkan:

    Hello version: v1, instance: helloworld-v1-6f88967849-sq2h2

    Output menunjukkan bahwa hasil yang dikembalikan selalu aplikasi helloworld-v1.

  2. Skalakan aplikasi helloworld-v1.

    1. Jalankan perintah berikut untuk menskalakan aplikasi helloworld-v1 menjadi nol pod dan membuat aplikasi tidak tersedia:

      kubectl scale deploy helloworld-v1 --replicas=0
    2. Tunggu beberapa detik dan jalankan perintah berikut beberapa kali untuk mengakses layanan helloworld:

      kubectl exec  -c sleep "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')"  -- curl -sSL helloworld:5000/hello

      Output yang diharapkan:

      Hello version: v2, instance: helloworld-v2-75db5f978d-s7v4k

      Output menunjukkan bahwa permintaan dirutekan ke aplikasi helloworld-v2 di zona cn-hongkong-c ketika aplikasi helloworld-v1 di zona yang sama dengan klien menjadi tidak tersedia.

  3. Perbesar aplikasi helloworld-v1.

    1. Jalankan perintah berikut untuk memperbesar aplikasi helloworld-v1 menjadi satu pod dan memulihkan aplikasi helloworld-v1:

      kubectl scale deploy helloworld-v1 --replicas=1
    2. Tunggu beberapa detik dan jalankan perintah berikut beberapa kali untuk mengakses layanan helloworld:

      kubectl exec  -c sleep "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')"  -- curl -sSL helloworld:5000/hello

      Output yang diharapkan:

      Hello version: v1, instance: helloworld-v1-6f88967849-sq2h2

      Output menunjukkan bahwa hasil yang dikembalikan selalu aplikasi helloworld-v1.