Leiðbeiningar um að keyra Buildah inni í gámi

Hver er fegurðin við að aftengja keyrslutíma gáma í aðskilda verkfæraíhluti? Einkum má byrja að sameina þessi verkfæri þannig að þau vernda hvert annað.

Leiðbeiningar um að keyra Buildah inni í gámi

Margir laðast að hugmyndinni um að smíða gáma OCI myndir innan Kubernetes eða svipað kerfi. Segjum að við höfum CI/CD sem safnar myndum stöðugt, þá eitthvað eins og RedHat OpenShift/Kubernetes væri mjög gagnlegt hvað varðar álagsjafnvægi við smíði. Þar til nýlega gáfu flestir gámum einfaldlega aðgang að Docker fals og leyfðu þeim að keyra docker build skipunina. Fyrir nokkrum árum sýndum viðað þetta er mjög óöruggt, í rauninni er það enn verra en að gefa lykilorðslausa root eða sudo.

Þess vegna reynir fólk stöðugt að keyra Buildah í gámi. Í stuttu máli, við bjuggum til Dæmi hvernig, að okkar mati, er best að keyra Buildah inni í gámi, og setti samsvarandi myndir á quay.io/buildah. Byrjum...

aðlögun

Þessar myndir eru byggðar úr Dockerfiles, sem er að finna í Buildah geymslunni í möppunni byggja ímynd.
Hér munum við skoða stöðug útgáfa af Dockerfile.

# 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

Í stað OverlayFS, útfært á Linux hýsilkjarnastigi, notum við forritið inni í ílátinu fuse-overlay, vegna þess að eins og er getur OverlayFS aðeins tengt ef þú gefur því SYS_ADMIN heimildir með því að nota Linux getu. Og við viljum keyra Buildah gámana okkar án nokkurra rótarréttinda. Fuse-overlay virkar nokkuð hratt og hefur betri afköst en VFS geymslurekla. Vinsamlegast athugaðu að þegar þú keyrir Buildah gám sem notar Fuse verður þú að gefa upp /dev/fuse tækið.

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

Næst búum við til möppu fyrir viðbótargeymslu. Gámur/geymsla styður hugmyndina um að tengja fleiri skrifvarða myndaverslanir. Til dæmis geturðu stillt yfirlagsgeymslusvæði á einni vél og notað síðan NFS til að festa þessa geymslu á aðra vél og nota myndir af henni án þess að hlaða niður með pull. Við þurfum þessa geymslu til að geta tengt einhverja myndgeymslu frá hýsilnum sem bindi og notað hana inni í ílátinu.

# 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

Að lokum, með því að nota BUILDAH_ISOLATION umhverfisbreytuna, erum við að segja Buildah gámnum að keyra sjálfgefið með chroot einangrun. Viðbótar einangrun er ekki nauðsynleg hér, þar sem við erum nú þegar að vinna í gámi. Til þess að Buildah geti búið til sína eigin nafnrýmisaðskilda gáma, þarf SYS_ADMIN forréttindin, sem myndi krefjast þess að slaka á SELinux og SECCOMP reglum gámsins, sem er andstætt því að við viljum byggja úr öruggum gámi.

Að keyra Buildah inni í gámi

Buildah gámamyndamyndin sem fjallað er um hér að ofan gerir þér kleift að breyta á sveigjanlegan hátt aðferðum við að koma slíkum gámum á markað.

Hraði á móti öryggi

Tölvuöryggi er alltaf málamiðlun milli hraða ferlisins og hversu mikil vernd er vafið um það. Þessi fullyrðing á einnig við þegar verið er að setja saman ílát, svo hér að neðan munum við skoða valkosti fyrir slíka málamiðlun.

Gámamyndin sem fjallað er um hér að ofan mun geyma geymslu sína í /var/lib/containers. Þess vegna þurfum við að tengja efnið í þessa möppu og hvernig við gerum þetta mun hafa mikil áhrif á hraða smíði gámamynda.

Við skulum íhuga þrjá valkosti.

Valkostur 1. Ef hámarksöryggis er krafist, þá geturðu fyrir hvern gám búið til þína eigin möppu fyrir gáma/mynd og tengt hana við gáminn með bindi. Og að auki, settu samhengisskrána í ílátið sjálft, í /build möppunni:

# 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

Öryggi. Buildah sem keyrir í slíkum gámi hefur hámarksöryggi: það er ekki gefið nein rótarréttindi með því að nota möguleika, og allar SECOMP og SELinux takmarkanir gilda um það. Slíkan gám er jafnvel hægt að keyra með einangrun notendanafnarýmis með því að bæta við valkosti eins og —uidmap 0: 100000:10000.

Frammistaða. En frammistaðan hér er í lágmarki, þar sem allar myndir úr gámaskrám eru afritaðar á gestgjafann í hvert skipti og skyndiminni virkar alls ekki. Þegar verkinu er lokið verður Buildah gámurinn að senda myndina til skrárinnar og eyðileggja efnið á hýsingaraðilanum. Næst þegar gámamyndin er smíðuð verður að hlaða henni niður úr skránni aftur, þar sem á þeim tíma verður ekkert eftir á hýsingaraðilanum.

Valkostur 2. Ef þú þarft frammistöðu á Docker-stigi geturðu fest hýsilgáminn/geymsluna beint í gáminn.

# 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

Öryggi. Þetta er minnsta öruggasta leiðin til að byggja ílát vegna þess að það gerir ílátinu kleift að breyta hýsingargeymslu og gæti hugsanlega gefið Podman eða CRI-O skaðlegri mynd. Að auki þarftu að slökkva á SELinux aðskilnaði svo að ferli í Buildah ílátinu geti haft samskipti við geymsluna á hýsilnum. Athugaðu að þessi valkostur er samt betri en Docker fals vegna þess að gámurinn er læstur af öryggiseiginleikum sem eftir eru og getur ekki einfaldlega keyrt gám á hýsilinn.

Frammistaða. Hér er það hámark, þar sem skyndiminni er að fullu notað. Ef Podman eða CRI-O hafa þegar hlaðið niður nauðsynlegri mynd til gestgjafans, þá þarf Buildah ferlið inni í gámnum ekki að hlaða því niður aftur, og síðari smíði byggðar á þessari mynd munu einnig geta tekið það sem þeir þurfa úr skyndiminni .

Valkostur 3. Kjarninn í þessari aðferð er að sameina nokkrar myndir í eitt verkefni með sameiginlegri möppu fyrir gámamyndir.

# 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

Í þessu dæmi eyðum við ekki verkefnamöppunni (/var/lib/project3) á milli keyra, þannig að allar síðari byggingar innan verkefnisins njóta góðs af skyndiminni.

Öryggi. Eitthvað á milli valkosta 1 og 2. Annars vegar hafa gámar ekki aðgang að efni á hýsingaraðilanum og geta því ekki runnið eitthvað slæmt inn í Podman/CRI-O myndgeymsluna. Á hinn bóginn, sem hluti af hönnun hans, getur gámur truflað samsetningu annarra gáma.

Frammistaða. Hér er það verra en þegar notað er sameiginlegt skyndiminni á hýsingarstigi, þar sem þú getur ekki notað myndir sem þegar hefur verið hlaðið niður með Podman/CRI-O. Hins vegar, þegar Buildah hefur halað niður myndinni, er hægt að nota myndina í hvers kyns síðari byggingu innan verkefnisins.

Viðbótargeymsla

У gámar/geymsla Það er svo töff hlutur eins og viðbótarverslanir (viðbótarverslanir), þökk sé því þegar gámavélar eru settar í gang og smíðar geta gámavélar notað ytri myndbirgðir í skrifvarinn yfirlagsham. Í meginatriðum er hægt að bæta einni eða fleiri skrifvörðum geymslum við storage.conf skrána þannig að þegar þú ræsir ílátið leitar gámavélin að viðkomandi mynd í þeim. Þar að auki mun það aðeins hlaða niður myndinni úr skránni ef það finnur hana ekki í neinni af þessum geymslum. Gámavélin mun aðeins geta skrifað í skrifanlega geymslu...

Ef þú flettir upp og lítur á Dockerfile sem við notum til að byggja upp myndina quay.io/buildah/stable, þá eru línur eins og þessar:

# 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

Í fyrstu línu breytum við /etc/containers/storage.conf inni í gámamyndinni og segjum geymslustjóranum að nota „additionalimagestores“ í /var/lib/shared möppunni. Og í næstu línu búum við til sameiginlega möppu og bætum við nokkrum læsaskrám svo að það sé engin misnotkun frá gámum/geymslum. Í meginatriðum erum við einfaldlega að búa til tóma gámamyndaverslun.

Ef þú setur ílát/geymslu á hærra stigi en þessa möppu, mun Buildah geta notað myndirnar.

Snúum okkur nú aftur að valkosti 2 sem fjallað er um hér að ofan, þegar Buildah gámurinn getur lesið og skrifað í gáma/geyma á vélunum og hefur því hámarksafköst vegna skyndiminni mynda á Podman/CRI-O stigi, en veitir lágmarks öryggi þar sem það getur skrifað beint á geymslu. Nú skulum við bæta við viðbótargeymsluplássi hér og fá það besta úr báðum heimum.

# 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

Athugaðu að /var/lib/containers/geymsla hýsilsins er fest á /var/lib/shared inni í gámnum í skrifvarandi ham. Því að vinna í gámi getur Buildah notað hvaða myndir sem áður var hlaðið niður með Podman/CRI-O (halló, hraði), en getur aðeins skrifað í eigin geymslu (halló, öryggi). Athugaðu líka að þetta er gert án þess að slökkva á SELinux aðskilnaði fyrir ílátið.

Mikilvæg blæbrigði

Þú ættir undir engum kringumstæðum að eyða myndum úr undirliggjandi geymslu. Annars gæti Buildah gámurinn hrunið.

Og þetta eru ekki allir kostir

Möguleikarnir á viðbótargeymslu eru ekki takmarkaðir við ofangreinda atburðarás. Til dæmis er hægt að setja allar gámamyndir á sameiginlega netgeymslu og veita öllum Buildah gámum aðgang að henni. Segjum að við höfum hundruð mynda sem CI/CD kerfið okkar notar reglulega til að búa til gámamyndir. Við einbeitum öllum þessum myndum á einn geymsluhýsil og síðan, með því að nota valinn netgeymsluverkfæri (NFS, Gluster, Ceph, ISCSI, S3...), opnum við almennan aðgang að þessari geymslu fyrir alla Buildah eða Kubernetes hnúta.

Nú er nóg að setja þessa netgeymslu inn í Buildah gáminn á /var/lib/shared og það er það - Buildah gámar þurfa ekki lengur að hlaða niður myndum með pull. Þannig hentum við út forfjölgunarfasanum og erum strax tilbúin að rúlla gámunum út.

Og auðvitað er hægt að nota þetta innan lifandi Kubernetes kerfis eða gámainnviða til að ræsa og keyra gáma hvar sem er án þess að hlaða niður myndum. Þar að auki getur gámaskráin, sem fær ýta beiðni um að hlaða upp uppfærðri mynd á hana, sjálfkrafa sent þessa mynd í sameiginlega netgeymslu, þar sem hún verður samstundis aðgengileg öllum hnútum.

Gámamyndir geta stundum náð mörgum gígabætum að stærð. Virkni viðbótargeymslu gerir þér kleift að forðast að klóna slíkar myndir yfir hnúta og gerir það að verkum að gáma er ræst nánast samstundis.

Að auki erum við núna að vinna að nýjum eiginleika sem kallast yfirborðsrúmmálsfestingar, sem mun gera smíði gáma enn hraðari.

Ályktun

Að keyra Buildah inni í gámi í Kubernetes/CRI-O, Podman eða jafnvel Docker er framkvæmanlegt, einfalt og miklu öruggara en að nota docker.socket. Við höfum aukið sveigjanleikann við að vinna með myndir til muna, þannig að þú getur keyrt þær á margvíslegan hátt til að hámarka jafnvægið milli öryggis og frammistöðu.

Virkni viðbótargeymslu gerir þér kleift að flýta fyrir eða jafnvel alveg útrýma niðurhali mynda á hnúta.

Heimild: www.habr.com

Bæta við athugasemd