werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

27 me nan sal prensipal konferans DevOpsConf 2019 la, ki te fèt nan kad festival la. RIT++ 2019, kòm yon pati nan seksyon "Livrezon Kontinyèl", yo te bay yon rapò "werf - zouti nou an pou CI/CD nan Kubernetes." Li pale sou sa yo pwoblèm ak defi ke tout moun ap fè fas lè yo deplwaye nan Kubernetes, osi byen ke sou nuans ki ka pa imedyatman aparan. Analize solisyon posib, nou montre kouman sa a aplike nan yon zouti Open Source werf.

Depi prezantasyon an, sèvis piblik nou an (ansyen ke yo rekonèt kòm yon dapp) te rive nan yon etap enpòtan istorik nan 1000 zetwal sou GitHub — nou espere ke kominote k ap grandi itilizatè yo pral rann lavi pi fasil pou anpil enjenyè DevOps.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Donk, ann prezante videyo rapò a (~47 minit, pi plis enfòmasyon pase atik la) ak ekstrè prensipal la nan fòm tèks. Ale!

Livre kòd pou Kubernetes

Diskou a pa pral ankò sou werf, men sou CI/CD nan Kubernetes, sa vle di ke lojisyèl nou an pake nan resipyan Docker. (Mwen te pale sou sa nan rapò 2016), ak K8s yo pral itilize pou kouri li nan pwodiksyon an (plis sou sa nan 2017 ane).

Ki jan livrezon sanble nan Kubernetes?

  • Gen yon depo Git ak kòd la ak enstriksyon pou bati li. Aplikasyon an bati nan yon imaj Docker epi li pibliye nan Rejis Docker.
  • Menm repozitwa a gen tou enstriksyon sou kòman yo deplwaye ak kouri aplikasyon an. Nan etap deplwaman an, enstriksyon sa yo voye bay Kubernetes, ki resevwa imaj la vle soti nan rejis la epi lanse li.
  • Anplis de sa, anjeneral gen tès yo. Kèk nan sa yo ka fè lè pibliye yon imaj. Ou kapab tou (swiv menm enstriksyon yo) deplwaye yon kopi aplikasyon an (nan yon espas non K8s separe oswa yon gwoup separe) epi fè tès la.
  • Finalman, ou bezwen yon sistèm CI ki resevwa evènman ki soti nan Git (oswa klike sou bouton) epi ki rele tout etap yo deziyen yo: bati, pibliye, deplwaye, teste.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Gen kèk nòt enpòtan isit la:

  1. Paske nou gen yon enfrastrikti imuiabl (enfrastrikti imuiabl), imaj aplikasyon an ki itilize nan tout etap (sèn nan, pwodiksyon, elatriye), dwe genyen youn. Mwen te pale sou sa a an plis detay ak egzanp. isit la.
  2. Paske nou swiv enfrastrikti kòm apwòch kòd (IaC), kòd aplikasyon an, enstriksyon pou rasanble ak lanse li ta dwe egzakteman nan yon sèl depo. Pou plis enfòmasyon sou sa, gade menm rapò a.
  3. Chèn livrezon (livrezon) anjeneral nou wè li konsa: aplikasyon an te rasanble, teste, lage (etap lage) ak sa a li - livrezon te fèt. Men, an reyalite, itilizatè a jwenn sa ou woule soti, pa gen okenn Lè sa a, lè ou delivre li nan pwodiksyon, ak lè li te kapab ale la ak pwodiksyon sa a te travay. Se konsa, mwen kwè chèn livrezon an fini sèlman nan etap operasyonèl la (kouri), oswa plis jisteman, menm nan moman sa a lè yo te retire kòd la nan pwodiksyon (ranplase li ak yon nouvo).

Ann retounen nan konplo livrezon ki anwo a nan Kubernetes: li te envante pa sèlman pa nou, men literalman pa tout moun ki te fè fas ak pwoblèm sa a. An reyalite, modèl sa a kounye a rele GitOps (ou ka li plis sou tèm nan ak lide ki dèyè li isit la). Ann gade nan etap yo nan konplo a.

