paint-brush
Ki jan yo Optimize Kubernetes pou gwo imaj Dockerpa@kksudo
Nouvo istwa

Ki jan yo Optimize Kubernetes pou gwo imaj Docker

pa Kazakov Kirill10m2024/09/30
Read on Terminal Reader

Twò lontan; Pou li

🚀 Sòsye Kubernetes, èske ou bouke tann èdtan pou nœuds ou yo chofe? Imajine diminye tan sa a nan yon segonn sèlman! Atik sa a ki chanje jwèt revele kijan pou turbocharge pwosesis deplwaman Kubernetes ou a, menm avèk imaj masiv 3GB ak 1000 gous. Dekouvri sòs sekrè ki transfòme pèfòmans gwoup ou a soti nan paresseux rive nan supèrsonik. Pa kite chofe ralanti kenbe ou - aprann kijan pou revolusyone workflow Kubernetes ou jodi a!
featured image - Ki jan yo Optimize Kubernetes pou gwo imaj Docker
Kazakov Kirill HackerNoon profile picture
0-item

Yon apèsi tou kout sou pwoblèm nan

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 .


Kubernetes kole sou 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!

Plis detay sou pwoblèm nan

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.


Pwoblèm yo fè fas

  • 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.


Reparasyon pou rekiperasyon gwoup la

Kòm premye etap la, nou deside diminye kantite POD sou nœuds yo.

  1. Nou deplase nouvo nœuds yo nan eta "Cordon".
  2. Retire tout PODS kole yo pou diminye presyon ki gen kapasite a
  3. Kouri youn pa youn POD yo pou chofe nœuds yo
  4. Apre sa, nou deplase nœuds chofe yo nan eta nòmal la ("unCordon").
  5. Retire tout nœuds nan eta a kole
  6. Tout PODS yo te kòmanse avèk siksè itilize kachèt imaj Docker la


Yon konsepsyon orijinal CI/CD

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

Yon tiyo orijinal CI/CD:

  1. Nan etap Init it la: nou prepare anviwònman/variab yo, defini seri imaj pou rebati, elatriye...

  2. Sou etap la Build : nou bati imaj yo epi pouse yo nan ECR la

  3. Sou etap Deploy a: nou deplwaye imaj yo nan k8s yo (deplwaman aktyalizasyon, elatriye...)


Plis detay sou konsepsyon CICD orijinal la:

  • Branch karakteristik nou yo (FB) forked soti nan branch 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.
  • Nou separeman bati imaj docker JS depandans yo (pou chak anviwònman) epi pouse li nan ECR pou reitilize li kòm imaj rasin (baz) nan Dockerfile la. Nou gen anviwon 5-10 kalite imaj docker depandans JS la.
  • FB a deplwaye nan gwoup k8s nan espas non separe a, men nan nœuds komen pou FB a. FB a ka gen ~ 200 apps, ak gwosè imaj la jiska 3 GB.
  • Nou gen sistèm autoscaling gwoup la, ki echèl nœuds yo nan gwoup la ki baze sou chaj la oswa PODS annatant ak nodeSelector ak tolerans.
  • Nou itilize enstans yo tach pou nœuds yo.

Aplikasyon pwosesis chofe a

Gen kondisyon pou pwosesis chofe a.

Obligatwa:

  1. Rezolisyon Pwoblèm : Adrese ak rezoud pwoblèm ContainerCreating .
  2. Pèfòmans amelyore : Siyifikativman diminye tan demaraj lè w itilize imaj baz prechofe (depandans JS).

Bon pou gen amelyorasyon:

  1. Fleksibilite : Pèmèt chanjman fasil nan kalite ne ak lavi li (egzanp, gwo SLA oswa tan pwolonje pou viv).
  2. Transparans : Bay mezi klè sou itilizasyon ak pèfòmans.
  3. Pri Efikasite : Ekonomize depans lè w efase VNG la imedyatman apre yo fin efase branch karakteristik ki asosye a.
  4. Izolasyon : Apwòch sa a asire ke lòt anviwònman yo pa afekte.

Solisyon

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:

  1. Kreye seri nœuds yo (Virtual Node Group) pou chak FB

  2. Ajoute imaj de baz nan script cloud-init pou nouvo nœuds yo

  3. 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.


Yon tiyo CI/CD ajou ta sanble sa a: Yon tiyo CI/CD ajou


Yon tiyo CI/CD ajou:

  1. Init etap
    1.1.(nouvo etap) Init deplwaye : Si se yon premye kòmanse nan FB a, Lè sa a, kreye yon nouvo seri pèsonèl nan sikonstans ne yo (nan tèm nou yo, se Virtual Node Group oswa VNG) epi telechaje tout imaj baz JS (5-10 imaj). ) soti nan branch prensipal la. Li jis ase pou fè li, paske nou fouchèt FB a soti nan branch prensipal la. Yon pwen enpòtan, se pa yon operasyon bloke.
  2. Bati etap
  3. Etap anvan deplwaye Telechaje imaj baz JS ki fre kwit ak tag espesifik FB ki soti nan ECR la.
    3.1.(nouvo etap) Pwen enpòtan : Li se yon operasyon bloke, paske nou ta dwe diminye presyon ki gen kapasite a. Youn pa youn, nou telechaje imaj de baz yo pou chak ne ki gen rapò.
    Btw, mèsi pou etap " init deploy" la, nou deja gen imaj docker de baz ki soti nan branch prensipal la, se sa ki ban nou yon gwo chans frape kachèt la sou premye kòmansman an.
  4. **Deplwaye
    **Pa gen okenn chanjman nan etap sa a. Men, gras a etap anvan an, nou deja gen tout kouch imaj lou sou nœuds ki nesesè yo.

Init etap deplwaye

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:

  1. Izolasyon : Chak FB gen pwòp seri nœuds li yo, asire ke anviwònman an pa afekte pa lòt FB.

  2. Fleksibilite : Nou ka fasilman chanje kalite ne ak lavi li.

  3. Pri Efikasite : Nou ka efase nœuds yo imedyatman apre yo fin efase FB la.

  4. 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).

  5. 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:

  1. 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.

  2. 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).

  3. 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.

Etap pre deplwaye

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

  1. 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.

  2. 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).

  3. 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:

  • Nan CD a nou kreye yon DaemonSet ak seksyon initContainers .
  • Seksyon initContainers egzekite anvan veso prensipal la kòmanse, asire ke imaj ki nesesè yo telechaje anvan veso prensipal la kòmanse.
  • Nan CD a, nou kontinye tcheke estati daemonSet la. Si daemonSet la nan yon eta "pare", nou kontinye ak deplwaman an. Sinon, nou tann pou daemonSet la pare.

Konparezon

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.


Konklizyon Tan an rale

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.


Solisyon posib ak lyen


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.