werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

27. maijā DevOpsConf 2019 konferences galvenajā zālē, kas notika festivāla ietvaros RIT++ 2019. gads, kā daļa no sadaļas "Nepārtraukta piegāde", tika sniegts ziņojums "werf - mÅ«su rÄ«ks CI/CD in Kubernetes". Tas runā par tiem problēmas un izaicinājumi, ar kuriem saskaras ikviens, izvietojot Kubernetes, kā arÄ« par niansēm, kas var nebÅ«t uzreiz pamanāmas. Analizējot iespējamos risinājumus, mēs parādām, kā tas tiek Ä«stenots atvērtā pirmkoda rÄ«kā werf.

KopÅ” prezentācijas mÅ«su utilÄ«ta (agrāk pazÄ«stama kā dapp) ir sasniegusi vēsturisku pavērsienu 1000 zvaigžņu vietnē GitHub ā€” mēs ceram, ka tā augoŔā lietotāju kopiena atvieglos dzÄ«vi daudziem DevOps inženieriem.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Tātad, mēs piedāvājam reportāžas video (~47 minūtes, daudz informatīvāks par rakstu) un galvenais izraksts no tā teksta formā. Aiziet!

Koda piegāde Kubernetes

Runa vairs nebūs par werf, bet gan par CI/CD Kubernetes, norādot, ka mūsu programmatūra ir iepakota Docker konteineros (Es par to runāju 2016. gada pārskats), un K8s tiks izmantoti, lai to palaistu ražoŔanā (vairāk par to sadaļā 2017 gadā).

Kā izskatās piegāde Kubernetes?

  • Ir Git repozitorijs ar kodu un instrukcijām tā izveidei. Lietojumprogramma ir iebÅ«vēta Docker attēlā un publicēta Docker reÄ£istrā.
  • Tajā paŔā repozitorijā ir arÄ« norādÄ«jumi par lietojumprogrammas izvietoÅ”anu un palaiÅ”anu. IzvietoÅ”anas stadijā Å”ie norādÄ«jumi tiek nosÅ«tÄ«ti Kubernetes, kas saņem vajadzÄ«go attēlu no reÄ£istra un palaiž to.
  • Turklāt parasti ir testi. Dažus no tiem var izdarÄ«t, publicējot attēlu. Varat arÄ« (ievērojot tos paÅ”us norādÄ«jumus) izvietot lietojumprogrammas kopiju (atseviŔķā K8s nosaukumvietā vai atseviŔķā klasterÄ«) un tur veikt testus.
  • Visbeidzot, jums ir nepiecieÅ”ama CI sistēma, kas saņem notikumus no Git (vai pogu klikŔķus) un izsauc visus norādÄ«tos posmus: izveidojiet, publicējiet, izvietojiet, pārbaudiet.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Šeit ir dažas svarīgas piezīmes:

  1. Jo mums ir nemainÄ«ga infrastruktÅ«ra (nemainÄ«ga infrastruktÅ«ra), lietojumprogrammas attēls, kas tiek izmantots visos posmos (iestudÄ“Å”ana, ražoÅ”ana utt.), tādam jābÅ«t. Es par to runāju sÄ«kāk un ar piemēriem. Å”eit.
  2. Jo mēs sekojam infrastruktÅ«rai kā koda pieejai (IaC), lietojumprogrammas kodam, instrukcijām tā montāžai un palaiÅ”anai jābÅ«t tieÅ”i vienā repozitorijā. PlaŔāku informāciju par to skatiet tas pats ziņojums.
  3. Piegādes ķēde (Piegāde) mēs parasti to redzam Ŕādi: lietojumprogramma tika samontēta, pārbaudÄ«ta, izlaista (izlaiduma posms) un viss - piegāde ir notikusi. Taču patiesÄ«bā lietotājs saņem to, ko jÅ«s izlaidāt, nē tad, kad jÅ«s to piegādājāt ražoÅ”anai, un kad viņŔ varēja tur aizbraukt, un Ŕī ražoÅ”ana strādāja. Tāpēc es uzskatu, ka piegādes ķēde beidzas tikai ekspluatācijas stadijā (skriet), vai precÄ«zāk, pat tajā brÄ«dÄ«, kad kods tika izņemts no ražoÅ”anas (aizvietojot to ar jaunu).