Bati etap

Li ta sanble ke ou ka pale sou bati imaj Docker nan 2019, lè tout moun konnen ki jan yo ekri Dockerfiles epi kouri. docker build?.. Men nuans mwen ta renmen peye atansyon sou yo:

  1. Pwa imaj zafè, kidonk itilize milti-etapkite nan imaj la sèlman aplikasyon an ki vrèman nesesè pou operasyon an.
  2. Kantite kouch dwe minimize pa konbine chenn nan RUN-kòmand selon siyifikasyon.
  3. Sepandan, sa a ajoute pwoblèm debogaj, paske lè asanble a aksidan, ou dwe jwenn bon lòd nan chèn ki te lakòz pwoblèm nan.
  4. Vitès asanble enpòtan paske nou vle byen vit dewoule chanjman epi wè rezilta yo. Pou egzanp, ou pa vle rebati depandans nan bibliyotèk lang chak fwa ou bati yon aplikasyon.
  5. Souvan soti nan yon sèl depo Git ou bezwen anpil imaj, ki ka rezoud pa yon seri Dockerfiles (oswa non etap nan yon sèl dosye) ak yon script Bash ak asanble sekans yo.

Sa a te jis pwent iceberg la ke tout moun ap fè fas. Men, gen lòt pwoblèm, an patikilye:

  1. Souvan nan etap asanble a nou bezwen yon bagay mòn (pa egzanp, kache rezilta yon kòmand tankou apt nan yon anyè twazyèm pati).
  2. Nou vle Ansible olye pou yo ekri nan koki.
  3. Nou vle bati san Docker (poukisa nou bezwen yon machin vityèl adisyonèl kote nou bezwen konfigirasyon tout bagay pou sa, lè nou deja gen yon gwoup Kubernetes kote nou ka kouri kontenè?).
  4. Asanble paralèl, ki ka konprann nan diferan fason: kòmandman diferan soti nan Dockerfile a (si milti-etap yo itilize), plizyè komèt nan menm repozitwa a, plizyè Dockerfile.
  5. Asanble distribiye: Nou vle kolekte bagay nan gous ki "efemèr" paske kachèt yo disparèt, ki vle di li bezwen yo dwe estoke yon kote separeman.
  6. Finalman, mwen te nonmen pwent dezi a otomajik: Li ta ideyal pou ale nan depo a, tape kèk kòmand epi jwenn yon imaj ki pare, reyini ak yon konpreyansyon sou ki jan ak sa yo dwe fè kòrèkteman. Sepandan, mwen pèsonèlman mwen pa sèten ke tout nuans yo ka prevwa nan fason sa a.

Ak isit la se pwojè yo:

  • moby/buildkit — yon mason ki soti nan Docker Inc (deja entegre nan vèsyon aktyèl la nan Docker), ki ap eseye rezoud tout pwoblèm sa yo;
  • kaniko — yon mason nan Google ki pèmèt ou bati san Docker;
  • Buildpacks.io — Eseye CNCF pou fè maji otomatik ak, an patikilye, yon solisyon enteresan ak rebase pou kouch;
  • ak yon pakèt lòt sèvis piblik, tankou bati, genuinetools/img...

...epi gade konbyen zetwal yo genyen sou GitHub. Sa vle di, sou yon bò, docker build egziste epi li ka fè yon bagay, men an reyalite pwoblèm nan pa konplètman rezoud - prèv sa a se devlopman paralèl nan pèseptè altènatif, chak nan yo ki rezoud kèk pati nan pwoblèm yo.

Asanble nan werf

Se konsa, nou te rive werf (deja pi popilè tankou dapp) — Yon sèvis piblik sous louvri soti nan konpayi an Flant, ke nou te fè pou plizyè ane. Tout bagay te kòmanse 5 ane de sa ak scripts Bash ki te optimize asanblaj Dockerfiles, e pandan 3 dènye ane yo te fè yon devlopman konplè nan kad yon pwojè ak pwòp depo Git li yo. (premye nan Ruby, ak Lè sa a reekri ale, epi an menm tan chanje non). Ki pwoblèm asanble yo rezoud nan werf?

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Pwoblèm ki genyen lonbraj an ble yo deja aplike, konstriksyon paralèl la te fèt nan menm lame a, epi pwoblèm yo make an jòn yo planifye pou yo fini nan fen sezon ete a.

