全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan ASM untuk memigrasikan trafik TCP

更新时间:Jul 02, 2025

Jika Anda ingin mengoptimalkan topologi jaringan, menambah kapasitas server aplikasi, atau membatasi trafik pengguna, Anda dapat menggunakan Pusat Manajemen Trafik di konsol Service Mesh (ASM) untuk memigrasikan trafik TCP secara mulus. Ini memastikan kelangsungan bisnis dan ketersediaan tinggi layanan. Topik ini menjelaskan cara memigrasikan trafik TCP dari satu versi aplikasi ke versi lain berdasarkan contoh TCP Traffic Shifting dari Istio. Dalam contoh ini, aplikasi bernama tcp-echo memiliki dua versi: v1 dan v2. Di versi v1, aplikasi menambahkan awalan "one" pada timestamp dalam respons sebelum mengembalikan respons. Di versi v2, aplikasi menambahkan awalan "two". Dengan cara ini, Anda dapat menyesuaikan kebijakan pemisahan trafik berdasarkan hasil migrasi untuk memenuhi persyaratan bisnis spesifik dan target performa.

Prasyarat

Langkah 1: Terapkan dua versi aplikasi sampel

  1. Terapkan dua versi aplikasi tcp-echo.

    1. Masuk ke konsol ACK. Di panel navigasi sisi kiri, klik Clusters.

    2. Di halaman Clusters, temukan klaster yang diinginkan dan klik namanya. Di panel sisi kiri, pilih Workloads > Deployments.

    3. Di bagian atas halaman Deployments, pilih namespace tempat Anda ingin menerapkan dua versi aplikasi tcp-echo dari daftar drop-down Namespace, lalu klik Create from YAML di pojok kanan atas.

    4. Pilih Custom dari daftar drop-down Sample Template, salin kode YAML berikut ke editor kode Template, lalu klik Create.

      Tampilkan Kode YAML

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo-v1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v1
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v1
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.1
              imagePullPolicy: IfNotPresent
              args: [ "9000", "one" ]
              ports:
              - containerPort: 9000
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo-v2
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v2
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v2
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.1
              imagePullPolicy: IfNotPresent
              args: [ "9000", "two" ]
              ports:
              - containerPort: 9000

      Kembali ke halaman Deployments, di mana Anda dapat menemukan dua versi aplikasi tcp-echo.

  2. Buat layanan bernama tcp-echo dan paparkan layanan tersebut.

    1. Masuk ke konsol ACK. Di panel navigasi sisi kiri, klik Clusters.

    2. Di halaman Clusters, temukan klaster yang diinginkan dan klik namanya. Di panel sisi kiri, pilih Network > Services.

    3. Di bagian atas halaman Services, pilih namespace tempat Anda ingin membuat layanan dari daftar drop-down Namespace, lalu klik Create di pojok kanan atas.

    4. Di kotak dialog Create Service, konfigurasikan parameter berikut dan klik OK.

      Parameter

      Deskripsi

      Name

      Nama layanan. Dalam contoh ini, nama diatur menjadi tcp-echo.

      Service Type

      Tipe layanan, yang menentukan bagaimana layanan dipaparkan. Nilai valid: Cluster IP, Node Port, dan Server Load Balancer.

      Catatan

      Kotak centang Headless Service hanya muncul ketika Anda mengatur parameter Service Type ke Cluster IP. Jika Anda memilih kotak centang ini, Anda dapat menggunakan layanan headless untuk berinteraksi dengan mekanisme penemuan layanan lainnya, bukan terikat pada implementasi penemuan layanan di Kubernetes.

      Backend

      Deployment yang akan dikaitkan dengan layanan. Dalam contoh ini, parameter Name diatur ke app dan parameter Value diatur ke tcp-echo-v1.

      Catatan

      Layanan menggunakan label app dari Deployment terkait sebagai pemilih untuk menentukan ke Deployment mana trafik akan dirutekan. Deployment tcp-echo-v1 dan tcp-echo-v2 berbagi label app yang sama, yaitu app:tcp-echo. Oleh karena itu, layanan dapat dikaitkan dengan salah satu dari dua Deployment tersebut.

      External Traffic Policy

      Anda dapat memilih Lokal atau Klaster.

      Catatan

      Parameter External Traffic Policy hanya muncul ketika Anda mengatur tipe layanan ke Node Port atau Server Load Balancer.

      Port Mapping

      Dalam contoh ini, parameter Name diatur ke tcp, parameter Service Port dan Container Port diatur ke 9000, dan parameter Protocol diatur ke TCP.

      Annotations

      Anda dapat menambahkan anotasi ke layanan untuk mengonfigurasi load balancing. Sebagai contoh, anotasi service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20 menentukan bahwa bandwidth maksimum layanan adalah 20 Mbit/s. Ini membatasi jumlah trafik yang mengalir melalui layanan. Untuk informasi lebih lanjut tentang parameter ini, lihat Gunakan anotasi untuk mengonfigurasi instance CLB.

      Label

      Anda dapat menambahkan satu atau lebih label ke layanan untuk mengidentifikasi layanan tersebut.

      Setelah layanan tcp-echo dibuat, Anda dapat melihat layanan tersebut di halaman Services.

