Argymhellion ar gyfer rhedeg Buildah y tu mewn i gynhwysydd

Beth yw harddwch datgysylltu amser rhedeg y cynhwysydd yn gydrannau offer ar wahân? Yn benodol, gellir dechrau cyfuno'r offer hyn fel eu bod yn amddiffyn ei gilydd.

Argymhellion ar gyfer rhedeg Buildah y tu mewn i gynhwysydd

Mae llawer o bobl yn cael eu denu at y syniad o adeiladu delweddau OCI mewn cynhwysydd Kubernetes neu system debyg. Gadewch i ni ddweud bod gennym ni CI/CD sy'n casglu delweddau yn gyson, yna rhywbeth tebyg Red Hat OpenShift/Byddai Kubernetes yn eithaf defnyddiol o ran cydbwyso llwythi yn ystod adeiladu. Tan yn ddiweddar, roedd y rhan fwyaf o bobl yn rhoi mynediad i gynwysyddion i soced Dociwr a chaniatáu iddynt redeg y gorchymyn adeiladu docwr. Sawl blwyddyn yn ôl fe wnaethom ddangosbod hyn yn ansicr iawn, mewn gwirionedd, mae hyd yn oed yn waeth na rhoi gwraidd heb gyfrinair neu sudo.

Dyna pam mae pobl yn gyson yn ceisio rhedeg Buildah mewn cynhwysydd. Yn fyr, fe wnaethon ni greu enghraifft sut, yn ein barn ni, sydd orau i redeg Buildah y tu mewn i gynhwysydd, a phostio'r delweddau cyfatebol ymlaen cei.io/buildah. Gadewch i ni ddechrau...

addasiad

Mae'r delweddau hyn wedi'u hadeiladu o Dockerfiles, sydd i'w gweld yn ystorfa Buildah yn y ffolder adeiladuahimage.
Yma byddwn yn ystyried fersiwn sefydlog o 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

Yn lle OverlayFS, a weithredir ar lefel cnewyllyn Linux gwesteiwr, rydym yn defnyddio'r rhaglen y tu mewn i'r cynhwysydd ffiws-troshaen, oherwydd ar hyn o bryd dim ond os ydych chi'n rhoi caniatâd SYS_ADMIN iddo gan ddefnyddio galluoedd Linux y gall OverlayFS osod. Ac rydym am redeg ein cynwysyddion Buildah heb unrhyw freintiau gwraidd. Mae troshaen ffiws yn gweithio'n eithaf cyflym ac mae ganddo berfformiad gwell na'r gyrrwr storio VFS. Sylwch, wrth redeg cynhwysydd Buildah sy'n defnyddio Fuse, rhaid i chi ddarparu'r ddyfais /dev/ffiws.

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

Nesaf rydym yn creu cyfeiriadur ar gyfer storio ychwanegol. Cynhwysydd/storfa cefnogi'r cysyniad o gysylltu storfeydd delwedd darllen yn unig ychwanegol. Er enghraifft, gallwch chi ffurfweddu ardal storio troshaen ar un peiriant, ac yna defnyddio NFS i osod y storfa hon ar beiriant arall a defnyddio delweddau ohono heb lawrlwytho trwy dynnu. Mae angen y storfa hon arnom er mwyn gallu cysylltu rhywfaint o storfa ddelwedd o'r gwesteiwr fel cyfaint a'i ddefnyddio y tu mewn i'r cynhwysydd.

# 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

Yn olaf, trwy ddefnyddio'r newidyn amgylchedd BUILDAH_ISOLATION, rydym yn dweud wrth y cynhwysydd Buildah i redeg gydag ynysu croot yn ddiofyn. Nid oes angen inswleiddio ychwanegol yma, gan ein bod eisoes yn gweithio mewn cynhwysydd. Er mwyn i Buildah greu ei gynwysyddion gofod-enw ei hun, mae angen y fraint SYS_ADMIN, a fyddai'n gofyn am lacio rheolau SELinux a SECCOMP y cynhwysydd, sy'n groes i'n dewis i adeiladu o gynhwysydd diogel.

