Saat mengadopsi Alibaba Cloud Service Mesh (ASM), Anda perlu memindahkan penanganan traffic ingress dari NGINX Ingress Controller ke gerbang masuk ASM. Panduan ini menjelaskan proses migrasi tanpa downtime dengan memanfaatkan kembali instans Classic Load Balancer (CLB) dan alamat IP yang sudah ada, sehingga rekaman DNS tetap tidak berubah. Jika terjadi masalah kapan pun, Anda dapat mengatur ulang bobot untuk mengarahkan seluruh traffic kembali ke NGINX Ingress secara langsung.
Cara kerja
NGINX Ingress Controller dan gerbang masuk ASM dijalankan secara berdampingan di belakang instans CLB yang sama. Distribusi traffic di antara keduanya dikendalikan oleh bobot backend CLB. Proses dimulai dengan seluruh traffic diarahkan ke NGINX Ingress, lalu secara bertahap dialihkan ke gerbang ASM, dan NGINX Ingress dinonaktifkan setelah migrasi selesai.

Migrasi ini mencakup lima langkah:
Lepaskan CLB dari NGINX Ingress — Siapkan instans CLB yang ada agar dapat digunakan bersama oleh NGINX Ingress dan gerbang ASM.
Buat gerbang ASM — Deploy gerbang masuk ASM dan sambungkan ke CLB yang sama dengan bobot awal 0 (tanpa traffic).
Konversi resource Ingress menjadi konfigurasi Istio — Terjemahkan aturan NGINX Ingress menjadi resource Istio Gateway dan VirtualService.
Verifikasi konfigurasi — Kirim traffic uji untuk memastikan gerbang ASM mengarahkan permintaan dengan benar.
Alihkan traffic — Secara bertahap tingkatkan bobot gerbang ASM hingga menangani seluruh traffic.
Karena kedua gerbang berbagi CLB yang sama, alamat IP eksternal dan rekaman DNS tetap tidak berubah selama migrasi. NGINX Ingress terus melayani traffic produksi hingga Anda secara eksplisit mengubah bobot. Untuk rollback kapan pun, atur bobot gerbang ASM ke 0 dan bobot NGINX Ingress ke 100.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM Edisi Perusahaan atau Edisi Ultimate versi terbaru. Untuk informasi lebih lanjut, lihat Buat instans ASM
Kluster Container Service for Kubernetes (ACK) yang telah ditambahkan ke instans ASM. Untuk informasi lebih lanjut, lihat Tambahkan kluster ke instans ASM
Langkah 1: Jadikan instans CLB NGINX Ingress dapat digunakan kembali
Secara default, ACK mengelola instans CLB untuk NGINX Ingress dan mencegah perubahan manual. Untuk berbagi CLB ini dengan gerbang ASM, lepaskan terlebih dahulu dari pengelolaan ACK.
Dapatkan ID instans CLB
Jalankan perintah berikut untuk mengambil ID instans CLB:
kubectl -n kube-system get svc nginx-ingress-lb -o yaml | grep service.k8s.alibaba/loadbalancer-idOutput yang diharapkan:
service.k8s.alibaba/loadbalancer-id: lb-bp1gts52ced2vgaw1ni78Catat ID instans CLB (misalnya, lb-bp1gts52ced2vgaw1ni78). Anda akan memerlukannya pada langkah-langkah berikutnya.
Perbarui pengaturan CLB di Konsol
Buka Server Load Balancer console.
Temukan instans CLB Anda dan lakukan perubahan berikut:
Nonaktifkan mode baca-saja konfigurasi.
Hapus tag
kubernetes.do.not.deletedanack.aliyun.com.Ubah nama kelompok vServer yang diawali dengan
k8s/ke formatshared-<port>. Misalnya, ubahk8s/80/nginx-ingress-lb/kube-system/c553a74e6ad13423aa839c8e5********menjadishared-80.
Tambahkan anotasi ke Service NGINX Ingress
Tambahkan anotasi berikut ke Service NGINX Ingress agar merujuk secara eksplisit ke CLB, bukan mengandalkan penemuan yang dikelola ACK:
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "<your-clb-instance-id>"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "<your-vgroup-id-1>:80,<your-vgroup-id-2>:443"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"Ganti placeholder berikut dengan nilai aktual:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<your-clb-instance-id> | ID instans CLB dari langkah sebelumnya | lb-bp1gts52ced2vgaw1ni78 |
<your-vgroup-id-1> | ID kelompok vServer untuk port 80 | rsp-bp1k5xxxxxxx |
<your-vgroup-id-2> | ID kelompok vServer untuk port 443 | rsp-bp1k5yyyyyyy |
Gunakan ID kelompok vServer (bukan nama tampilan seperti shared-80). Untuk menemukan ID tersebut, periksa detail kelompok vServer di Server Load Balancer console.
Langkah 2: Buat gerbang ASM
Buat gerbang ASM menggunakan YAML. Untuk menghasilkan file YAML dasar, buka halaman pembuatan gerbang ASM di Konsol ASM, konfigurasikan formulir visual, lalu klik tombol preview.
Edit bagian serviceAnnotations untuk menggunakan kembali instans CLB yang sama. Anotasi ini identik dengan Langkah 1, kecuali bobotnya diatur ke "0", sehingga gerbang ASM tidak menerima traffic pada awalnya.
serviceAnnotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "<your-clb-instance-id>"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "<your-vgroup-id>:80"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"Tabel berikut menjelaskan setiap anotasi:
| Anotasi | Nilai | Tujuan |
|---|---|---|
alibaba-cloud-loadbalancer-id | ID instans CLB Anda | Menggunakan kembali CLB yang sudah ada |
alibaba-cloud-loadbalancer-force-override-listeners | "false" | Mencegah Istio mengganti listener CLB yang sudah ada (Istio secara default mengganti listener) |
alibaba-cloud-loadbalancer-vgroup-port | ID kelompok vServer dan pemetaan port | Mengarahkan traffic ke kelompok backend yang benar |
alibaba-cloud-loadbalancer-weight | "0" | Memulai tanpa traffic pada gerbang ASM |
Langkah 3: Konversi resource Ingress menjadi konfigurasi Istio
Terjemahkan setiap resource NGINX Ingress menjadi pasangan Istio Gateway dan VirtualService. Contoh berikut menunjukkan cara mengonversi aturan Ingress dasar dengan penulisan ulang URL.
NGINX Ingress (sebelum)
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: helloworld
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- backend:
serviceName: helloworld
servicePort: 80
path: /helloworld(/|$)(.*)
host: example.comIstio VirtualService (setelah)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: example-vs
spec:
gateways:
- istio-system/ingressgateway # Ganti dengan nama gerbang ASM Anda
hosts:
- example.com
http:
- name: route-helloworld
match:
- uri:
prefix: /helloworld/
- uri:
prefix: /helloworld
rewrite:
uri: /
route:
- destination:
host: helloworld
port:
number: 80Perbedaan utama antara Ingress dan VirtualService
Tabel berikut merangkum pemetaan antara field NGINX Ingress dan padanan Istio VirtualService-nya:
| Aspek | NGINX Ingress | Istio VirtualService |
|---|---|---|
| Target routing | serviceName dan servicePort | destination.host dan destination.port.number |
| Penulisan ulang URL | rewrite-target annotation | rewrite.uri field |
| Pencocokan host | rules[].host | hosts[] |
| Pengikatan gerbang | Implisit (controller Ingress) | Eksplisit (gateways[] field) |
Padanan anotasi NGINX Ingress umum
Jika Anda menggunakan anotasi NGINX Ingress advanced, lihat tabel berikut untuk padanan Istio-nya:
| Anotasi NGINX Ingress | Padanan Istio | Jenis resource |
|---|---|---|
nginx.ingress.kubernetes.io/rewrite-target | http[].rewrite.uri | VirtualService |
nginx.ingress.kubernetes.io/ssl-redirect | tls section in Gateway | Gateway |
nginx.ingress.kubernetes.io/proxy-read-timeout | timeout field | VirtualService |
nginx.ingress.kubernetes.io/upstream-hash-by | consistentHash in trafficPolicy | DestinationRule |
nginx.ingress.kubernetes.io/cors-enable | corsPolicy field | VirtualService |
Routing lintas namespace
Jika VirtualService dan Service target berada dalam namespace yang sama, gunakan nama layanan singkat (misalnya, helloworld). Jika berada dalam namespace berbeda, gunakan format Fully Qualified Domain Name (FQDN):
<service-name>.<namespace>.svc.cluster.localTempatkan VirtualService dan DestinationRule dalam namespace yang sama dengan Deployment Service target bila memungkinkan. Hal ini menyederhanakan konfigurasi routing dan menghindari kebutuhan FQDN.
Langkah 4: Verifikasi konfigurasi
Sebelum mengalihkan traffic produksi, verifikasi bahwa gerbang ASM menangani permintaan dengan benar.
Opsi A: Uji melalui CLB temporary
Buat instans CLB baru dan arahkan ke gerbang masuk ASM. Kirim permintaan uji ke CLB ini:
curl -s -I -H "Host: example.com" http://<test-clb-ip>/helloworld/Output yang diharapkan (header utama):
HTTP/1.1 200 OK
server: istio-envoyHeader server: istio-envoy mengonfirmasi bahwa traffic mengalir melalui gerbang ASM.
Opsi B: Uji dari dalam kluster
Kirim permintaan langsung ke Service gerbang masuk ASM dalam kluster:
# Dapatkan ClusterIP gerbang masuk ASM
GATEWAY_IP=$(kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.clusterIP}')
# Kirim permintaan uji
curl -s -I -H "Host: example.com" http://$GATEWAY_IP/helloworld/Pastikan responsnya sesuai dengan respons yang dikembalikan NGINX Ingress untuk permintaan yang sama. Header server: istio-envoy dalam respons menunjukkan bahwa traffic mengalir melalui gerbang ASM.
Langkah 5: Alihkan traffic dari NGINX Ingress ke gerbang ASM
Setelah verifikasi, alihkan traffic produksi secara bertahap ke gerbang ASM dengan menyesuaikan bobot backend CLB.
Jadwal migrasi yang direkomendasikan
Tingkatkan bobot gerbang ASM secara bertahap dan pantau pada setiap tahap:
| Tahap | Bobot gerbang ASM | Bobot NGINX Ingress | Tindakan |
|---|---|---|---|
| 1 | 1 | 99 | Verifikasi dengan traffic produksi minimal |
| 2 | 10 | 90 | Pantau laju error dan latensi |
| 3 | 50 | 50 | Konfirmasi perilaku steady-state |
| 4 | 100 | 0 | Selesaikan migrasi |
Sesuaikan bobot
Bobot gerbang ASM: Perbarui anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight dalam serviceAnnotations IstioGateway:
serviceAnnotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "50" # Sesuaikan nilai iniBobot NGINX Ingress: Perbarui anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight pada Service NGINX Ingress. Jika anotasi ini belum dikonfigurasi, sesuaikan bobot langsung di CLB console.
Rollback
Jika terjadi masalah selama migrasi traffic, atur kembali bobot gerbang ASM ke "0" dan bobot NGINX Ingress ke "100":
# Gerbang ASM: hentikan penerimaan traffic
serviceAnnotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"# Service NGINX Ingress: pulihkan traffic penuh
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"Seluruh traffic langsung kembali ke NGINX Ingress. Tidak diperlukan perubahan DNS karena kedua gerbang berbagi instans CLB yang sama.