All Products
Search
Document Center

Alibaba Cloud Service Mesh:Migrasi Nginx Ingress yang menggunakan instans CLB ke gerbang ASM

Last Updated:Mar 12, 2026

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.

Migration architecture

Migrasi ini mencakup lima langkah:

  1. Lepaskan CLB dari NGINX Ingress — Siapkan instans CLB yang ada agar dapat digunakan bersama oleh NGINX Ingress dan gerbang ASM.

  2. Buat gerbang ASM — Deploy gerbang masuk ASM dan sambungkan ke CLB yang sama dengan bobot awal 0 (tanpa traffic).

  3. Konversi resource Ingress menjadi konfigurasi Istio — Terjemahkan aturan NGINX Ingress menjadi resource Istio Gateway dan VirtualService.

  4. Verifikasi konfigurasi — Kirim traffic uji untuk memastikan gerbang ASM mengarahkan permintaan dengan benar.

  5. Alihkan traffic — Secara bertahap tingkatkan bobot gerbang ASM hingga menangani seluruh traffic.

Catatan

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-id

Output yang diharapkan:

service.k8s.alibaba/loadbalancer-id: lb-bp1gts52ced2vgaw1ni78

Catat ID instans CLB (misalnya, lb-bp1gts52ced2vgaw1ni78). Anda akan memerlukannya pada langkah-langkah berikutnya.

Perbarui pengaturan CLB di Konsol

  1. Buka Server Load Balancer console.

  2. Temukan instans CLB Anda dan lakukan perubahan berikut:

    • Nonaktifkan mode baca-saja konfigurasi.

    • Hapus tag kubernetes.do.not.delete dan ack.aliyun.com.

    • Ubah nama kelompok vServer yang diawali dengan k8s/ ke format shared-<port>. Misalnya, ubah k8s/80/nginx-ingress-lb/kube-system/c553a74e6ad13423aa839c8e5******** menjadi shared-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:

PlaceholderDeskripsiContoh
<your-clb-instance-id>ID instans CLB dari langkah sebelumnyalb-bp1gts52ced2vgaw1ni78
<your-vgroup-id-1>ID kelompok vServer untuk port 80rsp-bp1k5xxxxxxx
<your-vgroup-id-2>ID kelompok vServer untuk port 443rsp-bp1k5yyyyyyy
Penting

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:

AnotasiNilaiTujuan
alibaba-cloud-loadbalancer-idID instans CLB AndaMenggunakan 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-portID kelompok vServer dan pemetaan portMengarahkan 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.com

Istio 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: 80

Perbedaan utama antara Ingress dan VirtualService

Tabel berikut merangkum pemetaan antara field NGINX Ingress dan padanan Istio VirtualService-nya:

AspekNGINX IngressIstio VirtualService
Target routingserviceName dan servicePortdestination.host dan destination.port.number
Penulisan ulang URLrewrite-target annotationrewrite.uri field
Pencocokan hostrules[].hosthosts[]
Pengikatan gerbangImplisit (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 IngressPadanan IstioJenis resource
nginx.ingress.kubernetes.io/rewrite-targethttp[].rewrite.uriVirtualService
nginx.ingress.kubernetes.io/ssl-redirecttls section in GatewayGateway
nginx.ingress.kubernetes.io/proxy-read-timeouttimeout fieldVirtualService
nginx.ingress.kubernetes.io/upstream-hash-byconsistentHash in trafficPolicyDestinationRule
nginx.ingress.kubernetes.io/cors-enablecorsPolicy fieldVirtualService

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.local
Catatan

Tempatkan 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-envoy

Header 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:

TahapBobot gerbang ASMBobot NGINX IngressTindakan
1199Verifikasi dengan traffic produksi minimal
21090Pantau laju error dan latensi
35050Konfirmasi perilaku steady-state
41000Selesaikan 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 ini

Bobot 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.