Saat memperbarui layanan, gunakan rilis canary untuk menjaga stabilitas sistem. Ingress ALB mendukung anotasi canary berdasarkan header, cookie, atau bobot (prioritas: header > cookie > bobot). Arahkan sebagian lalu lintas ke versi layanan baru di lingkungan produksi, lakukan validasi, lalu promosikan saat siap.
Prasyarat
Lengkapi hal-hal berikut:
-
Dua vSwitch di zona berbeda dalam VPC yang sama dengan kluster ACK. Lihat Buat dan kelola vSwitch.
-
ALB Ingress controller telah diinstal di kluster. Lihat Kelola ALB Ingress controller.
Untuk cluster khusus ACK, berikan izin kepada kluster untuk mengakses ALB Ingress. Lihat Otorisasi cluster khusus ACK untuk mengakses ALB Ingress controller.
-
AlbConfig telah dibuat. Lihat Buat AlbConfig.
-
kubectl telah terhubung ke kluster ACK. Lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Anotasi canary
Setiap Ingress canary harus memiliki anotasi alb.ingress.kubernetes.io/canary: "true". Tanpa anotasi ini, Ingress canary akan bentrok dengan Ingress produksi alih-alih melakukan routing secara paralel.
Anotasi berikut mengontrol pemisahan lalu lintas:
| Anotasi | Deskripsi |
|---|---|
alb.ingress.kubernetes.io/canary |
Menandai Ingress sebagai canary. Atur ke "true". Wajib ada pada setiap Ingress canary. |
alb.ingress.kubernetes.io/canary-by-header |
Kunci header permintaan yang dicocokkan. Permintaan yang cocok diarahkan ke layanan canary. |
alb.ingress.kubernetes.io/canary-by-header-value |
Nilai header yang dicocokkan. Memerlukan canary-by-header; diabaikan jika anotasi tersebut tidak disetel. |
alb.ingress.kubernetes.io/canary-weight |
Persentase traffic (0–100) untuk layanan canary ketika tidak ada aturan header atau cookie yang cocok. 0 tidak mengirimkan apa pun; 100 mengirimkan seluruhnya. |
alb.ingress.kubernetes.io/order |
Urutan evaluasi aturan routing. Nilai valid: 1–1000. Default: 10. Nilai lebih rendah memiliki prioritas lebih tinggi. Tanpa anotasi ini, urutan mengikuti namespace dan nama Ingress secara leksikografis. |
Prioritas aturan: berbasis header > berbasis cookie > berbasis bobot.
Catatan penggunaan
-
Aturan berbasis header dan cookie tidak dapat berada dalam satu Ingress yang sama dengan aturan berbasis bobot. Gunakan Ingress terpisah atau aturan routing kustom untuk kondisi kompleks.
-
Host Ingress canary harus identik dengan host Ingress produksi.
-
Tetapkan prioritas eksplisit menggunakan
alb.ingress.kubernetes.io/orderketika beberapa Ingress canary berbagi host, alih-alih mengandalkan pengurutan leksikografis.
Langkah 1: Sebarkan layanan produksi
Sebarkan Penyebaran (Deployment), Service, dan Ingress produksi.
-
Buat
tea-deploy.yamldan terapkan:apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 1 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest ports: - containerPort: 80kubectl apply -f tea-deploy.yaml -
Buat
tea-svc.yamldan terapkan:apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePortkubectl apply -f tea-svc.yaml -
Buat
tea-ingress.yamldan terapkan:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Ganti dengan nama domain Anda, yang di-resolve ke IP load balancer. http: paths: - path: / pathType: Prefix backend: service: name: tea-svc port: number: 80kubectl apply -f tea-ingress.yaml
Langkah 2: Sebarkan layanan canary dan aturan routing
Sebarkan layanan canary dengan dua Ingress canary: satu melakukan routing berdasarkan header, satunya membagi lalu lintas sisa berdasarkan bobot.
Sebelum menerapkan Ingress canary:
-
Tetapkan
alb.ingress.kubernetes.io/canary: "true"pada setiap Ingress canary. Tanpa itu, Ingress canary akan bentrok dengan Ingress produksi. -
Bidang
hostharus identik dengan host Ingress produksi (demo.domain.ingress.topdalam contoh ini). -
Aturan berbasis header dan berbasis bobot harus berada pada Ingress terpisah.
-
Buat
canary-deploy.yamldan terapkan:apiVersion: apps/v1 kind: Deployment metadata: name: canary spec: replicas: 1 selector: matchLabels: app: canary template: metadata: labels: app: canary spec: containers: - name: canary image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx:latest ports: - containerPort: 80kubectl apply -f canary-deploy.yaml -
Buat
canary-svc.yamldan terapkan:apiVersion: v1 kind: Service metadata: name: canary-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: canary type: NodePortkubectl apply -f canary-svc.yaml -
Buat Ingress canary berbasis header. Permintaan dengan
location: hzdiarahkan kecanary-svc; header lain dilewatkan ke aturan berikutnya. Buatcanary-header-ingress.yamldan terapkan:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-weight: "50" name: canary-weight-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Harus sama persis dengan host Ingress produksi. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefixkubectl apply -f canary-header-ingress.yaml -
Buat Ingress canary berbasis bobot. Permintaan yang tidak cocok dibagi 50/50 antara layanan produksi dan canary. Buat
canary-weight-ingress.yamldan terapkan:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-weight: "50" name: canary-weight-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Harus persis sama dengan host Ingress produksi. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefixkubectl apply -f canary-weight-ingress.yaml
Verifikasi rilis canary
-
Dapatkan alamat instans ALB:
kubectl get ingOutput yang diharapkan:
NAME CLASS HOSTS ADDRESS PORTS AGE canary-header-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m23s canary-weight-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m16s tea-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 7m5s -
Verifikasi bahwa permintaan yang membawa
location: hzselalu mencapai canary:for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneSemua 10 tanggapan mengembalikan
new. Aturan header memiliki prioritas tertinggi dan mengarahkan semua permintaan yang cocok ke canary. -
Verifikasi bahwa permintaan tanpa header yang cocok dibagi ~50/50:
for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneTanggapan bergantian antara
new(canary) danold(produksi), kira-kira separuh-separuh. Header yang tidak cocok (misalnya,location: bj) mengikuti pemisahan berbasis bobot yang sama.
Langkah 3: Promosikan versi baru
Setelah canary stabil, alihkan seluruh lalu lintas produksi ke layanan baru dan hapus Ingress canary.
-
Perbarui
tea-ingress.yamlagar mengarah kecanary-svc:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top http: paths: - path: / pathType: Prefix backend: service: name: canary-svc # Diubah dari tea-svc. port: number: 80kubectl apply -f tea-ingress.yaml -
Hapus Ingress canary:
kubectl delete ing canary-weight-ingress canary-header-ingress -
Verifikasi bahwa seluruh lalu lintas mencapai versi baru:
for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneSemua 10 tanggapan mengembalikan
new. Versi layanan lama sepenuhnya ditinggalkan.
Langkah selanjutnya
-
Lihat Konfigurasi Ingress ALB lanjutan untuk pengalihan HTTP ke HTTPS, aturan routing kustom, dan lainnya.
-
Lihat FAQ Ingress untuk troubleshooting.