Praktek Pangiriman Kontinyu sareng Docker (ulasan sareng pidéo)

Urang bakal ngamimitian blog urang ku publikasi dumasar kana pidato panganyarna ti diréktur teknis urang distol (Dmitry Stolyarov). Sadayana lumangsung dina 2016 dina sababaraha acara profésional sareng didédikasikeun kana topik DevOps sareng Docker. Hiji pidéo tina rapat Docker Moscow di kantor Badoo, kami parantos diterbitkeun Online. Nu anyar bakal dibarengan ku artikel nu nepikeun hakekat laporan. Jadi…

31 Méi dina konférénsi éta RootConf 2016, dilaksanakeun salaku bagian tina festival "Rusia Internet Technologies" (RIT ++ 2016), bagian "Continuous Deployment and Deployment" dibuka kalayan laporan "Praktik Pangalusna tina Pangiriman Kontinyu kalawan Docker". Éta nyimpulkeun sareng sistematis prakték pangsaéna pikeun ngawangun prosés Pangiriman Kontinyu (CD) nganggo Docker sareng produk Open Source anu sanés. Kami damel sareng solusi ieu dina produksi, anu ngamungkinkeun urang ngandelkeun pangalaman praktis.

Praktek Pangiriman Kontinyu sareng Docker (ulasan sareng pidéo)

Lamun anjeun boga kasempetan pikeun méakkeun sajam video laporan, kami nyarankeun ningali éta lengkep. Upami teu kitu, di handap ieu kasimpulan utama dina wangun téks.

Pangiriman kontinyu sareng Docker

odoh Pangiriman kontinyu urang ngartos ranté kajadian salaku hasil tina kode aplikasi ti gudang Git mimiti produksi, lajeng ends up dina arsip. Sigana mah kieu: Git → Bangun → Test → Leupaskeun → Operate.

Praktek Pangiriman Kontinyu sareng Docker (ulasan sareng pidéo)
Seuseueurna laporan dikhususkeun kana tahap ngawangun (assembly aplikasi), sareng topik anu dileupaskeun sareng dioperasikeun sakedap. Urang bakal ngobrol ngeunaan masalah sareng pola anu ngamungkinkeun anjeun pikeun ngabéréskeunana, sareng palaksanaan khusus tina pola ieu tiasa béda.

Naha Docker diperyogikeun di dieu pisan? Henteu kanggo nanaon urang mutuskeun pikeun ngobrol ngeunaan prakték Pangiriman Terus-terusan dina konteks alat Open Source ieu. Sanajan sakabéh laporan ieu devoted kana pamakéan na, loba alesan anu kaungkap nalika tempo pola utama rollout kode aplikasi.

Pola rollout utama

Janten, nalika urang ngaluncurkeun vérsi énggal tina aplikasi, urang pasti disanghareupan masalah downtime, dihasilkeun salila switching tina server produksi. Lalu lintas tina versi aplikasi anu lami ka anu énggal teu tiasa langsung ngalih: mimitina urang kedah mastikeun yén versi énggal henteu ngan ukur diunduh, tapi ogé "dipanaskeun" (nyaéta, siap pikeun ngalayanan pamundut).

Praktek Pangiriman Kontinyu sareng Docker (ulasan sareng pidéo)
Ku kituna, pikeun sawatara waktu duanana vérsi aplikasi (heubeul jeung anyar) bakal dianggo sakaligus. Nu otomatis ngarah ka konflik sumberdaya dibagikeun: jaringan, sistem file, IPC, jsb. Kalawan Docker, masalah ieu gampang direngsekeun ku ngajalankeun versi béda tina aplikasi dina peti misah, nu isolasi sumberdaya dijamin dina host sarua (server / mesin virtual). Tangtosna, anjeun tiasa nampi sababaraha trik tanpa insulasi, tapi upami aya alat anu siap-dijieun sareng merenah, maka aya alesan anu sabalikna - henteu ngalalaworakeunana.

Containerization nyadiakeun loba mangpaat séjén nalika deployed. Aplikasi naon waé gumantung kana Vérsi husus (atawa rentang versi) juru basa, kasadiaan modul / ekstensi, jsb, kitu ogé versi maranéhna. Sarta ieu manglaku teu ukur keur lingkungan laksana saharita, tapi ogé pikeun sakabéh lingkungan, kaasup software sistem sareng versi na (nepi ka distribusi Linux anu dianggo). Alatan kanyataan yén wadahna ngandung henteu ngan kode aplikasi, tapi ogé sistem tos dipasang sareng parangkat lunak aplikasi tina versi anu diperyogikeun, anjeun tiasa hilap masalah sareng katergantungan.