Langkah 2: Konfigurasikan aturan routing

Anda dapat membuat gateway Istio, layanan virtual, dan aturan tujuan untuk instance ASM guna merutekan semua trafik ke versi v1 aplikasi tcp-echo.

  1. Masuk ke konsol ASM. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance ASM atau klik Manage di kolom Actions.

  3. Buat gateway Istio.

    1. Di halaman detail instance ASM, pilih ASM Gateways > Gateway di panel navigasi sisi kiri. Di halaman yang muncul, klik Create from YAML.

    2. Di halaman Create, pilih default dari daftar drop-down Namespace, pilih template dari daftar drop-down Template, salin kode YAML berikut ke editor kode YAML, lalu klik Create.

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: tcp-echo-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 31400
            name: tcp
            protocol: TCP
          hosts:
          - "*"
  4. Buat layanan virtual.

    1. Di halaman detail instance ASM, pilih Traffic Management Center > VirtualService di panel navigasi sisi kiri. Di halaman yang muncul, klik Create from YAML.

    2. Di halaman Create, pilih default dari daftar drop-down Namespace, pilih template dari daftar drop-down Template, salin kode YAML berikut ke editor kode YAML, lalu klik Create.

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: tcp-echo
      spec:
        hosts:
        - "*"
        gateways:
        - tcp-echo-gateway
        tcp:
        - match:
          - port: 31400
          route:
          - destination:
              host: tcp-echo
              port:
                number: 9000
              subset: v1
  5. Buat aturan tujuan.

    1. Di halaman detail instance ASM, pilih Traffic Management Center > DestinationRule di panel navigasi sisi kiri. Di halaman yang muncul, klik Create from YAML.

    2. Di halaman Create, pilih default dari daftar drop-down Namespace, pilih template dari daftar drop-down Template, salin kode YAML berikut ke editor kode YAML, lalu klik Create.

      apiVersion: networking.istio.io/v1alpha3
      kind: DestinationRule
      metadata:
        name: tcp-echo-destination
      spec:
        host: tcp-echo
        subsets:
        - name: v1
          labels:
            version: v1
        - name: v2
          labels:
            version: v2

Langkah 3: Terapkan gateway ingress

Tambahkan port 31400 ke gateway ingress dan peta port tersebut ke port 31400 dari gateway Istio.

  1. Masuk ke konsol ASM. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi sisi kiri, pilih ASM Gateways > Ingress Gateway.

  3. Di halaman Ingress Gateway, klik Create. Di halaman Buat, konfigurasikan parameter lalu klik Create.

    Tabel berikut menjelaskan beberapa parameter. Untuk informasi lebih lanjut, lihat Buat Gateway Ingress.

    Parameter

    Deskripsi

    Cluster

    Klaster tempat Anda ingin menerapkan gateway ingress.

    CLB Instance Type

    Tipe akses instance CLB. Dalam contoh ini, Internet Access dipilih.

    Buat Instance CLB Baru atau Gunakan Instance CLB yang Ada

    • Gunakan Instance CLB yang Ada: Pilih instance CLB yang ada dari daftar drop-down.

    • Buat Instance CLB: Klik Create a CLB Instance dan pilih spesifikasi instance CLB yang Anda butuhkan dari daftar drop-down.

    Catatan

    Kami merekomendasikan agar Anda memilih instance CLB untuk setiap Layanan Kubernetes. Jika beberapa Layanan Kubernetes berbagi instance CLB yang sama, risiko dan batasan berikut ada:

    • Jika Anda mengonfigurasi Layanan Kubernetes untuk menggunakan instance CLB yang sudah digunakan oleh Layanan Kubernetes lain, pendengar yang ada dari instance CLB secara paksa ditimpa. Ini dapat mengganggu Layanan Kubernetes asli.

    • Jika Anda membuat instance CLB saat membuat Layanan Kubernetes, instance CLB tidak dapat dibagikan di antara Layanan Kubernetes. Hanya instance CLB yang Anda buat di konsol CLB atau dengan memanggil operasi API yang dapat dibagikan.

    • Layanan Kubernetes yang berbagi instance CLB yang sama harus menggunakan port mendengarkan frontend yang berbeda. Jika tidak, konflik port mungkin terjadi.

    • Jika beberapa Layanan Kubernetes berbagi instance CLB yang sama, nama pendengar dan nama grup vServer digunakan sebagai pengenal unik di Kubernetes. Jangan ubah nama pendengar atau grup vServer.

    • Anda tidak dapat berbagi instance CLB di seluruh klaster.

    Port Mapping

    Anda dapat mengklik Add Port dan tentukan protokol serta port layanan di baris yang muncul. Dalam contoh ini, protokol diatur ke TCP dan port layanan diatur ke 31400.

