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
Pada contoh di atas, terlihat saya mempunyai sebuah service dengan aplikasi versi pertama yang anggaplah sudah mengudara dan menerima request dari user. Kurang lebih seperti inilah bagaimana service tersebut dapat berjalan.
|
|
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.Dari sini mari kita berasumsi bahwa aplikasi kita telah menerima aliran trafik sepenuhnya. Lalu suatu ketika saya ingin melakukan merilis versi aplikasi kedua.
|
|
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.Untuk menggunakan fitur canary kita perlu memisahkan rilis terbaru ke deployment dan service baru. Besar aliran trafik akan kita tentukan dengan pembobotan. Pada diagram di atas, terlihat bahwa 80% traffic akan diarahkan ke versi pertama, sisanya sebesar 20% diarahkan ke versi kedua.
|
|
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.Dengan mirroring service akan menerima bayangan request dari user, aplikasi akan melayaninya. Namun user tidak akan menerima balikan dari service mirror karena traffic yang mengalir hanyalah sebuah request bayangan.
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