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
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.
CatatanDalam 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
Buat file sleep.yaml dengan konten berikut:
CatatanDalam contoh berikut, aplikasi sleep diterapkan di cn-hongkong-b. Anda dapat menerapkan aplikasi Anda di zona berdasarkan persyaratan bisnis Anda.
Jalankan perintah berikut untuk menerapkan aplikasi sleep di cluster ACK:
kubectl apply -f sleep.yamlBuat file helloworld.yaml dengan konten berikut:
CatatanDalam 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.
Jalankan perintah berikut untuk menerapkan aplikasi helloworld di cluster ACK:
kubectl apply -f helloworld.yamlJalankan 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 helloworldOutput 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::0Output 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.
Anda dapat mengaktifkan fitur ini dengan mengonfigurasi parameter berikut: consecutive5xxErrors, interval, dan baseEjectionTime. Dalam contoh ini, failover dipicu ketika permintaan pertama gagal.
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: 1sJalankan 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 helloworldOutput 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::1Dalam output, prioritas kedua aplikasi helloworld berbeda, yaitu
priority::0danpriority::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.
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/helloOutput yang diharapkan:
Hello version: v1, instance: helloworld-v1-6f88967849-sq2h2Output menunjukkan bahwa hasil yang dikembalikan selalu aplikasi helloworld-v1.
Skalakan aplikasi helloworld-v1.
Jalankan perintah berikut untuk menskalakan aplikasi helloworld-v1 menjadi nol pod dan membuat aplikasi tidak tersedia:
kubectl scale deploy helloworld-v1 --replicas=0Tunggu 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/helloOutput yang diharapkan:
Hello version: v2, instance: helloworld-v2-75db5f978d-s7v4kOutput 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.
Perbesar aplikasi helloworld-v1.
Jalankan perintah berikut untuk memperbesar aplikasi helloworld-v1 menjadi satu pod dan memulihkan aplikasi helloworld-v1:
kubectl scale deploy helloworld-v1 --replicas=1Tunggu 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/helloOutput yang diharapkan:
Hello version: v1, instance: helloworld-v1-6f88967849-sq2h2Output menunjukkan bahwa hasil yang dikembalikan selalu aplikasi helloworld-v1.