Selama proses iterasi dan peningkatan layanan, rilis canary diperlukan untuk memastikan stabilitas sistem. Application Load Balancer (ALB) Ingress mendukung penggunaan anotasi canary untuk mengimplementasikan rilis canary berdasarkan header, cookie, dan bobot. Urutan prioritas aturan rilis canary adalah sebagai berikut: berbasis header > berbasis cookie > berbasis bobot. Jika Anda mengonfigurasi beberapa aturan secara bersamaan, aturan dengan prioritas tertinggi akan diterapkan terlebih dahulu.
Prasyarat
Dua vSwitch yang berada di zona berbeda dibuat dan ditempatkan di virtual private cloud (VPC) yang sama dengan klaster ACK. Pastikan zona didukung oleh Application Load Balancer (ALB). Untuk informasi lebih lanjut, lihat Buat dan Kelola vSwitch.
Kontroler ALB Ingress diinstal di klaster. Untuk informasi lebih lanjut, lihat Kelola Kontroler ALB Ingress.
CatatanUntuk menggunakan ALB Ingress dalam mengakses layanan yang diterapkan di klaster khusus ACK, Anda perlu memberikan izin yang diperlukan oleh kontroler ALB Ingress kepada klaster tersebut terlebih dahulu. Untuk informasi lebih lanjut, lihat Otorisasi Klaster Khusus ACK untuk Mengakses Kontroler ALB Ingress.
Sebuah AlbConfig dibuat. Untuk informasi lebih lanjut, lihat Buat Sebuah AlbConfig.
Klien kubectl terhubung ke klaster ACK. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig dari Klaster dan Gunakan kubectl untuk Terhubung ke Klaster.
Catatan Penggunaan
Aturan berbasis header dan berbasis cookie tidak dapat dikonfigurasikan bersamaan dengan aturan berbasis bobot pada Ingress yang sama. Anda harus mengonfigurasikannya pada dua Ingress terpisah atau menggunakan aturan routing kustom.
Saat menggunakan anotasi canary untuk melakukan rilis canary, urutan efektif aturan routing ALB Ingress bergantung pada urutan leksikografis dari
namespace atau nama Ingress. Untuk memastikan bahwa aturan rilis canary diterapkan dalam urutan yang benar, Anda dapat menggunakan anotasialb.ingress.kubernetes.io/orderuntuk menentukan urutan. Nilai valid darialb.ingress.kubernetes.io/orderadalah 1 hingga 1.000. Nilai defaultnya adalah 10. Semakin kecil nilainya, semakin tinggi prioritasnya. Misalnya, jika Anda ingin meningkatkan prioritas suatu Ingress, kurangi nilai dari pengaturanalb.ingress.kubernetes.io/order-nya.Anda dapat menggunakan aturan routing kustom untuk melakukan rilis canary berdasarkan kondisi routing yang lebih kompleks. Untuk informasi lebih lanjut, lihat Kustomisasi Aturan Routing ALB Ingress.
Langkah 1: Buat aplikasi
Terapkan Layanan bernama tea.
Buat file bernama tea-deploy.yaml dan salin konten berikut ke dalam file:
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: 80Jalankan perintah berikut untuk menerapkan Layanan tea:
kubectl apply -f tea-deploy.yaml
Terapkan Layanan bernama tea-svc.
Buat file bernama tea-svc.yaml dan salin konten berikut ke dalam file:
apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePortJalankan perintah berikut untuk menerapkan Layanan tea-svc:
kubectl apply -f tea-svc.yaml
Terapkan Ingress bernama tea-ingress.
Buat file bernama tea-ingress.yaml dan salin konten berikut ke dalam file:
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 dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. http: paths: - path: / pathType: Prefix backend: service: name: tea-svc port: number: 80Jalankan perintah berikut untuk menerapkan Ingress:
kubectl apply -f tea-ingress.yaml
Langkah 2: Lakukan rilis canary untuk versi baru Layanan
Terapkan versi baru layanan dan Ingress baru sehingga ketika header permintaan adalah location: hz, lalu lintas diarahkan ke layanan canary versi baru. Permintaan dengan header lain atau tanpa header akan diarahkan ke layanan canary versi baru dengan bobot 50%.
Terapkan versi baru layanan bernama canary.
Buat file bernama canary-deploy.yaml dan salin konten berikut ke dalam file:
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: 80Jalankan perintah berikut untuk menerapkan layanan canary:
kubectl apply -f canary-deploy.yaml
Terapkan layanan bernama canary-svc.
Buat file bernama canary-svc.yaml dan salin konten berikut ke dalam file:
apiVersion: v1 kind: Service metadata: name: canary-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: canary type: NodePortJalankan perintah berikut untuk menerapkan layanan canary-svc:
kubectl apply -f canary-svc.yaml
Terapkan Ingress untuk merutekan permintaan berdasarkan header.
Buat file bernama canary-header-ingress.yaml dan salin konten berikut ke dalam file:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-by-header: "location" alb.ingress.kubernetes.io/canary-by-header-value: "hz" name: canary-header-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Ganti dengan nama domain Anda dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: PrefixSetel alb.ingress.kubernetes.io/canary ke true untuk mengaktifkan anotasi canary.
Setel alb.ingress.kubernetes.io/canary-by-header dan alb.ingress.kubernetes.io/canary-by-header-value ke kunci dan nilai header yang ingin dicocokkan. Dalam contoh ini, pasangan KV header disetel ke
location: hz. Semua permintaan yang membawa headerlocation: hzdiarahkan ke versi baru layanan. Permintaan yang membawa header lain dicocokkan dengan aturan rilis canary lain berdasarkan prioritas aturan dan kemudian diarahkan ke versi layanan yang sesuai dengan aturan yang cocok.
Jalankan perintah berikut untuk menerapkan Ingress untuk merutekan permintaan berdasarkan header:
kubectl apply -f canary-header-ingress.yaml
Terapkan Ingress untuk merutekan permintaan berdasarkan bobot.
Buat file bernama canary-weight-ingress.yaml dan salin konten berikut ke dalam file:
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 # Ganti dengan nama domain Anda dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefixalb.ingress.kubernetes.io/canary-weight: Menentukan persentase lalu lintas yang diarahkan ke versi baru layanan. Dalam contoh ini, nilainya disetel ke 50, yang menunjukkan bahwa 50% lalu lintas diarahkan ke versi baru layanan.
Jalankan perintah berikut untuk menerapkan Ingress untuk merutekan permintaan berdasarkan bobot:
kubectl apply -f canary-weight-ingress.yaml
Periksa apakah rilis canary berhasil.
Jalankan perintah berikut untuk menanyakan alamat IP instance 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 7m5sJalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header
location: hzke layanan:curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comOutput yang diharapkan:
newnewdikembalikan untuk permintaan yang membawa headerlocation: hz. Permintaan yang membawa headerlocation: hzdiarahkan ke versi baru layanan.Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang tidak membawa header ke layanan:
curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comnewdikembalikan untuk 50% permintaan yang tidak membawa header danolddikembalikan untuk sisa 50% permintaan. 50% permintaan yang tidak membawa header diarahkan ke versi baru layanan.Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header
location: bjke layanan:curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comnewdikembalikan untuk 50% permintaan yang membawa headerlocation: bjdanolddikembalikan untuk sisa 50% permintaan. 50% permintaan yang membawa headerlocation: bjdiarahkan ke versi baru layanan.
Semua permintaan yang membawa header
location: hzdiarahkan ke versi baru layanan bernama canary. Hanya 50% permintaan yang membawa header lain dan tidak membawa header yang diarahkan ke versi baru layanan. Rilis canary berhasil.
Langkah 3: Deprecate versi lama Layanan
Setelah versi baru layanan berjalan seperti yang diharapkan selama periode waktu tertentu, Anda perlu mendeprecate versi lama layanan dan hanya menyimpan versi baru layanan. Untuk melakukannya, ubah layanan di Ingress versi lama menjadi versi baru layanan sehingga Ingress dapat merutekan lalu lintas ke versi baru layanan. Kemudian, hapus Ingress canary.
Jalankan perintah berikut untuk memodifikasi file tea-ingress.yaml:
vim tea-ingress.yamlJalankan perintah berikut untuk mengubah layanan di file tea-ingress.yaml dari tea-svc menjadi canary-svc:
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 dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. http: paths: - path: / pathType: Prefix backend: service: name: canary-svc # Ubah tea-svc menjadi canary-svc. port: number: 80Jalankan perintah berikut agar Ingress yang dimodifikasi berlaku:
kubectl apply -f tea-ingress.yamlPeriksa apakah versi lama layanan telah dideprecate.
Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header
location: hzke layanan:curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comOutput yang diharapkan:
newnewdikembalikan untuk permintaan yang membawa headerlocation: hz. Permintaan yang membawa headerlocation: hzdiarahkan ke versi baru layanan.Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang tidak membawa header ke layanan:
curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comOutput yang diharapkan:
newnewdikembalikan untuk permintaan yang tidak membawa header. Permintaan yang tidak membawa header diarahkan ke versi baru layanan.Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header
location: bjke layanan:curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comOutput yang diharapkan:
newnewdikembalikan untuk permintaan yang membawa headerlocation: bj. Permintaan yang membawa headerlocation: bjdiarahkan ke versi baru layanan.
Permintaan yang membawa header
location: hz, permintaan yang membawa header lain, dan permintaan yang tidak membawa header semuanya diarahkan ke versi baru layanan. Versi lama layanan telah dideprecate.Jalankan perintah berikut untuk menghapus Ingress canary bernama canary-weight-ingress dan canary-header-ingress:
kubectl delete ing canary-weight-ingress canary-header-ingress