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
Layanan Alibaba Cloud berikut telah diaktifkan:
Kluster ACK telah dibuat. Untuk petunjuknya, lihat Buat kluster ACK yang dikelola dan Buat kluster khusus ACK (Tidak Dilanjutkan).
Kluster ACK telah ditambahkan ke instans ASM. Untuk petunjuknya, lihat Buat instans ASM dan Tambahkan kluster ke instans ASM.
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
telnetdan Docker tersedia di komputer yang Anda gunakan untuk verifikasi. Langkah 4 menggunakantelnetuntuk membuka koneksi TCP ke layanantcp-echo, dan Langkah 5 menggunakandocker rununtuk 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.
Deploy dua versi aplikasi
tcp-echo.-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Pada halaman Deployments, pilih Namespace yang dituju di bagian atas halaman, lalu klik Create Resources in YAML di pojok kanan atas.
Atur Sampel Template menjadi Custom, tempel YAML berikut ke dalam kotak teks Template, lalu klik Create.
Dua versi baru aplikasi
tcp-echomuncul di halaman Deployments.
-
Buat Service untuk mengekspos aplikasi
tcp-echosecara eksternal.-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Pada halaman Services, pilih Namespace yang dituju di bagian atas halaman, lalu klik Create di pojok kanan atas.
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.
CatatanHeadless 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.
CatatanService menggunakan label
appdari Deployment terkait sebagai selektornya, yang menentukan Deployment mana yang menerima traffic dari Service Kubernetes. Karena Deploymenttcp-echo-v1dantcp-echo-v2memiliki labelapp:tcp-echoyang sama, Service dapat mengarahkan traffic ke salah satu Deployment tersebut.External Traffic Policy
Opsi Local dan Cluster didukung.
CatatanExternal 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
annotationke Service untuk mengonfigurasi parameter load balancing. Misalnya,service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20mengatur 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.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
Buat Gateway.
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri. Pada halaman yang muncul, klik Create from YAML.
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: - "*"
-
Buat VirtualService.
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri. Pada halaman yang muncul, klik Create from YAML.
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
-
Buat DestinationRule.
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri. Pada halaman yang muncul, klik Create from YAML.
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
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.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
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.
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}')Jalankan perintah
telnetuntuk mengirim permintaan koneksi ke layanantcp-echo.telnet $INGRESS_HOST $INGRESS_PORTTrying xxx.xxx.xxx.xxx... Connected to xxx.xxx.xxx.xxx. Escape character is '^]'Masukkan string apa pun lalu tekan Enter.
String yang dikembalikan diberi awalan
one, yang menunjukkan bahwa layanantcp-echotelah dideploy dan seluruh traffic diarahkan ke versitcp-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.
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%.
Modifikasi konfigurasi VirtualService instans ASM.
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri.
Pada halaman VirtualService, temukan layanan
tcp-echolalu klik YAML di kolom Actions.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
-
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"; \ doneone 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 2018Output menunjukkan bahwa 20% traffic diarahkan ke
tcp-echo-v2.