All Products
Search
Document Center

Alibaba Cloud Service Mesh:Migrasikan traffic TCP dengan ASM

Last Updated:Aug 29, 2026

Service Mesh (ASM) Traffic Management Center memungkinkan migrasi traffic aplikasi TCP secara lancar saat Anda mengoptimalkan topologi jaringan, melakukan scale out server aplikasi, atau menyesuaikan distribusi traffic layanan, sehingga menjamin kelangsungan bisnis dan ketersediaan tinggi. Topik ini menggunakan tugas Istio TCP-Traffic-Shifting untuk menjelaskan pergeseran traffic canary antara dua versi layanan TCP.

Prasyarat

Layanan dan sumber daya cloud

Alat klien lokal

  • Klien kubectl telah diinstal dan terhubung ke kluster Kubernetes. Untuk petunjuknya, lihat Dapatkan file kubeconfig dan gunakan kubectl untuk terhubung ke kluster.

  • Klien telnet dan Docker tersedia di komputer yang Anda gunakan untuk verifikasi. Langkah 4 menggunakan telnet untuk membuka koneksi TCP ke layanan tcp-echo, dan Langkah 5 menggunakan docker run untuk mengirim permintaan pengujian.

Langkah 1: Deploy aplikasi contoh

Aplikasi contoh tcp-echo berjalan dalam dua versi: v1 memberikan awalan setiap respons dengan one, dan v2 memberikan awalan setiap respons dengan two. Awalan tersebut mengidentifikasi versi yang menangani permintaan, yang merupakan cara Anda mengamati distribusi traffic nanti dalam topik ini.

  1. Deploy dua versi aplikasi tcp-echo.

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

    2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Deployments.

    3. Pada halaman Deployments, pilih Namespace yang dituju di bagian atas halaman, lalu klik Create Resources in YAML di pojok kanan atas.

    4. Atur Sampel Template menjadi Custom, tempel YAML berikut ke dalam kotak teks Template, lalu klik Create.

      Tampilkan file 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

      Dua versi baru aplikasi tcp-echo muncul di halaman Deployments.

  2. Buat Service untuk mengekspos aplikasi tcp-echo secara eksternal.

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

    2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Network > Services.

    3. Pada halaman Services, pilih Namespace yang dituju di bagian atas halaman, lalu klik Create di pojok kanan atas.

    4. Pada kotak dialog Create Service, konfigurasikan parameter yang dijelaskan dalam tabel berikut, lalu klik Confirm.

      Parameter

      Deskripsi

      Service

      Masukkan tcp-echo.

      Service Type

      Pilih metode akses untuk Service. Jenis yang didukung adalah ClusterIP, NodePort, dan LoadBalancer.

      Catatan

      Headless Service hanya dapat diatur ketika Service Type diatur ke Cluster IP. Gunakan Headless Service untuk berinteraksi dengan sistem penemuan layanan lain alih-alih mengikat implementasi Kubernetes.

      Backend

      Atur Name menjadi app dan Value menjadi tcp-echo.

      Catatan

      Service menggunakan label app dari Deployment terkait sebagai selektornya, yang menentukan Deployment mana yang menerima traffic dari Service Kubernetes. Karena Deployment tcp-echo-v1 dan tcp-echo-v2 memiliki label app:tcp-echo yang sama, Service dapat mengarahkan traffic ke salah satu Deployment tersebut.

      External Traffic Policy

      Opsi Local dan Cluster didukung.

      Catatan

      External Traffic Policy hanya dapat diatur ketika tipe Service adalah Node Port atau Server Load Balancer.

      Port Mapping

      Dalam topik ini, atur Name menjadi tcp, atur Service Port dan Container Port menjadi 9000, dan atur Protocol menjadi TCP.

      Annotations

      Tambahkan annotation ke Service untuk mengonfigurasi parameter load balancing. Misalnya, service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20 mengatur bandwidth puncak Service menjadi 20 Mbit/s, yang mengontrol traffic Service tersebut. Untuk informasi lebih lanjut tentang parameter tersebut, lihat Konfigurasikan instans Classic Load Balancer (CLB) menggunakan annotations.

      Label

      Tambahkan label untuk mengidentifikasi Service.

      Setelah Anda membuat Service, Service tcp-echo baru muncul di halaman Services.

Langkah 2: Konfigurasikan aturan routing