Hayu urang nyimpulkeun pola rollout utama versi anyar nyokot kana akun faktor di handap ieu:

  1. Mimitina, versi aplikasi anu lami dijalankeun dina wadah anu munggaran.
  2. Versi anyar ieu lajeng digulung kaluar sarta "warmed up" dina wadah kadua. Éta noteworthy yén versi anyar ieu sorangan bisa mawa teu ngan kode aplikasi diropéa, tapi ogé salah sahiji kagumantungan na, kitu ogé komponén sistem (contona, versi anyar tina OpenSSL atawa sakabéh distribusi).
  3. Nalika versi anyar parantos siap pikeun ngalayanan pamundut, lalu lintas ngalih tina wadah kahiji ka wadah kadua.
  4. Versi heubeul ayeuna bisa dieureunkeun.

Pendekatan ieu nyebarkeun vérsi aplikasi anu béda dina wadah anu misah nyayogikeun genah anu sanés - rollback gancang kana versi heubeul (sanggeus kabeh, éta cukup pikeun pindah lalulintas kana wadahna dipikahoyong).

Praktek Pangiriman Kontinyu sareng Docker (ulasan sareng pidéo)
Rekomendasi anu terakhir sigana sapertos anu bahkan Kaptén henteu tiasa mendakan kasalahan: "[nalika ngatur Pangiriman Kontinyu sareng Docker] Paké Docker [sareng ngartos naon anu dipasihkeun]" Émut, ieu sanés pélor pérak anu bakal ngabéréskeun unggal masalah, tapi alat anu nyayogikeun yayasan anu saé.

Reproducibility

Ku "reproducibility" kami hartosna sakumpulan masalah anu digeneralisasi nalika ngoperasikeun aplikasi. Urang ngobrol ngeunaan kasus sapertos:

  • Skrip anu dipariksa ku departemen kualitas pikeun pementasan kedah diproduksi sacara akurat dina produksi.
  • Aplikasi dipedalkeun dina server anu tiasa nampi bungkusan tina spion gudang anu béda (langkung waktos aranjeunna diropéa, sareng sareng aranjeunna versi aplikasi anu dipasang).
  • "Sagala dianggo pikeun kuring sacara lokal!" (... jeung pamekar teu diwenangkeun kana produksi.)
  • Anjeun kudu mariksa hiji hal dina versi heubeul (arsip).
  • ...

Intina umumna nyaéta kanyataan yén patuh pinuh ku lingkungan anu dianggo (sareng henteuna faktor manusa) diperyogikeun. Kumaha urang bisa ngajamin reproducibility? Jieun gambar Docker dumasar kana kode tina Git, teras dianggo pikeun tugas naon waé: dina situs uji, dina produksi, dina mesin programer lokal ... Dina waktos anu sami, penting pikeun ngaleutikan tindakan anu dilakukeun. после assembling gambar: nu basajan éta, nu kurang kamungkinan aya kasalahan.

Infrastruktur nyaéta kode

Upami sarat prasarana (kasadiaan parangkat lunak pangladén, versina, sareng sajabana) henteu diformalkeun sareng "diprogram," maka panyaluran apdet aplikasi tiasa nyababkeun akibat anu cilaka. Salaku conto, dina pementasan anjeun parantos ngalih ka PHP 7.0 sareng nyerat deui kodeu sasuai - teras penampilanna dina produksi sareng sababaraha PHP lami (5.5) pasti bakal kaget batur. Anjeun bisa jadi teu poho ngeunaan parobahan utama dina versi juru, tapi "Iblis aya dina detil": reuwas bisa jadi dina update minor tina kagumantungan nanaon.

Hiji pendekatan pikeun ngajawab masalah ieu katelah IaC (Infrastruktur salaku Kode, "infrastruktur salaku kode") sareng ngalibatkeun nyimpen syarat infrastruktur sareng kode aplikasi. Ngagunakeun éta, pamekar sareng spesialis DevOps tiasa damel sareng gudang aplikasi Git anu sami, tapi dina bagian anu béda. Tina kode ieu, gambar Docker didamel dina Git, dimana aplikasina disebarkeun kalayan merhatikeun sadaya spésifikasi infrastruktur. Kantun nempatkeun, skrip (aturan) pikeun ngarakit gambar kedah aya dina gudang anu sami sareng kode sumber sareng dihijikeun.

Praktek Pangiriman Kontinyu sareng Docker (ulasan sareng pidéo)

Dina kasus arsitéktur aplikasi multi-lapisan - contona, aya nginx, anu nangtung di hareup aplikasi anu parantos dijalankeun di jero wadah Docker - Gambar Docker kedah didamel tina kode di Git pikeun tiap lapisan. Lajeng gambar kahiji bakal ngandung hiji aplikasi kalawan juru sarta séjén "deukeut" kagumantungan, sarta gambar kadua bakal ngandung nginx hulu.

