Kami bakal ngalaksanakeun panyebaran Canary sacara manual via GitOps sareng nyiptakeun / ngarobih sumber daya Kubernetes utama. Artikel ieu dimaksudkeun utamana pikeun bubuka kalawan kumaha deployment jalan dina Kubernetes Canary, saprak aya métode leuwih éféktif automation, nu urang bakal mertimbangkeun dina artikel di handap ieu.
Kalayan strategi Canary, apdet munggaran diterapkeun ngan ukur sawaréh pangguna. Ngaliwatan monitoring, data log, uji manual, atanapi saluran eupan balik anu sanés, sékrési diuji sateuacan dileupaskeun ka sadaya pangguna.
Deployment Kubernetes (update bergulir)
Strategi standar pikeun Kubernetes Deployment nyaéta rolling-update, dimana sajumlah pods diluncurkeun nganggo vérsi gambar anyar. Upami aranjeunna diciptakeun tanpa masalah, pods sareng vérsi gambar anu lami ditungtungan, sareng pods énggal didamel paralel.
GitOps
Kami nganggo GitOps dina conto ieu kusabab kami:
ngagunakeun Git salaku sumber tunggal bebeneran
kami nganggo Git Operations pikeun ngawangun sareng panyebaran (henteu aya paréntah lian ti tag git / merge anu diperyogikeun)
conto
Hayu urang nyandak prakték anu saé - gaduh hiji gudang pikeun kode aplikasi sareng hiji pikeun infrastruktur.
Repository aplikasi
Ieu mangrupikeun Python + Flask API anu saderhana pisan anu ngabalikeun réspon salaku JSON. Urang bakal ngawangun pakét via GitlabCI sareng nyorong hasilna ka Gitlab Registry. Dina pendaptaran kami gaduh dua versi pelepasan anu béda:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Hiji-hijina bédana antara aranjeunna nyaéta parobahan dina file JSON anu dipulangkeun. Kami nganggo aplikasi ieu pikeun ngabayangkeun sabisa-bisa versi anu kami komunikasikeun.
Infrastruktur gudang
Dina turnip ieu kami bakal nyebarkeun via GitlabCI ka Kubernetes, .gitlab-ci.yml Ieu saperti kieu:
Catet yén aplikasi-deployment teu acan gaduh réplika anu didefinisikeun.
Ngalaksanakeun deployment awal
Pikeun ngamimitian panyebaran awal, anjeun tiasa ngamimitian pipa GitlabCI sacara manual dina cabang master. Saatos éta kubectl kedah kaluaran di handap ieu:
Urang nempo app deployment kalawan 10 réplika jeung app-kanari kalawan 0. Aya ogé LoadBalancer ti mana urang bisa ngakses ngaliwatan curl via IP éksternal:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Kami ningali yén aplikasi uji kami ngan ukur mulangkeun "v1".
Ngalaksanakeun penyebaran Kanaria
Lengkah 1: ngaleupaskeun versi anyar pikeun sababaraha pamaké
Urang nyetel jumlah réplika ka 1 dina file deploy-canary.yaml jeung gambar versi anyar:
Kami nyorong parobihan ieu kana gudang tempat panyebaran bakal ngamimitian (via GitlabCI) sareng ningali hasilna:
Layanan kami bakal nunjuk ka duanana panyebaran, sabab duanana gaduh pamilih aplikasi. Kusabab randomisasi standar Kubernetes, urang kedah ningali réspon anu béda pikeun ~ 10% pamundut:
Kaayaan aplikasi urang ayeuna (GitOps, dicandak tina Git salaku Sumber Tunggal Kaleresan) nyaéta ayana dua panyebaran sareng réplika aktip, hiji pikeun unggal versi.
~ 10% pamaké jadi akrab jeung versi anyar jeung teu ngahaja nguji éta. Ayeuna waktuna pikeun mariksa kasalahan dina log sareng ngawaskeun data pikeun mendakan masalah.
Lengkah 2: Leupaskeun versi anyar ka sadaya pamaké
Kami mutuskeun yén sadayana lancar sareng ayeuna urang kedah ngagulung versi énggal ka sadaya pangguna. Jang ngalampahkeun ieu kami ngan ngamutahirkeun deploy.yaml masang versi anyar tina gambar jeung jumlah réplika sarua 10. Di deploy-canary.yaml urang nyetel jumlah réplika deui 0. Saatos deployment, hasilna bakal kieu:
summing up
Pikeun kuring, ngajalankeun panyebaran sacara manual ku cara ieu ngabantosan ngartos kumaha gampangna tiasa dikonpigurasi nganggo k8s. Kusabab Kubernetes ngidinan Anjeun pikeun ngamutahirkeun sagalana ngaliwatan hiji API, léngkah ieu bisa otomatis ngaliwatan skrip.
Hal séjén anu kedah dilaksanakeun nyaéta titik éntri panguji (LoadBalancer atanapi via Ingress) anu ngan ukur tiasa diaksés versi énggal. Éta tiasa dianggo pikeun browsing manual.
Dina artikel kahareup, urang bakal pariksa kaluar solusi otomatis lianna nu nerapkeun lolobana naon urang geus dipigawé.