Etap piblikasyon nan rejis (pibliye)

Nou konpoze docker push... - ki sa ki ka difisil sou uploading yon imaj nan rejis la? Lè sa a, kesyon an rive: "Ki tag mwen ta dwe mete sou imaj la?" Li rive pou rezon ke nou genyen Gitflow (oswa lòt estrateji Git) ak Kubernetes, ak endistri a ap eseye asire ke sa k ap pase nan Kubernetes swiv sa k ap pase nan Git. Apre yo tout, Git se sèl sous nou nan verite.

Ki sa ki difisil sou sa a? Asire repwodibilite: soti nan yon komèt nan Git, ki se imuiabl nan lanati (imuiabl), nan yon imaj Docker, ki ta dwe kenbe menm bagay la.

Li enpòtan tou pou nou detèmine orijin, paske nou vle konprann ki soti nan ki komèt aplikasyon an kouri nan Kubernetes te bati (Lè sa a, nou ka fè diferans ak bagay ki sanble).

Estrateji Tagging

Premye a se senp git tag. Nou gen yon rejis ak yon imaj make kòm 1.0. Kubernetes gen etap ak pwodiksyon, kote imaj sa a Uploaded. Nan Git nou fè komite epi nan kèk pwen nou tag 2.0. Nou kolekte li dapre enstriksyon ki soti nan repozitwa a epi mete li nan rejis la ak tag la 2.0. Nou woule li nan etap epi, si tout bagay byen, Lè sa a, nan pwodiksyon an.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Pwoblèm nan ak apwòch sa a se ke nou premye mete tag la, epi sèlman Lè sa a, teste ak woule li soti. Poukisa? Premyèman, li se tou senpleman lojik: n ap bay yon vèsyon lojisyèl ke nou poko menm teste (nou pa ka fè otreman, paske yo nan lòd yo tcheke, nou bezwen mete yon tag). Dezyèmman, chemen sa a pa konpatib ak Gitflow.

Dezyèm posiblite a se git komèt + tag. Branch mèt la gen yon tag 1.0; pou li nan rejis - yon imaj deplwaye nan pwodiksyon an. Anplis de sa, gwoup Kubernetes la gen aperçu ak kontou sèn. Apre sa nou swiv Gitflow: nan branch prensipal la pou devlopman (develop) nou fè nouvo karakteristik, sa ki lakòz yon komèt ak idantifyan an #c1. Nou kolekte li epi pibliye li nan rejis la lè l sèvi avèk idantifyan sa a (#c1). Avèk menm idantifyan an nou woule pou preview. Nou fè menm bagay la ak commits #c2 и #c3.