Gambar Docker, komunikasi sareng Git

Kami ngabagi sadaya gambar Docker anu dikumpulkeun tina Git kana dua kategori: samentawis sareng sékrési. Gambar samentara Ditandaan ku nami cabang di Git, tiasa ditimpa ku komitmen salajengna sareng digulung ngan ukur pikeun sawangan (sanes pikeun produksi). Ieu mangrupikeun bédana koncina tina sékrési: anjeun henteu pernah terang mana komitmen khusus anu aya dina aranjeunna.

Éta asup akal pikeun ngumpulkeun kana gambar samentara: cabang master (anjeun tiasa otomatis gulung kaluar ka situs misah pikeun terus ningali versi ayeuna master), cabang kalawan Kaluaran, cabang inovasi husus.

Praktek Pangiriman Kontinyu sareng Docker (ulasan sareng pidéo)
Saatos sawangan gambar samentara datang ka kabutuhan tarjamah kana produksi, pamekar nempatkeun tag tangtu. Dikumpulkeun sacara otomatis ku tag gambar ngaleupaskeun (tag na pakait jeung tag ti Git) sarta digulung kaluar pikeun pementasan. Upami éta suksés diverifikasi ku departemen kualitas, éta nuju ka produksi.

dapp

Sagalana dijelaskeun (rollout, assembly gambar, pangropéa saterusna) bisa dilaksanakeun sacara mandiri ngagunakeun Aksara Bash jeung parabot "improvisasi" lianna. Tapi lamun ngalakukeun ieu, lajeng di sawatara titik palaksanaan bakal ngakibatkeun pajeulitna hébat sarta controllability goréng. Ngartos ieu, urang sumping ka nyiptakeun utilitas Workflow khusus urang sorangan pikeun ngawangun CI / CD - dapp.

Kode sumberna ditulis dina Ruby, open source sareng diterbitkeun dina GitHub. Hanjakalna, dokuméntasi ayeuna mangrupikeun titik anu paling lemah tina alat, tapi kami nuju ngusahakeunana. Sarta kami bakal nulis jeung ngobrol ngeunaan dapp leuwih ti sakali, sabab ... Urang tulus teu tiasa ngantosan babagi kamampuhan na kalawan sakabéh komunitas kabetot, tapi Samentara éta, ngirim masalah anjeun sarta narik requests jeung / atawa turutan ngembangkeun proyék on GitHub.

Diropéa 13 Agustus 2019: ayeuna proyek dapp diganti ngaranna jadi werf, kode na geus sagemblengna ditulis ulang dina Go, sarta dokuméntasi na geus nyata ningkat.

Kubernetes

Alat Open Source anu siap-siap anu parantos nampi pangakuan anu signifikan dina lingkungan profésional nyaéta Kubernetes, klaster manajemén Docker. Topik pamakeanna dina operasi proyék-proyék anu diwangun dina Docker saluareun wengkuan laporan, ku kituna presentasi dugi ka tinjauan sababaraha fitur anu pikaresepeun.

Pikeun peluncuran, Kubernetes nawiskeun:

  • usik kesiapan - mariksa kesiapan versi anyar aplikasi (pikeun ngalihkeun lalu lintas ka dinya);
  • rolling update - update gambar sequential dina klaster wadahna (shutdown, update, préparasi peluncuran, switching lalulintas);
  • Pembaruan sinkron - ngamutahirkeun gambar dina klaster kalayan pendekatan anu béda: mimiti dina satengah wadah, teras sésana;
  • Kaluaran kanaria - ngaluncurkeun gambar anyar dina jumlah wadahna (leutik) pikeun ngawas anomali.

Kusabab Continuous Delivery henteu ngan ukur sékrési versi énggal, Kubernetes gaduh sababaraha kamampuan pikeun pangropéa infrastruktur anu salajengna: ngawaskeun sareng logging pikeun sadaya wadah, skala otomatis, jsb. palaksanaan dina prosés Anjeun.

Rekomendasi ahir

  1. Paké Docker.
  2. Jieun gambar Docker tina aplikasi pikeun sakabéh kaperluan Anjeun.
  3. Turutan prinsip "Infrastruktur nyaéta kode."
  4. Link Git ka Docker.
  5. Ngatur urutan rollout.
  6. Anggo platform anu siap-siap (Kubernetes atanapi anu sanés).

Video sareng slide

Video tina pagelaran (kira-kira sajam) diterbitkeun dina YouTube (laporan sorangan dimimitian ti menit ka-5 - tuturkeun link maén ti moment ieu).

Presentasi laporan:

PS

Laporan séjén ngeunaan topik dina blog urang:

sumber: www.habr.com

Tambahkeun komentar