AtgriezÄ«simies pie iepriekÅ” minētās piegādes shēmas Kubernetes: to izgudrojām ne tikai mēs, bet burtiski visi, kas nodarbojās ar Å”o problēmu. Faktiski Å”o modeli tagad sauc par GitOps (jÅ«s varat lasÄ«t vairāk par terminu un tā idejām Å”eit). ApskatÄ«sim shēmas posmus.

Celtniecības posms

Å Ä·iet, ka jÅ«s varat runāt par Docker attēlu veidoÅ”anu 2019. gadā, kad visi zina, kā rakstÄ«t Dockerfiles un palaist docker build?.. LÅ«k, nianses, kurām vēlos pievērst uzmanÄ«bu:

  1. Attēla svars svarÄ«gi, tāpēc izmantojiet daudzpakāpjuatstāt attēlā tikai to aplikāciju, kas patieŔām ir nepiecieÅ”ama darbÄ«bai.
  2. Slāņu skaits jāsamazina, apvienojot ķēdes RUN-pavēles pēc nozīmes.
  3. Tomēr tas rada papildu problēmas atkļūdoÅ”ana, jo, kad montāža avarē, jums ir jāatrod pareizā komanda no ķēdes, kas izraisÄ«ja problēmu.
  4. Montāžas ātrums svarīgi, jo mēs vēlamies ātri ieviest izmaiņas un redzēt rezultātus. Piemēram, jūs nevēlaties atjaunot atkarības valodu bibliotēkās katru reizi, kad veidojat lietojumprogrammu.
  5. Bieži vien no viena Git repozitorija jums ir nepiecieÅ”ams daudz attēlu, ko var atrisināt ar Dockerfailu kopu (vai nosauktiem posmiem vienā failā) un Bash skriptu ar to secÄ«go montāžu.

Tā bija tikai aisberga redzamā daļa, ar ko saskaras ikviens. Bet ir arÄ« citas problēmas, jo Ä«paÅ”i:

  1. Bieži vien montāžas stadijā mums kaut kas ir vajadzÄ«gs mount (piemēram, treŔās puses direktorijā saglabājiet tādas komandas rezultātu kā apt).
  2. Mēs gribam Iespējams tā vietā, lai rakstītu čaulā.
  3. Mēs gribam veidot bez Docker (kāpēc mums ir vajadzÄ«ga papildu virtuālā maŔīna, kurā mums viss ir jākonfigurē, ja mums jau ir Kubernetes klasteris, kurā mēs varam palaist konteinerus?).
  4. Paralēlā montāža, ko var saprast dažādi: dažādas komandas no Dockerfile (ja tiek izmantots vairākpakāpju), vairākas vienas un tās paÅ”as repozitorijas commits, vairāki Dockerfile.
  5. SadalÄ«ta montāža: Mēs vēlamies savākt lietas pākstÄ«s, kas ir "Ä«slaicÄ«gas", jo to keÅ”atmiņa pazÅ«d, kas nozÄ«mē, ka tā ir jāglabā kaut kur atseviŔķi.
  6. Visbeidzot es nosaucu vēlmju virsotni automātiska: Ideāli bÅ«tu aiziet uz repozitoriju, ierakstÄ«t kādu komandu un iegÅ«t gatavu attēlu, kas samontēts ar izpratni, kā un ko pareizi darÄ«t. Taču es personÄ«gi neesmu pārliecināts, ka visas nianses Ŕādi var paredzēt.

Un Ŕeit ir projekti:

  • moby/buildkit ā€” celtnieks no Docker Inc (jau integrēts paÅ”reizējās Docker versijās), kas cenÅ”as atrisināt visas Ŕīs problēmas;
  • kaniko ā€” Google celtnieks, kas ļauj bÅ«vēt bez Docker;
  • Buildpacks.io ā€” CNCF mēģinājums radÄ«t automātisku maÄ£iju un jo Ä«paÅ”i interesantu risinājumu ar slāņu pārbāzi;
  • un virkni citu komunālo pakalpojumu, piemēram bÅ«vēt, oriÄ£inālie instrumenti/att...

