Rekomendacijos, kaip naudoti „Buildah“ konteineryje

Koks yra konteinerio vykdymo laiko atsiejimo į atskirus įrankių komponentus grožis? Visų pirma, šias priemones galima pradėti derinti taip, kad jos apsaugotų viena kitą.

Rekomendacijos, kaip naudoti „Buildah“ konteineryje

Daugelį žmonių traukia idėja sukurti konteinerinius OCI vaizdus Kubernetes ar panašią sistemą. Tarkime, kad turime CI/CD, kuris nuolat renka vaizdus, ​​tada kažkas panašaus Red Hat OpenShift/Kubernetes būtų gana naudingas apkrovos balansavimui kūrimo metu. Iki šiol dauguma žmonių tiesiog suteikė konteineriams prieigą prie „Docker“ lizdo ir leido paleisti „Docker build“ komandą. Prieš keletą metų parodėmekad tai labai nesaugu, iš tikrųjų tai dar blogiau nei duoti be slaptažodžio root ar sudo.

Štai kodėl žmonės nuolat bando paleisti „Buildah“ konteineryje. Trumpai tariant, mes sukūrėme pavyzdys kaip, mūsų nuomone, geriausia paleisti „Buildah“ konteineryje ir paskelbti atitinkamus vaizdus quay.io/buildah. Pradėkime...

reguliavimas

Šie vaizdai sukurti iš „Dockerfiles“, kuriuos galima rasti aplanko „Buildah“ saugykloje sukurti paveikslėlį.
Čia mes svarstysime stabili Dockerfile versija.

# stable/Dockerfile
#
# Build a Buildah container image from the latest
# stable version of Buildah on the Fedoras Updates System.
# https://bodhi.fedoraproject.org/updates/?search=buildah
# This image can be used to create a secured container
# that runs safely with privileges within the container.
#
FROM fedora:latest

# Don't include container-selinux and remove
# directories used by dnf that are just taking
# up space.
RUN yum -y install buildah fuse-overlayfs --exclude container-selinux; rm -rf /var/cache /var/log/dnf* /var/log/yum.*

# Adjust storage.conf to enable Fuse storage.
RUN sed -i -e 's|^#mount_program|mount_program|g' -e '/additionalimage.*/a "/var/lib/shared",' /etc/containers/storage.conf

Vietoj OverlayFS, įdiegto pagrindinio Linux branduolio lygiu, mes naudojame programą konteinerio viduje saugiklis-perdanga, nes šiuo metu „OverlayFS“ galima prijungti tik tuo atveju, jei suteikiate jai SYS_ADMIN leidimus naudodami „Linux“ galimybes. Ir mes norime paleisti savo Buildah konteinerius be jokių root teisių. Saugiklio perdanga veikia gana greitai ir yra geresnis nei VFS saugojimo tvarkyklė. Atminkite, kad paleisdami „Buildah“ konteinerį, kuriame naudojamas „Fuse“, turite pateikti /dev/fuse įrenginį.

podman run --device /dev/fuse quay.io/buildahctr ...
RUN mkdir -p /var/lib/shared/overlay-images /var/lib/shared/overlay-layers; touch /var/lib/shared/overlay-images/images.lock; touch /var/lib/shared/overlay-layers/layers.lock

Tada sukuriame katalogą papildomai saugyklai. Konteineris/sandėliukas palaiko papildomų tik skaitomų vaizdų parduotuvių prijungimo koncepciją. Pavyzdžiui, galite konfigūruoti perdangos saugyklos sritį viename įrenginyje ir naudoti NFS, kad prijungtumėte šią saugyklą kitame įrenginyje ir naudotumėte vaizdus iš jo neatsisiunčiant ištraukimo būdu. Mums reikia šios saugyklos, kad galėtume prijungti dalį vaizdų saugyklos iš pagrindinio kompiuterio kaip tomą ir naudoti ją konteinerio viduje.

# Set up environment variables to note that this is
# not starting with user namespace and default to
# isolate the filesystem with chroot.
ENV _BUILDAH_STARTED_IN_USERNS="" BUILDAH_ISOLATION=chroot

Galiausiai, naudodami aplinkos kintamąjį BUILDAH_ISOLATION, pagal numatytuosius nustatymus nurodome, kad Buildah konteineris būtų paleistas naudojant chroot izoliaciją. Papildoma izoliacija čia nereikalinga, nes mes jau dirbame konteineryje. Kad „Buildah“ galėtų sukurti savo vardų erdve atskirtus konteinerius, reikalinga SYS_ADMIN privilegija, todėl reikėtų sušvelninti sudėtinio rodinio SELinux ir SECCOMP taisykles, o tai prieštarauja mūsų pasirinkimui kurti iš saugaus konteinerio.

„Buildah“ veikimas konteineryje

Aukščiau aptarta Buildah konteinerio vaizdo diagrama leidžia lanksčiai keisti tokių konteinerių paleidimo būdus.

Greitis prieš saugumą

Kompiuterių saugumas visada yra kompromisas tarp proceso greičio ir apsaugos. Šis teiginys galioja ir surenkant konteinerius, todėl toliau apsvarstysime tokio kompromiso variantus.

Aukščiau aptartas konteinerio vaizdas išsaugos aplanke /var/lib/containers. Todėl turime įdėti turinį į šį aplanką, o tai, kaip tai padarysime, labai paveiks konteinerio vaizdų kūrimo greitį.

Panagrinėkime tris variantus.

1 variantas. Jei reikalingas maksimalus saugumas, kiekvienam konteineriui galite sukurti savo aplanką konteineriams/vaizdams ir prijungti jį prie konteinerio per volume-mount. Be to, kontekstinį katalogą įdėkite į patį konteinerį, aplanką /build:

# mkdir /var/lib/containers1
# podman run -v ./build:/build:z -v /var/lib/containers1:/var/lib/containers:Z quay.io/buildah/stable
buildah  -t image1 bud /build
# podman run -v /var/lib/containers1:/var/lib/containers:Z quay.io/buildah/stable buildah  push  image1 registry.company.com/myuser
# rm -rf /var/lib/containers1

Saugumas. Tokiame konteineryje veikianti „Buildah“ turi maksimalų saugumą: jai nesuteikiamos jokios šakninės teisės naudojant galimybes, jam taikomi visi SECOMP ir SELinux apribojimai. Toks konteineris netgi gali būti paleistas naudojant vartotojo vardų erdvės izoliaciją, pridedant tokią parinktį kaip —uidmap 0: 100000 10000: XNUMX XNUMX.

Spektaklis. Tačiau našumas čia yra minimalus, nes visi vaizdai iš konteinerių registrų kiekvieną kartą nukopijuojami į pagrindinį kompiuterį, o talpyklos kaupimas visiškai neveikia. Baigdamas savo darbą, Buildah konteineris turi nusiųsti vaizdą į registrą ir sunaikinti turinį pagrindiniame kompiuteryje. Kai kitą kartą bus sukurtas konteinerio vaizdas, jį reikės dar kartą atsisiųsti iš registro, nes iki to laiko pagrindiniame kompiuteryje nieko nebeliks.

2 variantas. Jei jums reikia „Docker“ lygio našumo, pagrindinį konteinerį / saugyklą galite montuoti tiesiai į konteinerį.

# podman run -v ./build:/build:z -v /var/lib/containers:/var/lib/containers --security-opt label:disabled quay.io/buildah/stable buildah  -t image2 bud /build
# podman run -v /var/lib/containers:/var/lib/containers --security-opt label:disabled  quay.io/buildah/stable buildah push image2 registry.company.com/myuser

Saugumas. Tai yra mažiausiai saugus būdas kurti sudėtinius rodinius, nes jis leidžia keisti pagrindinio kompiuterio saugyklą ir gali pateikti Podman arba CRI-O kenkėjišką vaizdą. Be to, turėsite išjungti SELinux atskyrimą, kad „Buildah“ konteineryje esantys procesai galėtų sąveikauti su pagrindinio kompiuterio saugykla. Atminkite, kad ši parinktis vis tiek yra geresnė nei „Docker“ lizdas, nes konteineris yra užrakintas dėl likusių saugos funkcijų ir negali tiesiog paleisti konteinerio pagrindiniame kompiuteryje.

Spektaklis. Čia jis yra didžiausias, nes talpyklos kaupimas yra visiškai naudojamas. Jei „Podman“ arba „CRI-O“ jau atsisiuntė reikiamą vaizdą į pagrindinį kompiuterį, „Buildah“ procesui konteineryje nereikės jo dar kartą atsisiųsti, o paskesnės versijos pagal šį vaizdą taip pat galės paimti tai, ko reikia iš talpyklos. .

3 variantas. Šio metodo esmė yra sujungti kelis vaizdus į vieną projektą su bendru konteinerio vaizdų aplanku.

# mkdir /var/lib/project3
# podman run --security-opt label_level=s0:C100, C200 -v ./build:/build:z 
-v /var/lib/project3:/var/lib/containers:Z quay.io/buildah/stable buildah  -t image3 bud /build
# podman run --security-opt label_level=s0:C100, C200 
-v /var/lib/project3:/var/lib/containers quay.io/buildah/stable buildah push image3  registry.company.com/myuser

Šiame pavyzdyje mes neištriname projekto aplanko (/var/lib/project3) tarp paleidimų, todėl visos vėlesnės projekto versijos yra naudingos talpykloje.

Saugumas. Kažkas tarp 1 ir 2 parinkčių. Viena vertus, konteineriai neturi prieigos prie pagrindinio kompiuterio turinio ir, atitinkamai, negali įstumti kažko blogo į Podman/CRI-O vaizdų saugyklą. Kita vertus, dėl savo konstrukcijos konteineris gali trukdyti montuoti kitus konteinerius.

Spektaklis. Čia tai yra blogiau nei naudojant bendrinamą talpyklą pagrindinio kompiuterio lygiu, nes negalite naudoti vaizdų, kurie jau buvo atsisiųsti naudojant Podman / CRI-O. Tačiau, kai „Buildah“ atsisiunčia vaizdą, vaizdas gali būti naudojamas visose vėlesnėse projekto versijose.

Papildoma saugykla

У konteineriai / saugykla Yra toks šaunus dalykas kaip papildomos parduotuvės (papildomos parduotuvės), kurių dėka, paleisdami ir statydami konteinerius, konteinerių varikliai gali naudoti išorines vaizdų saugyklas tik skaitymo perdangos režimu. Iš esmės prie storage.conf failo galite pridėti vieną ar daugiau tik skaitomų saugyklų, kad paleidus konteinerį konteinerio variklis jose ieškotų norimo vaizdo. Be to, jis atsisiųs vaizdą iš registro tik tuo atveju, jei jo neras nė vienoje iš šių saugyklų. Konteinerio variklis galės rašyti tik į rašomą saugyklą...

Jei slinksite aukštyn ir pažvelgsite į Docker failą, kurį naudojame kurdami vaizdą quay.io/buildah/stable, yra šios eilutės:

# Adjust storage.conf to enable Fuse storage.
RUN sed -i -e 's|^#mount_program|mount_program|g' -e '/additionalimage.*/a "/var/lib/shared",' /etc/containers/storage.conf
RUN mkdir -p /var/lib/shared/overlay-images /var/lib/shared/overlay-layers; touch /var/lib/shared/overlay-images/images.lock; touch /var/lib/shared/overlay-layers/layers.lock

Pirmoje eilutėje mes modifikuojame /etc/containers/storage.conf konteinerio vaizde, nurodydami saugyklos tvarkyklei, kad aplanke /var/lib/shared būtų naudojami „additionalimagestores“. O kitoje eilutėje sukuriame bendrinamą aplanką ir pridedame porą užrakinimo failų, kad nebūtų piktnaudžiavimo konteineriais/saugyklomis. Iš esmės mes tiesiog kuriame tuščią konteinerio vaizdų parduotuvę.

Jei konteinerius / saugyklą montuosite aukštesniu nei šis aplankas, „Buildah“ galės naudoti vaizdus.

Dabar grįžkime prie anksčiau aptartos 2 parinkties, kai „Buildah“ konteineris gali skaityti ir rašyti į konteinerius / saugyklą pagrindiniuose kompiuteriuose ir, atitinkamai, turi maksimalų našumą dėl vaizdų kaupimo talpykloje „Podman“ / CRI-O lygiu, tačiau užtikrina minimalų saugumą. nes jis gali rašyti tiesiai į saugyklą. Dabar pridėkime čia papildomos saugyklos ir gaukite visas geriausias iš abiejų pasaulių.