Langkah 4: Verifikasi hasilnya

Gunakan klien kubectl untuk memeriksa apakah semua trafik TCP dirutekan ke versi v1 aplikasi tcp-echo.

  1. Gunakan klien kubectl untuk terhubung ke klaster ACK. Untuk informasi lebih lanjut, lihat 3. Konfigurasikan File kubeconfig dan Sambungkan ke Klaster.

  2. Jalankan perintah berikut untuk menanyakan alamat IP dan nomor port layanan tcp-echo:

    $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
  3. Jalankan perintah telnet untuk terhubung ke layanan tcp-echo.

    $ telnet $INGRESS_HOST $INGRESS_PORT
    Mencoba xxx.xxx.xxx.xxx...
    Terkoneksi ke xxx.xxx.xxx.xxx.
    Karakter escape adalah '^]'
  4. Masukkan string dan tekan Enter.

    Jika string yang dikembalikan memiliki awalan "one", aplikasi tcp-echo telah diterapkan dan semua trafik layanan dirutekan ke versi v1 aplikasi tcp-echo.

Langkah 5: Migrasikan sebagian trafik ke versi tcp-echo-v2

Dalam contoh ini, 20% dari trafik dirutekan ke versi tcp-echo-v2 dan sisanya 80% dirutekan ke versi tcp-echo-v1.

  1. Ubah konfigurasi layanan virtual instance ASM.

    1. Di halaman detail instance ASM, pilih Traffic Management Center > VirtualService di panel navigasi sisi kiri.

    2. Di halaman VirtualService, temukan layanan tcp-echo dan klik YAML di kolom Actions.

    3. Dalam kotak dialog Edit, salin konten YAML berikut ke editor kode, lalu klik OK.

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: tcp-echo
      spec:
        hosts:
        - "*"
        gateways:
        - tcp-echo-gateway
        tcp:
        - match:
          - port: 31400
          route:
          - destination:
              host: tcp-echo
              port:
                number: 9000
              subset: v1
            weight: 80
          - destination:
              host: tcp-echo
              port:
                number: 9000
              subset: v2
            weight: 20
  2. Jalankan perintah berikut untuk mengirim 10 permintaan ke layanan tcp-echo:

    $ for i in {1..10}; do \
    docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \
    done
    one Mon Nov 12 23:38:45 UTC 2018
    two Mon Nov 12 23:38:47 UTC 2018
    one Mon Nov 12 23:38:50 UTC 2018
    one Mon Nov 12 23:38:52 UTC 2018
    one Mon Nov 12 23:38:55 UTC 2018
    two Mon Nov 12 23:38:57 UTC 2018
    one Mon Nov 12 23:39:00 UTC 2018
    one Mon Nov 12 23:39:02 UTC 2018
    one Mon Nov 12 23:39:05 UTC 2018
    one Mon Nov 12 23:39:07 UTC 2018

    Output di atas menunjukkan bahwa 20% dari trafik dirutekan ke versi tcp-echo-v2.

    Catatan

    Jika Anda mengirim 10 permintaan dalam pengujian, trafik mungkin tidak selalu dirutekan ke versi tcp-echo-v1 dan tcp-echo-v2 dengan rasio yang ditentukan. Namun, rasio aktual mendekati 80:20 ketika ukuran sampel meningkat.