Konfigurasikan Istio Gateway, VirtualService, dan DestinationRule di Service Mesh untuk mengarahkan seluruh traffic ke versi v1 layanan tcp-echo. Gateway mendengarkan pada port 31400, sehingga traffic eksternal hanya mencapai aturan ini setelah Anda menambahkan port 31400 ke layanan ingress gateway pada Langkah 3.

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

  2. Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.

  3. Buat Gateway.

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

    2. Pada halaman Create, atur Namespace menjadi default, pilih salah satu Scenario Template, tempel YAML berikut, 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 VirtualService.

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

    2. Pada halaman Create, atur Namespace menjadi default, pilih salah satu Scenario Template, tempel YAML berikut, 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 DestinationRule.

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

    2. Pada halaman Create, atur Namespace menjadi default, pilih salah satu Scenario Template, tempel YAML berikut, 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: Deploy ingress gateway

Penting

Alokasikan satu instans CLB untuk setiap Service Kubernetes. Jika beberapa Service Kubernetes berbagi instans CLB yang sama, risiko dan batasan berikut berlaku:

  • Menggunakan instans CLB yang sudah ada akan secara paksa menimpa listener yang sudah ada, yang dapat menyebabkan aplikasi Anda tidak dapat diakses.

  • Anda tidak dapat menggunakan kembali instans CLB yang dibuat Kubernetes melalui Service. Hanya instans CLB yang dibuat secara manual di konsol atau dengan memanggil operasi OpenAPI yang dapat digunakan kembali.

  • Beberapa Service yang berbagi instans CLB yang sama tidak dapat menggunakan port listener frontend yang sama. Jika tidak, akan terjadi konflik port.

  • Saat Anda menggunakan kembali instans CLB, Kubernetes menggunakan nama listener dan nama grup server virtual sebagai pengenal unik. Jangan ubah nama-nama tersebut.

  • Anda tidak dapat menggunakan kembali instans CLB lintas kluster.

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

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

  3. Pada halaman Ingress Gateway, klik Create, lengkapi konfigurasi, lalu klik Create.

    Tabel berikut menjelaskan beberapa item konfigurasi. Untuk informasi lebih lanjut, lihat Buat ingress gateway.

    Parameter

    Deskripsi

    Cluster

    Pilih kluster tempat Anda ingin deploy ingress gateway.

    CLB instance type

    Dalam topik ini, pilih Access over the Internet.

    Select CLB Instance

    Pilih salah satu opsi berikut. Use Existing CLB Instance: pilih instans dari daftar instans CLB yang sudah ada. Create CLB Instance: klik Create SLB Instance dan pilih spesifikasi CLB yang diperlukan dari daftar drop-down.

    Port Mapping

    Klik Add Port, atur Name menjadi tcp, dan atur Service Port menjadi 31400.

Langkah 4: Verifikasi deployment

Gunakan kubectl untuk memastikan bahwa traffic ke layanan tcp-echo diarahkan sesuai harapan.

  1. Jalankan perintah berikut untuk mendapatkan alamat dan port layanan:

    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}')
  2. Jalankan perintah telnet untuk mengirim permintaan koneksi ke layanan tcp-echo.

    telnet $INGRESS_HOST $INGRESS_PORT
    Trying xxx.xxx.xxx.xxx...
    Connected to xxx.xxx.xxx.xxx.
    Escape character is '^]'
  3. Masukkan string apa pun lalu tekan Enter.

    String yang dikembalikan diberi awalan one, yang menunjukkan bahwa layanan tcp-echo telah dideploy dan seluruh traffic diarahkan ke versi tcp-echo-v1.

Langkah 5: Arahkan traffic ke v2 berdasarkan bobot

Langkah ini mengarahkan 20% traffic ke versi tcp-echo-v2 dan sisanya 80% ke tcp-echo-v1.

Catatan

Dengan sampel kecil sebanyak 10 permintaan, hasilnya mungkin tidak selalu menunjukkan 2 dari 10 permintaan diarahkan ke tcp-echo-v2. Namun, dalam periode yang lebih panjang, rasio keseluruhan akan mendekati 20%.

  1. Modifikasi konfigurasi VirtualService instans ASM.

    1. Pada halaman detail instans ASM, pilih Traffic Management Center > VirtualService di panel navigasi kiri.

    2. Pada halaman VirtualService, temukan layanan tcp-echo lalu klik YAML di kolom Actions.

    3. Pada kotak teks di halaman Edit, masukkan konten YAML berikut 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 menunjukkan bahwa 20% traffic diarahkan ke tcp-echo-v2.