Rhedeg Buildah y tu mewn i gynhwysydd

Mae'r diagram delwedd cynhwysydd Buildah a drafodwyd uchod yn caniatáu ichi amrywio'n hyblyg y dulliau o lansio cynwysyddion o'r fath.

Cyflymder yn erbyn diogelwch

Mae diogelwch cyfrifiadurol bob amser yn gyfaddawd rhwng cyflymder y broses a faint o amddiffyniad sydd wedi'i lapio o'i gwmpas. Mae'r datganiad hwn hefyd yn wir wrth gydosod cynwysyddion, felly isod byddwn yn ystyried opsiynau ar gyfer cyfaddawd o'r fath.

Bydd y ddelwedd cynhwysydd a drafodir uchod yn cadw ei storfa yn /var/lib/containers. Felly, mae angen i ni osod y cynnwys yn y ffolder hwn, a bydd sut rydym yn gwneud hyn yn effeithio'n fawr ar gyflymder adeiladu delweddau cynhwysydd.

Gadewch i ni ystyried tri opsiwn.

Opsiwn 1. Os oes angen y diogelwch mwyaf, yna ar gyfer pob cynhwysydd gallwch greu eich ffolder eich hun ar gyfer cynwysyddion / delwedd a'i gysylltu â'r cynhwysydd trwy osod cyfaint. Ac ar wahân, rhowch y cyfeiriadur cyd-destun yn y cynhwysydd ei hun, yn y ffolder / adeiladu:

# 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

Diogelwch. Mae gan Buildah sy'n rhedeg mewn cynhwysydd o'r fath y diogelwch mwyaf: ni roddir unrhyw freintiau gwraidd iddo gan ddefnyddio galluoedd, ac mae holl gyfyngiadau SECOMP a SELinux yn berthnasol iddo. Gellir rhedeg cynhwysydd o'r fath hyd yn oed gydag ynysu User Namespace trwy ychwanegu opsiwn fel —uidmap 0: 100000: 10000.

Perfformiad. Ond mae'r perfformiad yma yn fach iawn, gan fod unrhyw ddelweddau o gofrestrfeydd cynwysyddion yn cael eu copïo i'r gwesteiwr bob tro, ac nid yw caching yn gweithio o gwbl. Wrth gwblhau ei waith, rhaid i'r cynhwysydd Buildah anfon y ddelwedd i'r gofrestrfa a dinistrio'r cynnwys ar y gwesteiwr. Y tro nesaf y bydd delwedd y cynhwysydd wedi'i hadeiladu, bydd yn rhaid ei lawrlwytho o'r gofrestrfa eto, oherwydd erbyn hynny ni fydd unrhyw beth ar ôl ar y gwesteiwr.

Opsiwn 2. Os oes angen perfformiad lefel Docker arnoch, gallwch osod y cynhwysydd gwesteiwr / storfa yn uniongyrchol i'r cynhwysydd.

# 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

Diogelwch. Dyma'r ffordd leiaf diogel o adeiladu cynwysyddion oherwydd ei fod yn caniatáu i'r cynhwysydd addasu storfa gwesteiwr a gallai o bosibl fwydo delwedd faleisus i Podman neu CRI-O. Yn ogystal, bydd angen i chi analluogi gwahaniad SELinux fel y gall prosesau yn y cynhwysydd Buildah ryngweithio â'r storfa ar y gwesteiwr. Sylwch fod yr opsiwn hwn yn dal i fod yn well na soced Docker oherwydd bod y cynhwysydd wedi'i gloi i lawr gan nodweddion diogelwch sy'n weddill ac ni all redeg cynhwysydd ar y gwesteiwr yn unig.

Perfformiad. Yma mae'n uchafswm, gan fod caching yn cael ei ddefnyddio'n llawn. Os yw Podman neu CRI-O eisoes wedi lawrlwytho'r ddelwedd ofynnol i'r gwesteiwr, yna ni fydd yn rhaid i'r broses Buildah y tu mewn i'r cynhwysydd ei lawrlwytho eto, a bydd adeiladau dilynol yn seiliedig ar y ddelwedd hon hefyd yn gallu cymryd yr hyn sydd ei angen arnynt o'r storfa .

Opsiwn 3. Hanfod y dull hwn yw cyfuno sawl delwedd yn un prosiect gyda ffolder gyffredin ar gyfer delweddau cynhwysydd.

# 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

Yn yr enghraifft hon, nid ydym yn dileu ffolder y prosiect (/var/lib/project3) rhwng rhediadau, felly mae pob adeiladwaith dilynol o fewn y prosiect yn elwa o caching.

Diogelwch. Rhywbeth rhwng opsiynau 1 a 2. Ar y naill law, nid oes gan gynwysyddion fynediad at gynnwys ar y gwesteiwr ac, yn unol â hynny, ni allant lithro rhywbeth drwg i storfa delwedd Podman/CRI-O. Ar y llaw arall, fel rhan o'i ddyluniad, gall cynhwysydd ymyrryd â chynulliad cynwysyddion eraill.

Perfformiad. Yma mae'n waeth nag wrth ddefnyddio storfa a rennir ar lefel y gwesteiwr, gan na allwch ddefnyddio delweddau sydd eisoes wedi'u llwytho i lawr gan ddefnyddio Podman/CRI-O. Fodd bynnag, ar ôl i Buildah lawrlwytho'r ddelwedd, gellir defnyddio'r ddelwedd mewn unrhyw adeiladwaith dilynol o fewn y prosiect.

Storfa ychwanegol

У cynwysyddion/storfa Mae yna beth mor cŵl â siopau ychwanegol (siopau ychwanegol), diolch i hynny wrth lansio ac adeiladu cynwysyddion, gall peiriannau cynwysyddion ddefnyddio storfeydd delwedd allanol yn y modd troshaen darllen yn unig. Yn y bôn, gallwch ychwanegu un neu fwy o storfeydd darllen yn unig i'r ffeil storage.conf fel bod injan y cynhwysydd yn edrych am y ddelwedd a ddymunir ynddynt pan fyddwch chi'n cychwyn y cynhwysydd. Ar ben hynny, dim ond os na fydd yn dod o hyd iddi yn unrhyw un o'r storfeydd hyn y bydd yn lawrlwytho'r ddelwedd o'r gofrestrfa. Dim ond i storfa ysgrifenadwy y bydd yr injan cynhwysydd yn gallu ysgrifennu...

Os sgroliwch i fyny ac edrych ar y Dockerfile rydyn ni'n ei ddefnyddio i adeiladu'r ddelwedd quay.io/buildah/stable, mae yna linellau fel hyn:

# 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

Yn y llinell gyntaf, rydym yn addasu /etc/containers/storage.conf y tu mewn i ddelwedd y cynhwysydd, gan ddweud wrth y gyrrwr storio i ddefnyddio “ychwanegolimagestores” yn y ffolder /var/lib/shared. Ac yn y llinell nesaf rydym yn creu ffolder a rennir ac yn ychwanegu cwpl o ffeiliau clo fel nad oes unrhyw gamddefnydd o gynwysyddion / storfa. Yn y bôn, yn syml, rydym yn creu storfa ddelwedd cynhwysydd gwag.

Os ydych chi'n gosod cynwysyddion/storfa ar lefel uwch na'r ffolder hon, bydd Buildah yn gallu defnyddio'r delweddau.

Nawr, gadewch i ni ddychwelyd i Opsiwn 2 a drafodwyd uchod, pan fydd y cynhwysydd Buildah yn gallu darllen ac ysgrifennu at gynwysyddion / storfa ar y gwesteiwyr ac, yn unol â hynny, mae ganddo'r perfformiad mwyaf posibl oherwydd storio delweddau ar lefel Podman / CRI-O, ond yn darparu lleiafswm o ddiogelwch gan y gall ysgrifennu'n uniongyrchol i storio. Nawr, gadewch i ni ychwanegu storfa ychwanegol yma a chael y gorau o'r ddau fyd.

# 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

Sylwch fod /var/lib/containers/storage y gwesteiwr wedi'i osod i /var/lib/rhannu y tu mewn i'r cynhwysydd yn y modd darllen yn unig. Felly, gan weithio mewn cynhwysydd, gall Buildah ddefnyddio unrhyw ddelweddau a gafodd eu llwytho i lawr yn flaenorol gan ddefnyddio Podman/CRI-O (helo, cyflymder), ond dim ond i'w storfa ei hun y gall ysgrifennu (helo, diogelwch). Sylwch hefyd y gwneir hyn heb analluogi gwahaniad SELinux ar gyfer y cynhwysydd.

Dawns bwysig

Ni ddylech o dan unrhyw amgylchiadau ddileu unrhyw ddelweddau o'r ystorfa waelodol. Fel arall, efallai y bydd y cynhwysydd Buildah yn chwalu.

Ac nid dyma'r holl fanteision

Nid yw posibiliadau storio ychwanegol yn gyfyngedig i'r senario uchod. Er enghraifft, gallwch chi osod yr holl ddelweddau cynhwysydd ar storfa rhwydwaith a rennir a rhoi mynediad iddo i holl gynwysyddion Buildah. Gadewch i ni ddweud bod gennym gannoedd o ddelweddau y mae ein system CI / CD yn eu defnyddio'n rheolaidd i adeiladu delweddau cynhwysydd. Rydym yn canolbwyntio'r holl ddelweddau hyn ar un gwesteiwr storio ac yna, gan ddefnyddio'r offer storio rhwydwaith dewisol (NFS, Gluster, Ceph, ISCSI, S3 ...), rydym yn agor mynediad cyffredinol i'r storfa hon i bob nod Buildah neu Kubernetes.

Nawr mae'n ddigon gosod y storfa rhwydwaith hon yn y cynhwysydd Buildah ar /var/lib/shared a dyna ni - nid oes rhaid i gynwysyddion Buildah lawrlwytho delweddau trwy dynnu mwyach. Felly, rydyn ni'n taflu'r cyfnod cyn-boblogaeth ac rydyn ni'n barod ar unwaith i gyflwyno'r cynwysyddion.

Ac wrth gwrs, gellir defnyddio hyn o fewn system Kubernetes byw neu seilwaith cynwysyddion i lansio a rhedeg cynwysyddion yn unrhyw le heb unrhyw dynnu i lawr o ddelweddau. Ar ben hynny, gall y gofrestrfa cynhwysydd, sy'n derbyn cais gwthio i uwchlwytho delwedd wedi'i diweddaru iddi, anfon y ddelwedd hon yn awtomatig i storfa rhwydwaith a rennir, lle mae ar gael ar unwaith i bob nod.

Weithiau gall delweddau cynhwysydd gyrraedd llawer o gigabeit o ran maint. Mae ymarferoldeb storfa ychwanegol yn caniatáu ichi osgoi clonio delweddau o'r fath ar draws nodau ac yn gwneud cynwysyddion lansio bron yn syth.

Yn ogystal, rydym ar hyn o bryd yn gweithio ar nodwedd newydd o'r enw mowntiau cyfaint troshaen, a fydd yn gwneud adeiladu cynwysyddion hyd yn oed yn gyflymach.

Casgliad

Mae rhedeg Buildah y tu mewn i gynhwysydd yn Kubernetes/CRI-O, Podman, neu hyd yn oed Docker yn ymarferol, yn syml, ac yn llawer mwy diogel na defnyddio docker.socket. Rydym wedi cynyddu hyblygrwydd gweithio gyda delweddau yn fawr, felly gallwch eu rhedeg mewn amrywiaeth o ffyrdd i wneud y gorau o'r cydbwysedd rhwng diogelwch a pherfformiad.

Mae ymarferoldeb storfa ychwanegol yn caniatáu ichi gyflymu neu hyd yn oed ddileu lawrlwytho delweddau i nodau yn llwyr.

Ffynhonnell: hab.com

Ychwanegu sylw