...un paskatieties, cik daudz zvaigžņu viņiem ir GitHub. Tas ir, no vienas puses, docker build pastāv un var kaut ko darīt, bet patiesībā problēma nav pilnībā atrisināta - pierādījums tam ir paralēla alternatīvu kolektoru attīstība, no kuriem katrs atrisina kādu daļu problēmu.

Montāža werf

Tātad mums ir jādara werf (agrāk slavens kā dapp) ā€” Atvērtā koda utilÄ«ta no uzņēmuma Flant, ko esam ražojuÅ”i jau daudzus gadus. Viss sākās pirms 5 gadiem ar Bash skriptiem, kas optimizēja Dockerfiles montāžu, un pēdējos 3 gadus ir veikta pilnvērtÄ«ga izstrāde viena projekta ietvaros ar savu Git repozitoriju (vispirms RubÄ«nā un pēc tam pārrakstÄ«ts to Go, un tajā paŔā laikā pārdēvēja). Kādas montāžas problēmas tiek atrisinātas werf?

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Problēmas, kas iekrāsotas zilā krāsā, jau ir Ä«stenotas, paralēlā bÅ«vÄ“Å”ana tika veikta tajā paŔā resursdatorā, un dzeltenā iezÄ«mētās problēmas plānots pabeigt lÄ«dz vasaras beigām.

PublicÄ“Å”anas posms reÄ£istrā (publicÄ“Å”ana)

Mēs zvanÄ«jām docker push... - kas varētu bÅ«t grÅ«ti augÅ”upielādējot attēlu reÄ£istrā? Un tad rodas jautājums: "Kādu tagu man vajadzētu pievienot attēlam?" Tas rodas tā iemesla dēļ, kāds mums ir Gitflow (vai cita Git stratēģija) un Kubernetes, un nozare cenÅ”as nodroÅ”ināt, lai tas, kas notiek Kubernetes, atbilstu tam, kas notiek Git. Galu galā Gits ir mÅ«su vienÄ«gais patiesÄ«bas avots.

Kas tur tik grÅ«ts? NodroÅ”iniet reproducējamÄ«bu: no apņemÅ”anās Gitā, kas pēc bÅ«tÄ«bas ir nemainÄ«gs (nemainÄ«gs), uz Docker attēlu, kas ir jāsaglabā tāds pats.

Tas ir svarÄ«gi arÄ« mums noteikt izcelsmi, jo gribam saprast, no kura commit ir uzbÅ«vēta Kubernetes darbojoŔā aplikācija (tad varam veikt diffus un tamlÄ«dzÄ«gas lietas).

AtzÄ«mÄ“Å”anas stratēģijas

Pirmais ir vienkārÅ”s git diena. Mums ir reÄ£istrs ar attēlu, kas atzÄ«mēts kā 1.0. Kubernetes ir skatuve un producÄ“Å”ana, kur tiek augÅ”upielādēts Å”is attēls. Programmā Git mēs veicam saistÄ«bas un kādā brÄ«dÄ« atzÄ«mējam 2.0. Mēs to savācam saskaņā ar repozitorija norādÄ«jumiem un ievietojam to reÄ£istrā ar tagu 2.0. Mēs to izrullējam uz skatuves un, ja viss ir kārtÄ«bā, tad uz ražoÅ”anu.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Å Ä«s pieejas problēma ir tāda, ka mēs vispirms ievietojām tagu un tikai pēc tam to pārbaudÄ«jām un izlaidām. Kāpēc? Pirmkārt, tas ir vienkārÅ”i neloÄ£iski: mēs izdodam programmatÅ«ras versiju, kuru vēl neesam pat pārbaudÄ«juÅ”i (citādi nevaram, jo, lai pārbaudÄ«tu, ir jāievieto tags). Otrkārt, Å”is ceļŔ nav saderÄ«gs ar Gitflow.

Otrā iespēja - git commit + tag. Galvenā filiālei ir atzÄ«me 1.0; par to reÄ£istrā - attēls, kas izvietots ražoÅ”anā. Turklāt Kubernetes klasterim ir priekÅ”skatÄ«juma un iestudējuma kontÅ«ras. Tālāk mēs sekojam Gitflow: galvenajā attÄ«stÄ«bas filiālē (develop) mēs izveidojam jaunus lÄ«dzekļus, kā rezultātā tiek veikta apņemÅ”anās ar identifikatoru #c1. Mēs to apkopojam un publicējam reÄ£istrā, izmantojot Å”o identifikatoru (#c1). Ar to paÅ”u identifikatoru mēs izlaižam priekÅ”skatÄ«jumu. Mēs darām to paÅ”u ar saistÄ«bām #c2 Šø #c3.

