Penggunaan Canary menggunakan Jenkins-X Istio Flagger
Kami akan melaksanakan penggunaan Canary secara manual melalui GitOps dan mencipta/mengubah suai sumber Kubernetes utama. Artikel ini bertujuan terutamanya untuk pengenalan dengan cara penggunaan berfungsi dalam Kubernetes Canary, kerana terdapat kaedah automasi yang lebih berkesan, yang akan kami pertimbangkan dalam artikel berikut.
Dengan strategi Canary, kemas kini pertama kali digunakan pada subset pengguna sahaja. Melalui pemantauan, data log, ujian manual atau saluran maklum balas lain, keluaran diuji sebelum dikeluarkan kepada semua pengguna.
Penggunaan Kubernetes (kemas kini bergulir)
Strategi lalai untuk Kubernetes Deployment ialah rolling-update, di mana beberapa pod tertentu dilancarkan dengan versi baharu imej. Jika ia dicipta tanpa masalah, pod dengan versi imej lama akan ditamatkan dan pod baharu dibuat selari.
GitOps
Kami menggunakan GitOps dalam contoh ini kerana kami:
menggunakan Git sebagai satu sumber kebenaran
kami menggunakan Operasi Git untuk membina dan menggunakan (tiada arahan selain git tag/merge diperlukan)
Contoh
Mari kita amalkan amalan yang baik - untuk mempunyai satu repositori untuk kod aplikasi dan satu untuk infrastruktur.
Repositori aplikasi
Ini adalah API Python+Flask yang sangat mudah yang mengembalikan respons sebagai JSON. Kami akan membina pakej melalui GitlabCI dan menolak hasilnya ke Pendaftaran Gitlab. Dalam pendaftaran kami mempunyai dua versi keluaran yang berbeza:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Satu-satunya perbezaan di antara mereka ialah perubahan dalam fail JSON yang dikembalikan. Kami menggunakan aplikasi ini untuk menggambarkan semudah mungkin versi yang kami berkomunikasi.
Repositori infrastruktur
Dalam lobak ini kami akan menggunakan GitlabCI ke Kubernetes, .gitlab-ci.yml kelihatan seperti ini:
Ambil perhatian bahawa aplikasi-deploy tidak mempunyai sebarang replika yang ditentukan lagi.
Melaksanakan penempatan awal
Untuk memulakan penggunaan awal, anda boleh memulakan saluran paip GitlabCI secara manual pada cawangan induk. Selepas itu kubectl harus mengeluarkan yang berikut:
Kita lihat app penempatan dengan 10 replika dan kenari aplikasi dengan 0. Terdapat juga LoadBalancer yang boleh kita akses melalui curl melalui IP Luaran:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Kami melihat bahawa aplikasi ujian kami hanya mengembalikan "v1".
Melaksanakan penggunaan Canary
Langkah 1: keluarkan versi baharu untuk sesetengah pengguna
Kami menetapkan bilangan replika kepada 1 dalam fail deploy-canary.yaml dan imej versi baharu:
Kami menolak perubahan ini ke repositori dari mana penggunaan akan bermula (melalui GitlabCI) dan lihat hasilnya:
Perkhidmatan kami akan menunjuk kepada kedua-dua penempatan, kerana kedua-duanya mempunyai pemilih apl. Disebabkan oleh rawak lalai Kubernetes, kita sepatutnya melihat respons yang berbeza untuk ~10% permintaan:
Keadaan semasa aplikasi kami (GitOps, diambil daripada Git sebagai Satu Sumber Kebenaran) ialah kehadiran dua penempatan dengan replika aktif, satu untuk setiap versi.
~10% pengguna menjadi biasa dengan versi baharu dan mengujinya secara tidak sengaja. Sekarang adalah masa untuk menyemak ralat dalam log dan data pemantauan untuk mencari masalah.
Langkah 2: Keluarkan versi baharu kepada semua pengguna
Kami memutuskan bahawa semuanya berjalan lancar dan kini kami perlu melancarkan versi baharu kepada semua pengguna. Untuk melakukan ini, kami hanya mengemas kini deploy.yaml memasang versi baharu imej dan bilangan replika bersamaan dengan 10. Dalam deploy-canary.yaml kami menetapkan bilangan replika kembali kepada 0. Selepas penggunaan, hasilnya adalah seperti berikut:
Merumuskan
Bagi saya, menjalankan penggunaan secara manual dengan cara ini membantu memahami betapa mudahnya ia boleh dikonfigurasikan menggunakan k8s. Memandangkan Kubernetes membenarkan anda mengemas kini segala-galanya melalui API, langkah-langkah ini boleh diautomasikan melalui skrip.
Perkara lain yang perlu dilaksanakan ialah titik masuk penguji (LoadBalancer atau melalui Ingress) yang melaluinya hanya versi baharu boleh diakses. Ia boleh digunakan untuk menyemak imbas manual.
Dalam artikel akan datang, kami akan menyemak penyelesaian automatik lain yang melaksanakan kebanyakan perkara yang telah kami lakukan.