Canary Deployment dan Mirroring Dengan Traefik

Saat kita melakukan deployment aplikasi ke versi terbaru pada Kubernetes, mungkin muncul kecemasan akan adanya insiden tak terduga walaupun versi terbaru sudah lolos tahap testing. Guna mengurangi kemungkinan insiden dalam skala besar, kita dapat memakai skenario bernama Canary.
Canary Idiom
Frasa Canary dalam deployment aplikasi berasal dari sejarah penambang batu bara di awal abad 20. Pekerja tambang membawa burung kenari dalam sangkar ke terowongan bawah tanah, sehingga ketika muncul gas berbahaya seperti karbon monoksida maka burung kenari akan mati dan menjadi peringatan bagi para pekerja untuk segera evakuasi.
Kubernetes’s Canary
Fitur canary pada Kubernetes biasanya tersedia jika kita menggunakan solusi service mesh. Namun sebenarnya canary dapat diimplementasikan tanpanya. Sebagai contohnya adalah menggunakan Ingress Nginx, HAProxy Ingress, hingga Traefik. Jika tertarik, silahkan cari Kubernetes Ingress Controller lainnya yang mendukung fitur canary pada tabel berikut.
Traefik
Traefik adalah Cloud Native Edge Router salah satu reverse proxy dan load balancer. Terlepas dari gimmick cloud-native, yang menjadikan Traefik berbeda dari Nginx, HAproxy, dan yang lain adalah tersedianya configurability secara otomatis dan dinamis. Bagian paling menonjol darinya mungkin adalah kemampuan automatic service discovery. Jika kita menggunakan Traefik di atas Docker, Kubernetes, atau bahkan cara lama seperti sekedar VM dan bare-metal untuk menjajakan service yang berjalan di dalamnya. Layaknya sulap, Traefik akan me-expose service tersebut ke dunia luar. Tentu jika kita mengikuti dokumentasi dengan benar.
Prerequisites
Untuk mempersingkat artikel ini, maka saya anggap beberapa hal ini sudah terpenuhi.
- Kubernetes cluster telah tersedia.
- Traefik sudah terpasang pada Kubernetes.
- Pemahaman mengenai Ingress, Service, dan Deployment pada Kubernetes.
Scenario
Tanpa Canary
|
|
Selanjutnya kita buat sebuah IngressRoute
dengan Traefik.
|
|
Simpan misalnya dengan nama ingressroute-app.yaml
dan terapkan konfigurasi di atas
|
|
Jika dilakukan request dengan curl
maka akan menjawab seperti berikut.
|
|
Kita dapat melakukan rolling release ke versi terbaru tanpa canary, yang hasilnya tentu saja trafik akan sepenuhnya dialirkan ke satu-satunya rilis yang tersedia yaitu misalkan versi 2.0.0
seperti berikut.
image tag
dari deployment-app-current
ke versi 1.0.0
agar praktik selanjutnya sesuai dengan skenario.Weighted Canary
Alih - alih langsung mengganti rilis pertama ke versi terbaru sekaligus, di sini kita akan mendeploy aplikasi versi kedua sebagai rilisan baru. Dan selanjutnya kita manipulasi besaran traffic yang dialirkan.
|
|
Kemudian modifikasi file manifest ingressroute-app.yaml
tadi menjadi seperti berikut.
|
|
Jangan lupa kita terapkan perubahannya.
|
|
Mari kita jalankan 100 request dengan menggunakan curl
seperti berikut.
|
|
Akan terhitung bahwa trafik sebanyak 80% dialirkan ke aplikasi versi pertama, dan sisanya 20% ke versi kedua.
Canary by Header
Semisal yang kita inginkan adalah melakukan canary namun bukan untuk end-user langsung, melainkan untuk kebutuhan testing. Traefik juga mendukung manipulasi trafik berdasarkan Request Header dengan menggunakan objek Middleware.
Contoh file manifest untuk membuat middleware adalah sebagai berikut, simpan dengan nama misalnya middleware-app-canary.yaml
.
|
|
Kemudian modifikasi file ingressroute-app.yaml
tadi menjadi seperti di bawah ini.
|
|
Terapkan konfigurasi di atas pada Kubernetes.
|
|
Sekarang mari kita lakukan pengujian dengan melakukan 10 request tanpa header, dan 10 request lagi dengan menggunakan header.
Mirroring
Sekenario lainnya yang disediakan adalah melakukan mirroring atau shadowing.
Selain dialirkan ke service - service canary tadi, Traefik juga dapat memanipulasi trafik yang lewat untuk menciptakan bayangannya, dan bayangan itu akan dialirkan ke service versi lain dengan persentase yang bisa ditentukan juga.
|
|
Modifikasi file ingressroute-app.yaml
yang telah dibuat sebelumnya.
|
|
Untuk menerapkan mirroring, kita juga perlu membuat objek bertipe TraefikService (bukan kubernetes service, kali ini adalah Custom Resource Definition milik Traefik).
|
|
Simpan saja misalnya dengan nama traefikservice-app.yaml
kemudian terapkan ke kubernetes.
|
|
Lalu kita uji dengan melakukan 10 kali request.
|
|
Akan terlihat bahwa rilis versi pertama menerima 8 request, sedangkan sisanya sebanyak 2 request ditangani oleh rilis versi kedua. Sementara itu, traffic sebanyak 10% atau dalam kasus ini setara 1 request dibuat bayangannya dan dialirkan ke rilis mirror.
Advantages
Beberapa manfaat yang kita peroleh dari penerapan canary dan traffic mirroring adalah sebagai berikut:
- Minimalisir resiko/insiden dari rilisan baru di environment production.
- Reduksi cost dan effort karena tidak perlu membangun cluster lain untuk environment pre-production.
- Mengalirkan sebagian kecil realtime traffic ke rilisan baru untuk testing.
- Mempercepat identifikasi terhadap Bug/Issue aplikasi.
References
- blog.scienceandindustrymuseum.org.uk/canary-resuscitator
- traefik.io/glossary/kubernetes-deployment-strategies-blue-green-canary
- doc.traefik.io/traefik/v2.4/routing/providers/kubernetes-crd/#custom-resource-definition-crd
- doc.traefik.io/traefik/middlewares/http/headers
- “Kubernetes Ingress Controllers” List by learnk8s