Yon jou, pandan yon aktyalizasyon te planifye nan gwoup k8s la, nou te dekouvri ke prèske tout POD nou yo (apeprè 500 sou 1,000) sou nouvo nœuds yo pa t kapab kòmanse, ak minit yo byen vit tounen èdtan. Nou aktivman chèche kòz rasin lan, men apre twa èdtan, PODS yo te toujou nan estati ContainerCreating
.
Erezman, sa a pa t anviwònman prod ak fenèt antretyen an te pwograme pou fen semèn nan. Nou te gen tan mennen ankèt sou pwoblèm nan san okenn presyon.
Ki kote ou ta dwe kòmanse rechèch ou an pou kòz rasin lan? Èske ou ta renmen aprann plis sou solisyon nou jwenn? Brale epi jwi!
Pwoblèm lan se te ke nou te gen yon gwo kantite imaj docker ki te bezwen yo dwe rale epi yo te kòmanse sou chak ne nan gwoup la an menm tan an. Sa a se paske plizyè imaj docker konkouran rale sou yon sèl ne ka mennen nan itilizasyon segondè disk ak tan kòmanse frèt pwolonje.
De tan zan tan, pwosesis CD la pran jiska 3 èdtan pou rale imaj yo. Sepandan, fwa sa a li te konplètman kole, paske kantite PODS pandan amelyorasyon nan EKS (inline, lè nou ranplase tout nœuds nan gwoup la) te twò wo.
Tout aplikasyon nou yo ap viv nan k8s yo (baz EKS ). Pou ekonomize sou depans nou yo pou DEV env, nou itilize enstans tach.
Nou itilize imaj AmazonLinux2 pou nœuds yo.
Nou gen yon gwo kantite branch karakteristik (FB) nan anviwònman devlopman ki kontinyèlman deplwaye nan gwoup Kubernetes nou an. Chak FB gen pwòp seri aplikasyon li yo, epi chak aplikasyon gen pwòp seri depandans li yo (andedan yon imaj).
Nan pwojè nou an, prèske 200 apps ak nimewo sa a ap grandi. Chak aplikasyon sèvi ak youn nan 7 imaj docker de baz ak yon gwosè ~2 GB. Gwosè total maksimòm imaj achiv la (nan ECR a) se apeprè 3 GB.
Tout imaj yo estoke nan Amazon Elastic Container Registry (ECR).
Nou itilize kalite volim default gp3 EBS pou nœuds yo.
Pwolonje tan pou kòmanse frèt: Kòmanse yon nouvo gous ak yon nouvo imaj ka pran plis pase 1 èdtan, sitou lè plizyè imaj yo rale ansanm sou yon sèl nod.
Erè ErrImagePull: ErrImagePull
souvan oswa kole ak ContainerCreating
eta yo, ki endike pwoblèm ak rale imaj.
Segondè Itilizasyon Disk: Itilizasyon Disk rete tou pre 100% pandan pwosesis rale imaj la, sitou akòz I/O disk entansif ki nesesè pou dekonpresyon (egzanp, "unpigz").
Pwoblèm sistèm DaemonSet: Gen kèk sistèm DaemonSet (tankou aws-node
oswa ebs-csi-node
) te deplase nan eta "pa pare" akòz presyon disk, ki afekte preparasyon pou ne.
Pa gen kachèt imaj sou nœuds yo: Paske nou ap itilize kach, nou pa ka itilize disk lokal la pou kachèt imaj yo.
Sa a lakòz anpil deplwaman bloke sou branch karakteristik, patikilyèman paske diferan FB a gen yon seri imaj de baz.
Apre ankèt rapid, nou te jwenn ke pwoblèm prensipal la te presyon ki gen kapasite sou nœuds yo pa pwosesis la unpigz
. Pwosesis sa a responsab pou dekonpresyon imaj docker yo. Nou pa t 'chanje anviwònman yo default pou kalite volim gp3 EBS, paske pa apwopriye pou ka nou an.
Kòm premye etap la, nou deside diminye kantite POD sou nœuds yo.
Lide prensipal la nan solisyon an se chofe nœuds yo anvan pwosesis la CD kòmanse pa pi gwo pati nan imaj la docker (kouch depandans JS), ki itilize kòm imaj la rasin pou tout apps nou yo. Nou gen omwen 7 kalite imaj rasin ak depandans JS yo, ki gen rapò ak kalite aplikasyon an. Kidonk, ann analize konsepsyon CI/CD orijinal la.
Nan tiyo CI/CD nou an, nou gen 3 poto:
Yon tiyo orijinal CI/CD:
Nan etap Init
it la: nou prepare anviwònman/variab yo, defini seri imaj pou rebati, elatriye...
Sou etap la Build
: nou bati imaj yo epi pouse yo nan ECR la
Sou etap Deploy
a: nou deplwaye imaj yo nan k8s yo (deplwaman aktyalizasyon, elatriye...)
Plis detay sou konsepsyon CICD orijinal la:
main
la. Nan pwosesis CI a, nou toujou analize seri imaj ki te chanje nan FB a epi rebati yo. Branch main
la toujou estab, kòm definisyon an, ta dwe toujou vèsyon an dènye nan imaj yo baz.Gen kondisyon pou pwosesis chofe a.
Obligatwa:
ContainerCreating
.Bon pou gen amelyorasyon:
Apre analize egzijans ak kontrent, nou deside aplike yon pwosesis chofe ki ta prechofe nœuds yo ak imaj JS kachèt baz yo. Pwosesis sa a ta deklanche anvan pwosesis CD kòmanse, asire ke nœuds yo pare pou deplwaman FB a, epi nou gen yon chans maksimòm frape kachèt la.
Amelyorasyon sa a nou divize an gwo etap pye bwa:
Kreye seri nœuds yo (Virtual Node Group) pou chak FB
Ajoute imaj de baz nan script cloud-init pou nouvo nœuds yo
Ajoute yon etap pre-deplwaye pou kouri DaemonSet la ak seksyon initContainers
pou telechaje imaj docker ki nesesè yo nan nœuds yo anvan pwosesis CD la kòmanse.
Kreye yon nouvo seri nœuds pou chak FB atravè apèl API (nan sistèm 3yèm pati autoscaling) nan tiyo CI nou an.
Pwoblèm rezoud:
Izolasyon : Chak FB gen pwòp seri nœuds li yo, asire ke anviwònman an pa afekte pa lòt FB.
Fleksibilite : Nou ka fasilman chanje kalite ne ak lavi li.
Pri Efikasite : Nou ka efase nœuds yo imedyatman apre yo fin efase FB la.
Transparans : Nou ka fasilman swiv itilizasyon ak pèfòmans nœuds yo (chak nœuds gen yon tag ki gen rapò ak FB la).
Itilizasyon efikas nan enstans plas yo : Enstans plas la ap kòmanse ak imaj baz ki deja predefini, sa vle di, apre nœud tach la kòmanse, gen imaj de baz yo deja sou nœud la (ki soti nan branch prensipal la).
Telechaje tout imaj baz JS soti nan branch prensipal la nan nouvo nœuds yo atravè script cloud-init
.
Pandan ke imaj yo ap telechaje nan background nan, pwosesis la CD ka kontinye bati nouvo imaj san okenn pwoblèm. Anplis, pwochen nœuds yo (ki pral kreye pa sistèm autoscaling) nan gwoup sa a pral kreye ak done yo mete ajou cloud-init
, ki deja gen enstriksyon yo telechaje imaj anvan yo kòmanse.
Pwoblèm rezoud:
Rezolisyon Pwoblèm : Presyon Disk la ale, paske nou mete ajou script cloud-init
la lè nou ajoute telechaje imaj baz yo nan branch prensipal la. Sa a pèmèt nou frape kachèt la sou premye kòmansman FB la.
Itilizasyon efikas nan enstans plas yo : Enstans plas la ap kòmanse ak mete ajou done cloud-init
. Sa vle di, ke apre ne la tach kòmanse, gen deja imaj yo baz sou ne la (ki soti nan branch prensipal la).
Pèfòmans Amelyore : Pwosesis CD a ka kontinye bati nouvo imaj san okenn pwoblèm.
Aksyon sa a te ajoute ~17 segonn (apèl API) nan tiyo CI/CD nou an.
Aksyon sa a fè sans sèlman premye fwa lè nou kòmanse FB a. Pwochen fwa, nou deplwaye aplikasyon nou yo nan nœuds ki deja egziste, ki deja gen imaj de baz yo, ke nou te delivre sou deplwaman anvan an.
Nou bezwen etap sa a, paske imaj FB yo diferan de imaj branch prensipal yo. Nou bezwen telechaje imaj baz FB yo nan nœuds yo anvan pwosesis CD la kòmanse. Sa a pral ede diminye tan yo kòmanse frèt pwolonje ak itilizasyon segondè disk ki ka rive lè plizyè imaj lou yo rale ansanm.
Objektif Etap Pre-Deplwaye a
Anpeche Presyon Disk : Sekans telechaje docker imaj ki pi lou yo. Apre etap init-deplwaye a, nou deja gen imaj de baz yo sou nœuds yo, ki vle di nou gen yon gwo chans nan kachèt frape.
Amelyore Deplwaman Efikasite : Asire nœuds yo prechofe ak imaj docker esansyèl, ki mennen ale nan tan demaraj POD pi rapid (prèske imedyatman).
Amelyore Estabilite : Minimize chans pou rankontre erè ErrImagePull
/ ContainerCreating
epi asire ke seri demon sistèm yo rete nan yon eta "pare".
Anba etap sa a, nou ajoute 10-15 minit nan pwosesis CD la.
Detay etap anvan deplwaye:
initContainers
.initContainers
egzekite anvan veso prensipal la kòmanse, asire ke imaj ki nesesè yo telechaje anvan veso prensipal la kòmanse.Konparezon etap orijinal ak ajou ak pwosesis prechofe a.
Etap | Init etap deplwaye | Etap pre deplwaye | Deplwaye | Tan total | Diff |
---|---|---|---|---|---|
San yo pa prechofe | 0 | 0 | 11m 21s | 11m 21s | 0 |
Avèk prechofe | 8 segonn | 58 segonn | 25 segonn | 1m 31s | -9m 50s |
Bagay pwensipal lan, "Deplwaye" tan an chanje (soti nan premye lòd la aplike nan eta a Kouri nan gous yo) soti nan 11m 21s a 25 segonn. Tan total la chanje soti nan 11m 21s pou 1m 31s.
Yon pwen enpòtan, si pa gen imaj baz ki soti nan branch prensipal la, Lè sa a, "Deplwaye" tan an pral menm jan ak tan orijinal la oswa yon ti kras plis. Men, de tout fason, nou rezoud yon pwoblèm ak presyon ki gen kapasite a ak tan an kòmanse frèt.
Pwoblèm prensipal ContainerCreating
te rezoud pa pwosesis chofe a. Kòm yon benefis, nou siyifikativman redwi tan an frèt kòmanse nan POD yo.
Presyon disk la te ale, paske nou deja gen imaj yo baz sou nœuds yo. DaemonSets sistèm yo nan yon eta "pare" ak "sante" (paske pa gen okenn presyon disk), epi nou pa te rankontre okenn erè ErrImagePull
ki gen rapò ak pwoblèm sa a.
PS: Mwen ta renmen bay yon gwo ekip teknik nan Justt ( https://www.linkedin.com/company/justt-ai ) pou travay san pran souf ak apwòch vrèman kreyatif nan nenpòt pwoblèm yo ap fè fas. avèk. An patikilye, yon shout-out pou Ronny Sharaby, sipèb dirijan ki responsab pou gwo travay ekip la ap fè. Mwen ap chèche pou pi devan pou wè pi plis ak plis bèl egzanp sou fason kreyativite ou afekte pwodwi Justt la.