Lè nou reyalize ke gen ase karakteristik, nou kòmanse estabilize tout bagay. Kreye yon branch nan Git release_1.1 (sou baz la #c3 nan develop). Pa gen okenn nesesite pou kolekte lage sa a, paske... sa a te fè nan etap anvan an. Se poutèt sa, nou ka tou senpleman woule li soti nan sèn. Nou ranje ensèk nan #c4 ak menm jan an woule soti nan sèn. An menm tan, devlopman an sou pye develop, kote chanjman yo detanzantan pran nan release_1.1. Nan kèk pwen, nou jwenn yon komèt reyini epi telechaje sou sèn, ke nou kontan ak (#c25).

Lè sa a, nou rantre (ak vit-avant) branch lan lage (release_1.1) nan mèt. Nou mete yon tag ak nouvo vèsyon an sou komite sa a (1.1). Men, imaj sa a deja kolekte nan rejis la, kidonk pou pa kolekte li ankò, nou tou senpleman ajoute yon dezyèm tag nan imaj ki egziste deja (kounye a li gen tags nan rejis la). #c25 и 1.1). Apre sa, nou woule li soti nan pwodiksyon an.

Gen yon dezavantaj ke se sèlman yon imaj ki telechaje sou sèn (#c25), ak nan pwodiksyon li nan kalite diferan (1.1), men nou konnen ke "fizikman" sa yo se menm imaj ki soti nan rejis la.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Dezavantaj reyèl la se ke pa gen okenn sipò pou rantre komèt, ou dwe fè vit-pi devan.

Nou ka ale pi lwen epi fè yon Trick... Ann gade nan yon egzanp yon Dockerfile senp:

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

Ann bati yon fichye nan li selon prensip sa a:

  • SHA256 soti nan idantifyan imaj yo itilize yo (ruby:2.3 и nginx:alpine), ki se checksum de sa yo;
  • tout ekip (RUN, CMD ak sou sa.);
  • SHA256 soti nan dosye yo te ajoute.

... epi pran sòm chèk la (ankò SHA256) nan yon dosye konsa. Sa a siyati tout sa ki defini sa ki nan imaj la Docker.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Ann tounen nan dyagram nan ak olye de commits nou pral sèvi ak siyati sa yo, i.e. tag imaj ak siyati.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Koulye a, lè li nesesè, pou egzanp, rantre chanjman ki soti nan yon lage nan mèt, nou ka fè yon komèt fizyon reyèl: li pral gen yon idantifyan diferan, men menm siyati a. Avèk menm idantifyan an nou pral woule imaj la nan pwodiksyon an.

Dezavantaj la se ke kounye a li pa pral posib detèmine ki kalite komèt te pouse nan pwodiksyon - chèk sòm sèlman travay nan yon direksyon. Pwoblèm sa a rezoud pa yon kouch adisyonèl ak metadata - mwen pral di w plis pita.

Tagging nan werf

Nan werf nou te ale menm pi lwen epi yo ap prepare yo fè yon distribye bati ak yon kachèt ki pa estoke sou yon sèl machin ... Donk, nou gen de kalite imaj Docker bati, nou rele yo. etap и imaj.

Repozitwa werf Git la estoke enstriksyon espesifik pou bati ki dekri diferan etap konstriksyon an (anvan Enstale, enstale, anvan Enstalasyon, konfigirasyon). Nou kolekte imaj premye etap la ak yon siyati defini kòm sòm chèk premye etap yo. Lè sa a, nou ajoute kòd sous la, pou nouvo imaj etap la nou kalkile checksum li yo... Operasyon sa yo repete pou tout etap, kòm yon rezilta nou jwenn yon seri imaj etap. Lè sa a, nou fè imaj final la, ki gen tou metadata sou orijin li yo. Epi nou tag imaj sa a nan diferan fason (detay pita).

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Sipoze apre sa yon nouvo komite parèt kote sèlman kòd aplikasyon an te chanje. Kisa ki pral rive? Pou chanjman kòd, yo pral kreye yon patch epi yo pral prepare yon nouvo imaj etap. Siyati li yo pral detèmine kòm sòm chèk ansyen imaj etap la ak nouvo patch la. Yon nouvo imaj final pral fòme apati imaj sa a. Konpòtman menm jan an ap fèt ak chanjman nan lòt etap.

Kidonk, imaj etap yo se yon kachèt ki ka estoke distribye, epi imaj yo deja kreye nan li yo telechaje nan Rejis Docker.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Netwaye rejis la

Nou pa pale de efase kouch ki rete pandye apre tags efase - sa a se yon karakteristik estanda nan Rejis Docker tèt li. Nou ap pale de yon sitiyasyon lè yon anpil nan Tags Docker akimile epi nou konprann ke nou pa bezwen kèk nan yo ankò, men yo pran espas (e / oswa nou peye pou li).

Ki estrateji netwayaj yo?

  1. Ou ka jis fè anyen pa netwaye. Pafwa li vrèman pi fasil pou peye yon ti kras pou espas siplemantè pase debouche yon gwo mele nan tags. Men, sa a sèlman travay jiska yon sèten pwen.
  2. Reyajiste konplè. Si ou efase tout imaj yo epi rebati sèlman sa yo kounye a nan sistèm CI a, yon pwoblèm ka leve. Si veso a rekòmanse nan pwodiksyon, yo pral chaje yon nouvo imaj pou li - youn ki poko te teste pa nenpòt moun. Sa a touye lide nan enfrastrikti imuiabl.
  3. Ble-vèt. Yon rejis te kòmanse debòde - nou telechaje imaj nan yon lòt. Pwoblèm nan menm jan ak metòd anvan an: nan ki pwen ou ka netwaye rejis la ki te kòmanse debòde?
  4. Pa tan. Efase tout imaj ki gen plis pase 1 mwa? Men, pral definitivman gen yon sèvis ki pa te mete ajou pou yon mwa...
  5. Manyèlman detèmine sa ki ka deja efase.

Gen de opsyon vrèman solid: pa netwaye oswa yon konbinezon de ble-vèt + manyèlman. Nan dènye ka a, nou ap pale de sa ki annapre yo: lè ou konprann ke li se tan pou netwaye rejis la, ou kreye yon nouvo epi ajoute tout nouvo imaj nan li pandan, pou egzanp, yon mwa. Apre yon mwa, gade ki gous nan Kubernetes ki toujou ap itilize ansyen rejis la, epi transfere yo tou nan nouvo rejis la.

Nan kisa nou rive werf? Nou kolekte:

  1. Git tèt: tout tags, tout branch - sipoze ke nou bezwen tout bagay ki make nan Git nan imaj yo (e si se pa, Lè sa a, nou bezwen efase li nan Git tèt li);
  2. tout gous ki kounye a ponpe soti nan Kubernetes;
  3. ansyen ReplicaSets (sa ki te pibliye dènyèman), epi nou planifye tou pou eskane degaje Helm epi chwazi dènye imaj yo la.

... epi fè yon lis blan nan seri sa a - yon lis imaj ke nou pa pral efase. Nou netwaye tout lòt bagay, apre sa nou jwenn imaj etap òfelen epi efase yo tou.

Deplwaye etap

Deklarasyon serye

Pwen an premye ke mwen ta renmen atire atansyon a nan deplwaman an se deplwaye nan konfigirasyon an resous mete ajou, te deklare deklarasyon. Dokiman orijinal YAML ki dekri resous Kubernetes toujou trè diferan de rezilta ki aktyèlman ap kouri nan gwoup la. Paske Kubernetes ajoute nan konfigirasyon an:

  1. idantifyan;
  2. enfòmasyon sèvis;
  3. anpil valè default;
  4. seksyon ak estati aktyèl la;
  5. chanjman ki fèt nan kad webhook admisyon an;
  6. rezilta travay la nan kontwolè divès kalite (ak orè a).

Se poutèt sa, lè yon nouvo konfigirasyon resous parèt (nouvo), nou pa ka jis pran ak ranplase konfigirasyon aktyèl la, "viv" avèk li (viv). Pou fè sa nou pral oblije konpare nouvo ak dènye konfigirasyon aplike a (dènye-aplike) epi woule sou viv te resevwa patch.

Yo rele apwòch sa a 2-fason fizyone. Li se itilize, pou egzanp, nan Helm.

Genyen tou 3-fason fizyone, ki diferan nan sa:

  • konpare dènye-aplike и nouvo, nou gade sa ki te efase;
  • konpare nouvo и viv, nou gade sa ki te ajoute oswa chanje;
  • se patch la adisyone aplike nan viv.

Nou deplwaye plis pase 1000 aplikasyon ak Helm, kidonk nou aktyèlman ap viv ak fusion 2-fason. Sepandan, li gen yon kantite pwoblèm ke nou te rezoud ak plak nou yo, ki ede Helm travay nòmalman.

Estati reyèl lanse

Apre sistèm CI nou an jenere yon nouvo konfigirasyon pou Kubernetes ki baze sou pwochen evènman an, li transmèt li pou itilize (aplike) nan yon grap - lè l sèvi avèk Helm oswa kubectl apply. Apre sa, ki deja dekri N-fason fizyon an rive, ak Kubernetes API a reponn ak apwouve sistèm CI a, ak itilizatè li yo.

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Sepandan, gen yon gwo pwoblèm: apre tout aplikasyon siksè pa vle di deplwaye siksè. Si Kubernetes konprann ki chanjman yo bezwen aplike epi li aplike li, nou toujou pa konnen ki rezilta a pral ye. Pou egzanp, mete ajou ak rekòmanse gous nan entèfas la ka gen siksè, men se pa nan backend la, epi nou pral jwenn diferan vèsyon nan imaj aplikasyon yo kouri.

Pou fè tout bagay kòrèkteman, konplo sa a mande pou yon lyen adisyonèl - yon tracker espesyal ki pral resevwa enfòmasyon sou sitiyasyon ki soti nan Kubernetes API a epi transmèt li pou plis analiz de eta reyèl la nan bagay sa yo. Nou te kreye yon bibliyotèk Open Source nan Go - cubedog (gade anons li a isit la), ki rezoud pwoblèm sa a epi ki bati nan werf.

Konpòtman tracker sa a nan nivo werf konfigirasyon lè l sèvi avèk annotasyon yo mete sou Deplwaman oswa StatefulSets. Anòt prensipal - fail-mode - konprann siyifikasyon sa yo:

  • IgnoreAndContinueDeployProcess — nou inyore pwoblèm yo nan woule soti eleman sa a epi kontinye deplwaman an;
  • FailWholeDeployProcessImmediately — yon erè nan eleman sa a sispann pwosesis deplwaman an;
  • HopeUntilEndOfDeployProcess — nou espere ke eleman sa a pral travay nan fen deplwaman an.

Pou egzanp, konbinezon sa a nan resous ak valè anotasyon fail-mode:

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Lè nou deplwaye pou premye fwa, baz done a (MongoDB) ka poko pare - Deplwaman yo pral echwe. Men, ou ka tann pou moman sa a pou li kòmanse, epi deplwaman an ap toujou pran plas.

Gen de plis anotasyon pou kubedog nan werf:

  • failures-allowed-per-replica — kantite tonbe pèmèt pou chak kopi;
  • show-logs-until - kontwole moman sa a jiskaske werf montre (nan stdout) mòso bwa ki soti nan tout gous woule. Defo a se PodIsReady (pou inyore mesaj ke nou pwobableman pa vle lè trafik la kòmanse vini nan gous la), men valè yo valab tou: ControllerIsReady и EndOfDeploy.

Ki lòt bagay nou vle nan deplwaman?

Anplis de pwen yo deja dekri, nou ta renmen:

  • mòso bwa - ak sèlman sa ki nesesè yo, epi yo pa tout bagay nan yon ranje;
  • tras pwogrè, paske si travay la pandye "an silans" pandan plizyè minit, li enpòtan pou w konprann sa k ap pase la;
  • genyen otomatik rollback nan ka yon bagay ale mal (ak Se poutèt sa li enpòtan pou konnen estati reyèl deplwaman an). Deplwaye a dwe atomik: swa li ale nan fen a, oswa tout bagay retounen nan eta anvan li yo.

Rezilta

Pou nou kòm yon konpayi, aplike tout nuans ki dekri nan diferan etap nan livrezon (konstwi, pibliye, deplwaye), yon sistèm CI ak sèvis piblik yo ase. werf.

Olye pou yo yon konklizyon:

werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)

Avèk èd werf, nou te fè bon pwogrè nan rezoud yon gwo kantite pwoblèm pou enjenyè DevOps e nou ta kontan si kominote a pi laj omwen te eseye sèvis piblik sa a an aksyon. Li pral pi fasil pou reyalize yon bon rezilta ansanm.

Videyo ak glisad

Videyo nan pèfòmans lan (~47 minit):

Prezantasyon rapò a:

PS

Lòt rapò sou Kubernetes sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè