Multi-cluster gateways yang disediakan oleh Distributed Cloud Container Platform for Kubernetes (ACK One) memungkinkan pengelolaan trafik utara-selatan dalam penyebaran multi-cluster berdasarkan MSE Ingresses. Fitur ini mendukung redundansi zona aktif, penyeimbangan beban trafik, dan pengalihan trafik berbasis header. Topik ini menjelaskan cara menggunakan multi-cluster gateways untuk mengelola trafik utara-selatan.
Informasi latar belakang
Manfaat multi-cluster gateways
Ingresses sering digunakan di sektor layanan kontainer untuk mengelola trafik utara-selatan dari Services yang diterapkan di kluster Kubernetes. Namun, cakupannya terbatas pada satu kluster, sehingga tidak dapat digunakan untuk mengelola trafik aplikasi multi-cluster. ACK One memungkinkan Anda menggunakan MSE Ingresses sebagai Ingresses global untuk secara terpusat mengelola trafik utara-selatan aplikasi multi-cluster di suatu wilayah. MSE Ingresses menyediakan kemampuan manajemen trafik yang kuat, termasuk redundansi zona aktif, penyeimbangan beban, dan pengalihan trafik berbasis header dengan biaya rendah. Selain itu, multi-cluster gateways menyediakan API Ingress yang mudah digunakan untuk menutup kesenjangan teknis bagi pemula.
Biaya dikenakan saat menggunakan multi-cluster gateways. Untuk informasi lebih lanjut tentang penagihan multi-cluster gateways, lihat Ikhtisar Penagihan Instance Umum.
Referensi MSE
MseIngressConfig adalah CustomResourceDefinition (CRD) yang disediakan oleh Microservices Engine (MSE) Ingress Controller. MseIngressConfigs digunakan untuk mengelola siklus hidup gateway cloud-native MSE dan mengonfigurasi opsi mendengarkan Ingress serta pengaturan global. Untuk informasi lebih lanjut tentang cara menggunakan MseIngressConfigs, lihat Konfigurasikan MseIngressConfig.
MSE Ingresses mendukung anotasi inti dan umum digunakan dari Nginx-Ingress. MSE Ingresses juga menyediakan anotasi tambahan untuk menutupi kekurangan Nginx-Ingress. Untuk informasi lebih lanjut, lihat Anotasi yang Didukung oleh MSE Ingress Gateways.
Prasyarat
Namespace telah dibuat pada instance ACK One Fleet. Namespace tersebut sama dengan namespace aplikasi yang diterapkan di kluster terkait.
Langkah 1: Buat multi-cluster gateway pada instance ACK One Fleet
Buat multi-cluster gateway pada instance ACK One Fleet dan sambungkan kluster terkait ke multi-cluster gateway. Secara default, multi-cluster gateway diterapkan lintas zona untuk memastikan ketersediaan tinggi.
Gunakan konsol
Masuk ke Konsol ACK One. Di panel navigasi kiri, pilih .
Di pojok kanan atas halaman Multi-cluster Gateway, klik Create Gateway.
Di panel yang muncul, modifikasi file YAML sesuai kebutuhan bisnis Anda dan klik Buat.
Gunakan CLI
Dapatkan dan catat ID vSwitch dari instance ACK One Fleet.
Jalankan perintah berikut untuk menanyakan ID vSwitch:
aliyun adcp DescribeHubClusterDetails --ClusterId <YOUR_FLEET_CLUSTERID>Catat ID vSwitch di bidang
VSwitchesdari keluaran.
Buat file bernama mseingressconfig.yaml dan tambahkan konten berikut ke file tersebut.
Ganti
${vsw-id1}dengan ID vSwitch yang Anda catat. Anda dapat menambahkan anotasi ke file konfigurasi gateway untuk menentukan kluster terkait yang ingin Anda tambahkan ke gateway.apiVersion: mse.alibabacloud.com/v1alpha1 kind: MseIngressConfig metadata: name: ackone-gateway # Hubungkan kluster terkait ke gateway MSE. #annotations: # mse.alibabacloud.com/remote-clusters: ${cluster1},${cluster2} spec: common: instance: replicas: 3 spec: 2c4g network: # Anda dapat mengonfigurasi baik Server Load Balancer (SLB) instance yang menghadap internet maupun SLB instance akses internal. Jika tidak ada instance SLB yang ditentukan, instance SLB yang menghadap internet digunakan secara default. #publicSLBSpec: slb.s2.small #privateSLBSpec: slb.s2.small vSwitches: - ${vsw-id1} ingress: local: ingressClass: mse name: mse-ingressJalankan perintah berikut untuk membuat gateway bernama mse-ingress pada instance ACK One Fleet:
kubectl apply -f mseingressconfig.yamlJalankan perintah berikut untuk memeriksa apakah gateway telah dibuat:
kubectl get mseingressconfig ackone-gatewayKeluaran yang Diharapkan:
NAME STATUS AGE ackone-gateway Listening 3m15sKeluaran menunjukkan bahwa gateway berada dalam status Listening. Ini berarti gateway cloud-native telah dibuat dan sedang berjalan. Gateway mendengarkan Ingresses yang memiliki IngressClasses
mse.Status gateway yang dibuat dari MseIngressConfig berubah dalam urutan berikut: Pending, Running, dan Listening. Deskripsi status:
Pending: Gateway cloud-native sedang dibuat. Proses ini mungkin memakan waktu sekitar 3 menit.
Running: Gateway cloud-native telah dibuat dan sedang berjalan.
Listening: Gateway cloud-native sedang berjalan dan mendengarkan Ingresses.
Failed: Gateway cloud-native tidak valid. Anda dapat memeriksa pesan di bidang Status untuk menyelesaikan masalah.
Langkah 2: Sambungkan kluster terkait ke multi-cluster gateway
Gunakan konsol
Masuk ke Konsol ACK One. Di panel navigasi kiri, pilih .
Di bagian atas halaman Multi-cluster Gateway, pilih multi-cluster gateway yang ingin Anda kelola dari daftar drop-down Pilih gateway dan klik Modify di pojok kanan atas.
Di panel ModifyGateway, modifikasi file MseIngresConfig.yaml. Modifikasi ID kluster di parameter
annotationsdan klik Update.Contoh kode:
annotations: mse.alibabacloud.com/remote-clusters: ${cluster1-id},${cluster2-id}${cluster1-id}dan${cluster2-id}adalah ID kluster terkait. Pisahkan beberapa ID kluster dengan koma (,). Anda dapat memodifikasi ID kluster untuk menambah atau menghapus kluster terkait.Jika Anda tidak menambahkan kluster terkait ke multi-cluster gateway saat membuat multi-cluster gateway, file MseIngresConfig.yaml tidak memiliki parameter
annotations. Untuk menambahkan kluster terkait tertentu ke multi-cluster gateway, Anda harus menambahkan kode di atas ke objekmetadatadi file MseIngresConfig.yaml dan kemudian memodifikasi ID kluster.
Gunakan CLI
Anda dapat memodifikasi anotasi yang sesuai di mseingressconfig dari instance ACK One Fleet untuk menambah atau menghapus kluster terkait. Ganti
${cluster1-id}dan${cluster2-id}dengan ID kluster terkait yang akan disambungkan. Pisahkan ID kluster dengan koma (,).annotations: mse.alibabacloud.com/remote-clusters: ${cluster1-id},${cluster2-id}Jalankan perintah berikut untuk memeriksa apakah kluster terkait telah disambungkan ke multi-cluster gateway:
kubectl get mseingressconfig ackone-gateway -ojsonpath="{.status.remoteClusters}"Keluaran yang Diharapkan:
[{"clusterId":"c7fb82****"},{"clusterId":"cd3007****"}]Keluaran menunjukkan ID kluster terkait dan tidak ada informasi Failed yang dikembalikan. Ini berarti kluster terkait telah disambungkan ke multi-cluster gateway.
Langkah 3: Gunakan GitOps untuk menerapkan aplikasi contoh
Gunakan GitOps untuk menerapkan aplikasi contoh ke kluster terkait. Untuk informasi lebih lanjut, lihat Memulai dengan GitOps.
Buat aplikasi GitOps untuk setiap kluster terkait. Dalam contoh ini, aplikasi web-demo-cluster1 dan web-demo-cluster2 dibuat.
Sumber:Atur
Repository URLkehttps://github.com/AliyunContainerService/gitops-demo.git.Atur
RevisionkeHEAD.Atur
Pathkemanifests/helm/web-demo.
Tentukan kluster terkait sebagai
DESTINATIONdan aturnamespacekeweb-demo.Nama variabel lingkungan di
Helm Values FilesadalahenvNamedan nilaivaluesadalahcluster1dancluster2.
Blok kode berikut menunjukkan konten YAML dari Deployment dan Service.
Langkah 4: Buat MSE Ingress untuk mengelola trafik di kluster terkait
Anda dapat mengatur IngressClass dari Ingress ke MSE Ingress untuk membuat MSE Ingress dan kemudian menggunakan kemampuan manajemen trafik dengan anotasi yang berbeda. MSE Ingresses mendukung anotasi untuk NGINX Ingresses. MSE Ingresses juga menyediakan anotasi tambahan untuk memungkinkan Anda menggunakan kemampuan tata kelola trafik yang tidak didukung oleh NGINX Ingresses. Untuk informasi lebih lanjut tentang anotasi yang didukung oleh MSE Ingresses, lihat Anotasi yang Didukung oleh MSE Ingress Gateways. Contoh berikut menggambarkan skenario penggunaan manajemen trafik multi-cluster.
Objek Ingress dan objek Service dalam Deployment aplikasi contoh harus termasuk dalam namespace yang sama.
Contoh 1: Gunakan penyeimbangan beban untuk mendistribusikan trafik ke semua pod backend secara default
Buat objek Ingress pada instance ACK One Fleet untuk mendistribusikan trafik ke pod backend yang namanya sama dengan nama kluster terkait. Atur rasio trafik ke rasio pod di Kluster 1 terhadap pod di Kluster 2. Misalnya, jika rasio pod di Kluster 1 terhadap pod di Kluster 2 adalah 9:1, atur rasio trafik menjadi 9:1. Dalam contoh ini, rasio pod di Kluster 1 terhadap pod di Kluster 2 adalah 1:1. Gambar berikut menunjukkan topologi.
Buat file bernama ingress-demo.yaml dan salin konten berikut ke file tersebut.
Dalam file YAML objek Ingress berikut, gunakan
/svc1di bawah domainexample.comuntuk mengekspos Service backendservice1.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-demo namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /svc1 pathType: Exact backend: service: name: service1 port: number: 80Jalankan perintah berikut untuk menerapkan Ingress di instance ACK One Fleet:
kubectl apply -f ingress-demo.yamlJalankan perintah berikut untuk menanyakan alamat IP publik multi-cluster gateway:
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"Jalankan perintah berikut untuk memeriksa informasi pengalihan trafik.
Ganti
XX.XX.XX.XXdengan alamat IP publik multi-cluster gateway yang diperoleh pada langkah sebelumnya.for i in {1..50}; do curl -H "host: example.com" XX.XX.XX.XX/svc1; sleep 1; doneKeluaran yang Diharapkan:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster2 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file isKeluaran menunjukkan bahwa trafik terdistribusi ke kedua kluster.
Contoh 2: Distribusikan trafik hanya ke kluster yang ditentukan
Buat objek Ingress pada instance ACK One Fleet untuk mendistribusikan trafik hanya ke pod backend Kluster 1. Gambar berikut menunjukkan topologi.
Buat file bernama ingress-demo-cluster-one.yaml dan tambahkan konten berikut ke file tersebut.
Tambahkan anotasi
mse.ingress.kubernetes.io/service-subsetdanmse.ingress.kubernetes.io/subset-labelske file YAML objek Ingress untuk menggunakan/service1di bawah domainexample.comuntuk mengekspos Service backendservice1. Untuk informasi lebih lanjut tentang anotasi yang didukung oleh MSE Ingresses, lihat Anotasi yang Didukung oleh MSE Ingress Gateways.mse.ingress.kubernetes.io/service-subset: Nama subset dari Service. Kami merekomendasikan Anda menggunakan nama yang terkait dengan kluster.mse.ingress.kubernetes.io/subset-labels: ID kluster terkait.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-1 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster ${cluster1-id} name: web-demo-cluster-one namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /service1 pathType: Exact backend: service: name: service1 port: number: 80
Jalankan perintah berikut untuk menerapkan Ingress di instance ACK One Fleet:
kubectl apply -f ingress-demo-cluster-one.yamlJalankan perintah berikut untuk menanyakan alamat IP publik multi-cluster gateway:
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"Jalankan perintah berikut untuk menanyakan informasi pengalihan trafik.
Ganti
XX.XX.XX.XXdengan alamat IP publik multi-cluster gateway yang Anda dapatkan di langkah sebelumnya.for i in {1..50}; do curl -H "host: example.com" XX.XX.XX.XX/service1; sleep 1; doneKeluaran yang Diharapkan:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! ...Keluaran menunjukkan bahwa trafik didistribusikan ke Kluster 1.
Contoh 3: Distribusikan trafik yang cocok dengan header ke kluster yang ditentukan
Untuk mendistribusikan trafik yang cocok dengan header ke pod backend kluster yang ditentukan, Anda perlu membuat objek Ingress bernama Contoh 1 atau Contoh 2 pada instance ACK One Fleet. Kemudian buat objek Ingress berikut. Objek Ingress tidak dapat digunakan secara terpisah. Gambar berikut menunjukkan topologi.
Saat mengonfigurasi penjadwalan trafik berbasis header, Anda perlu membuat Ingress yang dikonfigurasi dengan anotasi canary dan kebijakan pencocokan header, serta membuat Ingress lain tanpa anotasi canary. Kedua Ingresses dikonfigurasi dengan host dan path yang sama. Dengan cara ini, Ingress tanpa anotasi canary dapat mengarahkan trafik ke Service di kluster lain. Ini karena Ingresses yang menggunakan penjadwalan trafik berbasis header tidak dapat digunakan secara terpisah. Mereka harus digunakan bersama dengan Ingresses yang tidak menggunakan penjadwalan trafik berbasis header sehingga trafik yang tidak cocok dapat diarahkan ke kluster lain.

Buat file bernama ingress-demo-header.yaml dan tambahkan konten berikut ke file tersebut.
Dalam file YAML objek Ingress berikut, gunakan
/service1di bawah domainexample.comuntuk mengekspos Service backendservice1.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-2 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster c15d48ca9d1fd43f9bbb89c56a474843c nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "stage" nginx.ingress.kubernetes.io/canary-by-header-value: "gray" name: web-demo-cluster-second namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /service1 pathType: Exact backend: service: name: service1 port: number: 80Jalankan perintah berikut untuk menerapkan Ingress di instance ACK One Fleet:
kubectl apply -f ingress-demo-header.yamlJalankan perintah berikut untuk menanyakan alamat IP publik multi-cluster gateway:
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"Jalankan perintah berikut untuk menanyakan informasi pengalihan trafik.
Ganti
XX.XX.XX.XXdengan alamat IP publik multi-cluster gateway yang Anda dapatkan di langkah sebelumnya.for i in {1..50}; do curl -H "host: example.com" -H "stage: gray" xx.xx.xx.xx/service1; sleep 1; doneKeluaran yang Diharapkan:
This is env cluster2 ! Config file is This is env cluster2 ! Config file is This is env cluster2 ! Config file is This is env cluster2 ! Config file is This is env cluster...Keluaran menunjukkan bahwa trafik dengan header
stage: graydidistribusikan ke Kluster 2.
Contoh 4: Gunakan pemulihan bencana lintas kluster untuk aplikasi multi-cluster
Multi-cluster gateways menyediakan fitur pemulihan bencana lintas kluster untuk aplikasi multi-cluster. Anda dapat langsung menggunakan fitur ini tanpa konfigurasi. Sebagai contoh, gateway multi-cluster yang disebutkan sebelumnya mengelola trafik dari dua kluster terkait. Jika Service di salah satu kluster down atau dihapus, trafik secara otomatis dialihkan ke kluster lainnya. Dalam Contoh 1, Contoh 2, dan Contoh 3, ketika Service di salah satu kluster down, trafik dialihkan ke kluster lainnya.
Dalam bagian berikut, Contoh 3 digunakan untuk mendemonstrasikan bagaimana pemulihan bencana dilakukan. Trafik yang membawa header stage: gray diarahkan ke Kluster 2. Ketika jumlah pod yang dibuat oleh Deployment di Kluster 2 diskalakan menjadi 0, trafik dialihkan ke Kluster 1. Gambar berikut menunjukkan topologi.
Jalankan perintah berikut untuk menanyakan alamat IP publik multi-cluster gateway:
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"Jalankan perintah berikut untuk menanyakan informasi pengalihan trafik.
Ganti
XX.XX.XX.XXdengan alamat IP publik multi-cluster gateway yang Anda dapatkan di langkah sebelumnya.for i in {1..50}; do curl -H "host: example.com" -H "stage: gray" XX.XX.XX.XX/service1; sleep 1; doneKeluaran yang Diharapkan:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is ...Keluaran menunjukkan bahwa trafik secara otomatis dialihkan ke Kluster 1.
Contoh 5: Distribusikan trafik berdasarkan bobot
Dalam Contoh 1, Anda dapat memodifikasi rasio pod untuk menyesuaikan proporsi trafik yang didistribusikan ke setiap kluster. Contoh ini mendemonstrasikan cara menggunakan anotasi untuk mendistribusikan trafik ke kluster yang berbeda berdasarkan bobot. Anda dapat menggunakan metode ini untuk melakukan rilis canary. Buat objek Ingress berikut pada instance ACK One Fleet. Gambar berikut menunjukkan topologi.
Saat mengonfigurasi penjadwalan trafik berbasis bobot, Anda perlu membuat Ingress yang dikonfigurasi dengan anotasi canary dan kebijakan pencocokan header, serta membuat Ingress lain tanpa anotasi canary. Kedua Ingresses dikonfigurasi dengan host dan path yang sama. Dengan cara ini, Ingress tanpa anotasi canary dapat mengarahkan trafik ke Service di kluster lain. Ini karena Ingresses yang menggunakan penjadwalan trafik berbasis bobot tidak dapat digunakan secara terpisah. Mereka harus digunakan bersama dengan Ingresses yang tidak menggunakan penjadwalan trafik berbasis bobot sehingga trafik dapat diarahkan ke kluster lain.

Buat file bernama ingress-weight.yaml dan tambahkan konten berikut ke file tersebut.
Dalam file YAML objek Ingress berikut, ganti
${cluster1-id}dengan ID kluster terkait. Tambahkan anotasi untuk menggunakan/svc1-wdi bawah domainexample.comuntuk mengekspos Service backendservice1.mse.ingress.kubernetes.io/service-subset: Nama subset dari Service. Kami merekomendasikan Anda menggunakan nama yang terkait dengan kluster.mse.ingress.kubernetes.io/subset-labels: Tentukan ID kluster terkait.nginx.ingress.kubernetes.io/canary: Atur nilai menjadi"true"untuk mengaktifkan rilis canary.nginx.ingress.kubernetes.io/canary-weight: Tentukan persentase trafik yang didistribusikan ke kluster dalam rentang 0 hingga 100.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-1 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster ${cluster1-id} name: web-demo-weight namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /svc1-w pathType: Exact backend: service: name: service1 port: number: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-2 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster ${cluster2-id} nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "10" name: web-demo-weight-canary namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /svc1-w pathType: Exact backend: service: name: service1 port: number: 80
Jalankan perintah berikut untuk menerapkan Ingress di instance ACK One Fleet:
kubectl apply -f ingress-weight.yaml -nargocdJalankan perintah berikut untuk menanyakan alamat IP publik multi-cluster gateway:
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"Jalankan perintah berikut untuk menanyakan informasi pengalihan trafik.
Ganti
XX.XX.XX.XXdengan alamat IP publik multi-cluster gateway yang Anda dapatkan di langkah sebelumnya.for i in {1..50}; do curl -H "host: example.com" XX.XX.XX.XX/svc1-w; sleep 1; doneKeluaran yang Diharapkan:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster2 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster2 ! Config file is This is env cluster1 ! Config file is ...Keluaran menunjukkan bahwa 90% trafik didistribusikan ke Kluster 1 dan 10% trafik didistribusikan ke Kluster 2.