Kad mēs sapratām, ka ir pietiekami daudz funkciju, mēs sākam visu stabilizēt. Izveidojiet filiāli programmā Git release_1.1 (uz pamatnes #c3 no develop). Nav nepiecieÅ”ams vākt Å”o izlaidumu, jo... tas tika darÄ«ts iepriekŔējā darbÄ«bā. Tāpēc mēs varam to vienkārÅ”i izvērst iestudÄ“Å”anai. Mēs izlabojam kļūdas #c4 un lÄ«dzÄ«gi izrullēt iestudÄ“Å”anai. Tajā paŔā laikā notiek attÄ«stÄ«ba develop, kur periodiski tiek veiktas izmaiņas no release_1.1. Kādā brÄ«dÄ« mēs saņemam apņemÅ”anos, kas tiek apkopota un augÅ”upielādēta inscenÄ“Å”anai, un mēs esam apmierināti ar (#c25).

Pēc tam mēs sapludinām (ar ātri pārtÄ«Å”anu) atbrÄ«voÅ”anas zaru (release_1.1) meistarā. Mēs ievietojām tagu ar jauno versiju Å”ai apņemÅ”anai (1.1). Bet Å”is attēls jau ir savākts reÄ£istrā, tāpēc, lai tas vairs netiktu savākts, mēs vienkārÅ”i pievienojam otru tagu esoÅ”ajam attēlam (tagad tam ir tagi reÄ£istrā #c25 Šø 1.1). Pēc tam mēs to izrullējam uz ražoÅ”anu.

Ir trÅ«kums, ka inscenÄ“Å”anai tiek augÅ”upielādēts tikai viens attēls (#c25), un ražoÅ”anā tas ir savādāk (1.1), taču mēs zinām, ka ā€œfiziskiā€ tie ir viens un tas pats attēls no reÄ£istra.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Patiesais trūkums ir tas, ka nav atbalsta sapludināŔanas saistībām, jums ir jādara ātri uz priekŔu.

Mēs varam iet tālāk un veikt triku... ApskatÄ«sim vienkārÅ”a Dockerfile piemēru:

FROM ruby:2.3 as assets
RUN mkdir -p /app
WORKDIR /app
COPY . ./
RUN gem install bundler && bundle install
RUN bundle exec rake assets:precompile
CMD bundle exec puma -C config/puma.rb

FROM nginx:alpine
COPY --from=assets /app/public /usr/share/nginx/www/public

Izveidosim no tā failu pēc Ŕāda principa:

  • SHA256 no izmantoto attēlu identifikatoriem (ruby:2.3 Šø nginx:alpine), kas ir to satura kontrolsummas;
  • visas komandas (RUN, CMD un tā tālāk.);
  • SHA256 no failiem, kas tika pievienoti.

... un paņemiet kontrolsummu (atkal SHA256) no Ŕāda faila. Å is parakstu viss, kas nosaka Docker attēla saturu.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

AtgriezÄ«simies pie diagrammas un apņemÅ”anos vietā izmantosim Ŕādus parakstus, t.i. atzÄ«mējiet attēlus ar parakstiem.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Tagad, kad ir nepiecieÅ”ams, piemēram, sapludināt izmaiņas no laidiena uz galveno, mēs varam veikt reālu sapludināŔanas apņemÅ”anos: tai bÅ«s cits identifikators, bet tas pats paraksts. Ar to paÅ”u identifikatoru mēs izlaidÄ«sim attēlu ražoÅ”anā.

TrÅ«kums ir tāds, ka tagad nebÅ«s iespējams noteikt, kāda veida saistÄ«bas tika virzÄ«tas uz ražoÅ”anu - kontrolsummas darbojas tikai vienā virzienā. Å o problēmu atrisina papildu slānis ar metadatiem ā€” es jums pastāstÄ«Å”u vairāk vēlāk.

AtzīmēŔana werf

werf mēs gājām vēl tālāk un gatavojamies veikt izkliedētu bÅ«vÄ“Å”anu ar keÅ”atmiņu, kas netiek glabāta vienā maŔīnā... Tātad, mēs veidojam divu veidu Docker attēlus, mēs tos saucam posms Šø attēls.

werf Git repozitorijā tiek glabāti bÅ«vējumam specifiski norādÄ«jumi, kas apraksta dažādus bÅ«vÄ“Å”anas posmus (pirms instalÄ“Å”anas, uzstādÄ«t, pirms iestatÄ«Å”anas, iestatÄ«Å”ana). Mēs apkopojam pirmā posma attēlu ar parakstu, kas definēts kā pirmo soļu kontrolsumma. Tad pievienojam pirmkodu, jaunajam skatuves attēlam aprēķinām tā kontrolsummu... Å Ä«s darbÄ«bas atkārtojas visiem posmiem, kā rezultātā iegÅ«stam skatuves attēlu kopu. Tad mēs izveidojam galÄ«go attēlu, kurā ir arÄ« metadati par tā izcelsmi. Un mēs atzÄ«mējam Å”o attēlu dažādos veidos (sÄ«kāka informācija vēlāk).

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Pieņemsim, ka pēc tam parādās jauna apņemÅ”anās, kurā ir mainÄ«ts tikai lietojumprogrammas kods. Kas notiks? Koda izmaiņām tiks izveidots ielāps un sagatavots jauns skatuves attēls. Tās paraksts tiks noteikts kā vecā skatuves tēla un jaunā ielāpa kontrolsumma. No Ŕī attēla tiks izveidots jauns galÄ«gais attēls. LÄ«dzÄ«ga uzvedÄ«ba notiks ar izmaiņām citos posmos.

Tādējādi skatuves attēli ir keÅ”atmiņa, kuru var glabāt izplatÄ«ti, un no tās jau izveidotie attēli tiek augÅ”upielādēti Docker reÄ£istrā.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Reģistra tīrīŔana

Mēs nerunājam par slāņu dzÄ“Å”anu, kas palika karājuÅ”ies pēc dzēstiem tagiem - tā ir paÅ”a Docker reÄ£istra standarta funkcija. Mēs runājam par situāciju, kad sakrājas daudz Docker tagu un saprotam, ka daļa no tiem mums vairs nav vajadzÄ«gi, bet tie aizņem vietu (un/vai mēs par to maksājam).

Kādas ir tÄ«rÄ«Å”anas stratēģijas?

  1. JÅ«s varat vienkārÅ”i neko nedarÄ«t netÄ«rÄ«t. Reizēm patieŔām ir vieglāk nedaudz samaksāt par papildu vietu, nekā izjaukt milzÄ«gu tagu mudžekli. Bet tas darbojas tikai lÄ«dz noteiktam brÄ«dim.
  2. PilnÄ«ga atiestatÄ«Å”ana. Ja izdzÄ“Å”at visus attēlus un atjaunojat tikai paÅ”reizējos attēlus CI sistēmā, var rasties problēma. Ja konteiners tiek restartēts ražoÅ”anā, tam tiks ielādēts jauns attēls - tāds, kuru vēl neviens nav pārbaudÄ«jis. Tas nogalina ideju par nemainÄ«gu infrastruktÅ«ru.
  3. Zils zaļŔ. Viens reÄ£istrs sāka pārpildÄ«t - mēs augÅ”upielādējam attēlus citā. Tāda pati problēma kā iepriekŔējā metodē: kurā brÄ«dÄ« jÅ«s varat notÄ«rÄ«t reÄ£istru, kas ir sācis pārpildÄ«t?
  4. Ar laiku. Vai dzēst visus attēlus, kas vecāki par 1 mēnesi? Bet noteikti būs kāds serviss, kas mēnesi nav atjaunināts...
  5. ar rokām noteikt, ko jau var izdzēst.

Ir divas patiesi dzÄ«votspējÄ«gas iespējas: netÄ«rÄ«t vai zili zaļa + kombinācija manuāli. Pēdējā gadÄ«jumā mēs runājam par sekojoÅ”o: kad saprotat, ka ir pienācis laiks tÄ«rÄ«t reÄ£istru, izveidojiet jaunu un pievienojiet tam visus jaunos attēlus, piemēram, mēneÅ”a laikā. Un pēc mēneÅ”a skatiet, kuri Kubernetes podi joprojām izmanto veco reÄ£istru, un pārsÅ«tiet tos arÄ« uz jauno reÄ£istru.

Pie kā esam nonākuÅ”i werf? Mēs savācam:

  1. Git head: visi tagi, visi zari - pieņemot, ka mums ir nepiecieÅ”ams viss, kas attēlos ir atzÄ«mēts Git (un ja nē, tad mums tas ir jāizdzÄ“Å” paŔā Gitā);
  2. visas pākstis, kas Å”obrÄ«d tiek izsÅ«knētas uz Kubernetes;
  3. vecie ReplicaSets (kas nesen tika izlaists), un mēs arī plānojam skenēt Helm izlaidumus un atlasīt tur jaunākos attēlus.

... un izveidojiet balto sarakstu no Ŕīs kopas - attēlu sarakstu, kurus mēs neizdzēsÄ«sim. Mēs iztÄ«rām visu pārējo, pēc tam atrodam bāreņu skatuves attēlus un arÄ« tos izdzÄ“Å”am.

IzvietoŔanas stadija

Uzticama deklarativitāte

Pirmais punkts, kam vēlos pievērst uzmanÄ«bu izvietoÅ”anā, ir atjauninātās resursa konfigurācijas izvērÅ”ana, kas deklaratÄ«vi deklarēta. Sākotnējais YAML dokuments, kurā aprakstÄ«ti Kubernetes resursi, vienmēr ļoti atŔķiras no rezultāta, kas faktiski darbojas klasterÄ«. Tā kā Kubernetes papildina konfigurāciju:

  1. identifikatori;
  2. pakalpojumu informācija;
  3. daudzas noklusējuma vērtības;
  4. sadaļa ar paÅ”reizējo statusu;
  5. izmaiņas, kas veiktas uzņemÅ”anas tÄ«mekļa aizÄ·eres ietvaros;
  6. dažādu kontrolieru (un plānotāja) darba rezultāts.

Tāpēc, kad parādās jauna resursa konfigurācija (jauns), mēs nevaram vienkārÅ”i ņemt un pārrakstÄ«t paÅ”reizējo, ā€œtieÅ”oā€ konfigurāciju ar to (dzÄ«vot). Lai to izdarÄ«tu, mums bÅ«s jāsalÄ«dzina jauns ar pēdējo lietoto konfigurāciju (pēdējo reizi lietots) un ritiniet uz dzÄ«vot saņēma plāksteri.

Å o pieeju sauc Divvirzienu sapludināŔana. To lieto, piemēram, Helmā.

Ir arī Divvirzienu sapludināŔana, kas atŔķiras ar to:

  • salÄ«dzinot pēdējo reizi lietots Šø jauns, mēs skatāmies, kas tika izdzēsts;
  • salÄ«dzinot jauns Šø dzÄ«vot, mēs skatāmies, kas ir pievienots vai mainÄ«ts;
  • uzlikts summētais plāksteris dzÄ«vot.

Ar Helm mēs izvietojam vairāk nekā 1000 lietojumprogrammu, tāpēc mēs faktiski izmantojam divvirzienu sapludināŔanu. Tomēr tam ir vairākas problēmas, kuras esam atrisinājuÅ”i ar saviem ielāpiem, kas palÄ«dz Helmam normāli strādāt.

Reāls izlaiŔanas statuss

Kad mÅ«su CI sistēma Ä£enerē jaunu Kubernetes konfigurāciju, pamatojoties uz nākamo notikumu, tā nosÅ«ta to lietoÅ”anai (pieteikties) uz kopu - izmantojot Helm vai kubectl apply. Tālāk notiek jau aprakstÄ«tā N-way sapludināŔana, uz kuru Kubernetes API apstiprinoÅ”i reaģē uz CI sistēmu un tā ā€“ uz tās lietotāju.

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Tomēr ir milzÄ«ga problēma: galu galā veiksmÄ«ga pieteikÅ”anās nenozÄ«mē veiksmÄ«gu izlaiÅ”anu. Ja Kubernetes saprot, kādas izmaiņas ir jāpiemēro, un piemēro tās, mēs joprojām nezinām, kāds bÅ«s rezultāts. Piemēram, podziņu atjaunināŔana un restartÄ“Å”ana priekÅ”galā var bÅ«t veiksmÄ«ga, bet ne aizmugursistēmā, un mēs iegÅ«sim dažādas darbojoÅ”os lietojumprogrammu attēlu versijas.

Lai visu izdarÄ«tu pareizi, Å”ai shēmai ir nepiecieÅ”ama papildu saite - Ä«paÅ”s izsekotājs, kas saņems statusa informāciju no Kubernetes API un pārsÅ«tÄ«s to tālākai lietas reālā stāvokļa analÄ«zei. Mēs izveidojām atvērtā pirmkoda bibliotēku pakalpojumā Go - kubsuns (skatiet tās paziņojumu Å”eit), kas atrisina Å”o problēmu un ir iebÅ«vēts werf.

Å Ä« izsekotāja darbÄ«ba werf lÄ«menÄ« tiek konfigurēta, izmantojot anotācijas, kas tiek ievietotas izvietojumos vai StatefulSets. Galvenā anotācija - fail-mode - saprot Ŕādas nozÄ«mes:

  • IgnoreAndContinueDeployProcess ā€” mēs ignorējam Ŕīs sastāvdaļas ievieÅ”anas problēmas un turpinām izvērÅ”anu;
  • FailWholeDeployProcessImmediately ā€” kļūda Å”ajā komponentā aptur izvietoÅ”anas procesu;
  • HopeUntilEndOfDeployProcess ā€” mēs ceram, ka Å”is komponents darbosies lÄ«dz izvietoÅ”anas beigām.

Piemēram, Ŕī resursu un anotācijas vērtÄ«bu kombinācija fail-mode:

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Kad mēs izvietojam pirmo reizi, datubāze (MongoDB) var vēl nebÅ«t gatava ā€” izvietoÅ”ana neizdosies. Bet jÅ«s varat gaidÄ«t brÄ«di, kad tas sāksies, un izvietoÅ”ana joprojām notiks.

Ir vēl divas anotācijas kubedog in werf:

  • failures-allowed-per-replica ā€” katras kopijas pieļaujamo kritienu skaits;
  • show-logs-until ā€” regulē brÄ«di, lÄ«dz kuram werf rāda (in stdout) baļķus no visām izritinātajām pākstÄ«m. Noklusējums ir PodIsReady (lai ignorētu ziņojumus, kurus mēs, iespējams, nevēlamies, kad satiksme sāk plÅ«st uz podziņu), taču ir derÄ«gas arÄ« vērtÄ«bas: ControllerIsReady Šø EndOfDeploy.

Ko vēl mēs vēlamies no izvietoÅ”anas?

Papildus diviem jau aprakstītajiem punktiem mēs vēlētos:

  • redzēt baļķi - un tikai nepiecieÅ”amās, un ne visu pēc kārtas;
  • dziesmu progresu, jo, ja darbs ā€œpa klusoā€ karājas vairākas minÅ«tes, ir svarÄ«gi saprast, kas tur notiek;
  • ir automātiska atgrieÅ”ana ja kaut kas nogāja greizi (un tāpēc ir ļoti svarÄ«gi zināt izvietoÅ”anas patieso statusu). IzlaiÅ”anai ir jābÅ«t kodolÄ«gai: vai nu tas iet lÄ«dz galam, vai arÄ« viss atgriežas iepriekŔējā stāvoklÄ«.

Rezultāti

Mums kā uzņēmumam, lai ieviestu visas aprakstītās nianses dažādos piegādes posmos (veidot, publicēt, izvietot), pietiek ar CI sistēmu un utilītu werf.

Secinājuma vietā:

werf - mūsu rīks CI / CD pakalpojumā Kubernetes (pārskats un video pārskats)

Ar werf palÄ«dzÄ«bu mēs esam guvuÅ”i labus panākumus daudzu DevOps inženieru problēmu risināŔanā un bÅ«tu priecÄ«gi, ja plaŔāka sabiedrÄ«ba vismaz izmēģinātu Å”o utilÄ«tu darbÄ«bā. Kopā bÅ«s vieglāk sasniegt labu rezultātu.

Videoklipi un slaidi

Video no izrādes (~47 minūtes):

Ziņojuma prezentācija:

PS

Citi ziņojumi par Kubernetes mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru