Rilis canary adalah strategi peluncuran perangkat lunak yang umum digunakan. Ini memungkinkan Anda secara bertahap mendorong versi layanan baru ke semua pengguna guna memastikan stabilitas sistem di lingkungan produksi selama iterasi layanan. Application Load Balancer (ALB) Ingresses memungkinkan Anda menggunakan anotasi canary untuk melakukan rilis canary berdasarkan header, cookie, dan bobot. Topik ini menjelaskan cara menambahkan anotasi canary ke ALB Ingress untuk melaksanakan rilis canary.
Prasyarat
Sebuah kluster ACS telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ACS.
Kontroler ALB Ingress telah diinstal di kluster ACS. Untuk informasi lebih lanjut, lihat Kelola Kontroler ALB Ingress.
AlbConfig dan IngressClass telah dibuat. Untuk informasi lebih lanjut, lihat Buat AlbConfig dan Buat IngressClass.
Sambungkan ke kluster ACS Anda. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig dari Kluster dan Gunakan kubectl untuk Menyambungkan ke Kluster dan Gunakan kubectl pada Cloud Shell untuk Mengelola Kluster ACS.
Pertimbangan
Prioritas aturan rilis canary yang dilaksanakan berdasarkan anotasi canary adalah sebagai berikut: Header > Cookie > Bobot. Saat semua kebijakan di atas dikonfigurasi, aturan berbasis header akan diprioritaskan. Untuk informasi lebih lanjut tentang anotasi canary, lihat Anotasi Canary ALB Ingress.
Aturan berbasis header dan cookie tidak dapat dikonfigurasikan dengan aturan berbasis bobot pada Ingress yang sama. Anda harus mengonfigurasikannya pada dua Ingress terpisah atau menggunakan aturan routing kustom. Anda dapat menggunakan aturan routing kustom untuk melakukan rilis canary berdasarkan kondisi routing yang lebih kompleks. Untuk informasi lebih lanjut, lihat Sesuaikan Aturan Routing ALB Ingress.
Saat menggunakan anotasi canary untuk melakukan rilis canary, urutan efektif aturan routing ALB Ingress bergantung pada urutan leksikografis dari
Ingress namespaces atau names. Untuk memastikan bahwa aturan rilis canary diterapkan dalam urutan yang benar, Anda dapat menggunakan anotasialb.ingress.kubernetes.io/orderuntuk mendefinisikan urutan. Nilai valid darialb.ingress.kubernetes.io/orderadalah 1 hingga 1000. Nilai defaultnya adalah 10. Semakin kecil nilainya, semakin tinggi prioritasnya. Misalnya, jika Anda ingin meningkatkan prioritas suatu Ingress, Anda dapat mengurangi nilai pengaturanalb.ingress.kubernetes.io/order-nya.
Langkah 1: Buat aplikasi
Sebarkan Service bernama tea.
Buat file bernama tea-deploy.yaml dan salin konten berikut ke file tersebut:
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 Service tea:
kubectl apply -f tea-deploy.yaml
Sebarkan Service bernama tea-svc.
Buat file bernama tea-svc.yaml dan salin konten berikut ke file tersebut:
apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: ClusterIPJalankan perintah berikut untuk menerapkan Service tea-svc:
kubectl apply -f tea-svc.yaml
Sebarkan Ingress bernama tea-ingress.
Buat file bernama tea-ingress.yaml dan salin konten berikut ke file tersebut:
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 diselesaikan 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
Verifikasi bahwa penerapan berhasil.
Jalankan perintah berikut untuk mengakses Service.
curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comHasil yang Diharapkan:
old
Langkah 2: Lakukan rilis canary untuk versi layanan baru
Sebarkan versi layanan baru dan Ingress baru untuk merutekan semua permintaan yang membawa header location: hz ke versi layanan baru bernama canary dan merutekan 50% dari permintaan lainnya ke versi layanan baru. Permintaan lainnya termasuk permintaan yang membawa header lain dan permintaan yang tidak membawa header.
Sebarkan versi layanan baru bernama canary.
Buat file bernama canary-deploy.yaml dan salin konten berikut ke file tersebut:
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 Service canary:
kubectl apply -f canary-deploy.yaml
Sebarkan Service bernama canary-svc.
Buat file bernama canary-svc.yaml dan salin konten berikut ke file tersebut:
apiVersion: v1 kind: Service metadata: name: canary-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: canary type: ClusterIPJalankan perintah berikut untuk menerapkan Service canary-svc:
kubectl apply -f canary-svc.yaml
Sebarkan Ingress untuk merutekan permintaan berdasarkan header.
Buat file bernama canary-header-ingress.yaml dan salin konten berikut ke file tersebut:
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 diselesaikan 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 Anda cocokkan. Dalam contoh ini, pasangan KV header disetel ke
location: hz. Semua permintaan yang membawa headerlocation: hzdirutekan ke versi layanan baru. Permintaan yang membawa header lain dicocokkan dengan aturan rilis canary lainnya berdasarkan prioritas aturan dan kemudian dirutekan ke versi layanan yang terkait dengan aturan yang cocok.
Jalankan perintah berikut untuk menerapkan Ingress untuk merutekan permintaan berdasarkan header:
kubectl apply -f canary-header-ingress.yaml
Sebarkan Ingress untuk merutekan permintaan berdasarkan bobot.
Buat file bernama canary-weight-ingress.yaml dan salin konten berikut ke file tersebut:
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 diselesaikan 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 dirutekan ke versi layanan baru. Dalam contoh ini, nilainya disetel ke 50, yang menunjukkan bahwa 50% lalu lintas dirutekan ke versi layanan baru.
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 ingressHasil 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 dengan header
location: hzke Service:curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comHasil yang Diharapkan:
newNilai
newdikembalikan untuk permintaan yang mencakup headerlocation: hz. Permintaan dengan headerlocation: hzdiarahkan ke versi layanan baru.Jalankan perintah berikut beberapa kali untuk mengirim permintaan tanpa header ke Service:
curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comnewdikembalikan untuk 50% permintaan tanpa header, sedangkanolddikembalikan untuk sisanya. Sebanyak 50% permintaan tanpa header akan dirutekan ke versi layanan baru.Jalankan perintah berikut beberapa kali untuk mengirim permintaan dengan header
location: bjke Service:curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comnewdikembalikan untuk 50% permintaan yang menyertakan headerlocation: bj, sedangkanolddikembalikan untuk sisa 50%. Permintaan yang membawa headerlocation: bjsebesar 50% akan dirutekan ke versi layanan baru.
Semua permintaan dengan header
location: hzdiarahkan ke versi layanan baru bernama canary. Hanya 50% dari permintaan dengan header lain, yang tidak membawa header tersebut, yang diarahkan ke versi layanan baru. Rilis canary berhasil.
Langkah 3: Deprecate versi layanan lama
Setelah versi layanan baru beroperasi sesuai harapan selama periode tertentu, Anda perlu mendeprecate versi layanan lama dan hanya mempertahankan versi layanan baru. Untuk melakukannya, ubah Service dalam Ingress versi layanan lama menjadi versi layanan baru agar Ingress dapat merutekan lalu lintas ke versi layanan baru. Kemudian, hapus Ingress canary.
Jalankan perintah berikut untuk memodifikasi file tea-ingress.yaml:
vim tea-ingress.yamlJalankan perintah berikut untuk mengubah Service dalam 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 diselesaikan 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 diterapkan:
kubectl apply -f tea-ingress.yamlPeriksa apakah versi layanan lama telah didiskreditkan.
Jalankan perintah berikut beberapa kali untuk mengirim permintaan dengan header
location: hzke Service:curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comHasil yang Diharapkan:
newnewdikembalikan untuk permintaan dengan headerlocation: hz. Permintaan dengan headerlocation: hzdirutekan ke versi layanan baru.Jalankan perintah berikut beberapa kali untuk mengirim permintaan tanpa header ke Service:
curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comHasil yang Diharapkan:
newnewdikembalikan untuk permintaan tanpa header. Permintaan tanpa header dirutekan ke versi layanan baru.Jalankan perintah berikut beberapa kali untuk mengirim permintaan dengan header
location: bjke Service:curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.comHasil yang Diharapkan:
newnewdikembalikan untuk permintaan dengan headerlocation: bj. Permintaan dengan headerlocation: bjdirutekan ke versi layanan baru.
Permintaan dengan header
location: hz, permintaan dengan header lain, dan permintaan tanpa header semuanya dirutekan ke versi layanan baru. Versi layanan lama telah didiskreditkan.Jalankan perintah berikut untuk menghapus Ingress canary bernama canary-weight-ingress dan canary-header-ingress:
kubectl delete ingress canary-weight-ingress canary-header-ingress