# mkdir /var/lib/containers4
# podman run -v ./build:/build:z -v /var/lib/containers/storage:/var/lib/shared:ro -v  /var/lib/containers4:/var/lib/containers:Z  quay.io/buildah/stable 
 buildah  -t image4 bud /build
# podman run -v /var/lib/containers/storage:/var/lib/shared:ro  
-v >/var/lib/containers4:/var/lib/containers:Z quay.io/buildah/stable buildah push image4  registry.company.com/myuser
# rm -rf /var/lib/continers4

Atminkite, kad pagrindinio kompiuterio /var/lib/containers/storage yra prijungtas prie /var/lib/shared konteinerio viduje tik skaitymo režimu. Todėl dirbdama konteineryje „Buildah“ gali naudoti bet kokius vaizdus, ​​kurie anksčiau buvo atsisiųsti naudojant „Podman/CRI-O“ (labas, greitis), bet gali rašyti tik į savo saugyklą (labas, sauga). Taip pat atkreipkite dėmesį, kad tai daroma neišjungus konteinerio SELinux atskyrimo.

Svarbus niuansas

Jokiu būdu neturėtumėte ištrinti jokių vaizdų iš pagrindinės saugyklos. Priešingu atveju „Buildah“ konteineris gali sugesti.

Ir tai dar ne visi privalumai

Papildomos saugyklos galimybės neapsiriboja aukščiau nurodytu scenarijumi. Pavyzdžiui, galite įdėti visus konteinerio vaizdus į bendrinamą tinklo saugyklą ir suteikti prieigą prie jos visiems Buildah konteineriams. Tarkime, kad turime šimtus vaizdų, kuriuos mūsų CI / CD sistema reguliariai naudoja konteinerių vaizdams kurti. Sukoncentruojame visus šiuos vaizdus į vieną saugyklos pagrindinį kompiuterį ir tada, naudodami pageidaujamus tinklo saugojimo įrankius (NFS, Gluster, Ceph, ISCSI, S3...), atveriame bendrą prieigą prie šios saugyklos visiems Buildah arba Kubernetes mazgams.

Dabar užtenka prijungti šią tinklo saugyklą į Buildah konteinerį, esantį /var/lib/shared, ir viskas – „Buildah“ konteineriams nebereikia atsisiųsti vaizdų ištraukiant. Taigi mes išmetame išankstinio apgyvendinimo etapą ir iš karto esame pasirengę išvynioti konteinerius.

Ir, žinoma, tai gali būti naudojama gyvoje „Kubernetes“ sistemoje arba konteinerių infrastruktūroje, kad būtų galima paleisti ir paleisti konteinerius bet kur, neatsisiunčiant vaizdų. Be to, konteinerio registras, gavęs „push“ užklausą įkelti į jį atnaujintą vaizdą, gali automatiškai nusiųsti šį vaizdą į bendrinamą tinklo saugyklą, kur jis akimirksniu tampa prieinamas visiems mazgams.

Sudėtiniai vaizdai kartais gali siekti daug gigabaitų. Papildomos saugyklos funkcionalumas leidžia išvengti tokių vaizdų klonavimo mazguose ir leidžia beveik akimirksniu paleisti konteinerius.

Be to, šiuo metu dirbame su nauja funkcija, vadinama perdangos tūrio laikikliais, kuri leis dar greičiau pastatyti konteinerius.

išvada

Paleisti „Buildah“ konteineryje „Kubernetes/CRI-O“, „Podman“ ar net „Docker“ yra įmanoma, paprasta ir daug saugiau nei naudojant docker.socket. Labai padidinome darbo su vaizdais lankstumą, todėl galite juos paleisti įvairiais būdais, kad optimizuotumėte saugos ir našumo pusiausvyrą.

Papildomos saugyklos funkcionalumas leidžia pagreitinti ar net visiškai panaikinti vaizdų atsisiuntimą į mazgus.

Šaltinis: www.habr.com

Добавить комментарий