Mapendekezo ya kuendesha Buildah ndani ya kontena

Ni nini uzuri wa kutenganisha wakati wa kukimbia wa kontena katika vipengee tofauti vya zana? Hasa, zana hizi zinaweza kuanza kuunganishwa ili kulinda kila mmoja.

Mapendekezo ya kuendesha Buildah ndani ya kontena

Watu wengi wanavutiwa na wazo la kujenga picha za OCI zilizowekwa ndani Mabernet au mfumo unaofanana. Wacha tuseme tuna CI/CD ambayo hukusanya picha kila mara, kisha kitu kama hicho Red Hat OpenShift/Kubernetes itakuwa muhimu sana katika suala la kusawazisha mzigo wakati wa ujenzi. Hadi hivi majuzi, watu wengi walitoa ufikiaji wa kontena kwa tundu la Docker na kuwaruhusu kuendesha amri ya ujenzi wa kizimbani. Miaka kadhaa iliyopita tulionyeshakwamba hii sio salama sana, kwa kweli, ni mbaya zaidi kuliko kutoa mzizi usio na nywila au sudo.

Ndio maana watu hujaribu kila mara kuendesha Buildah kwenye kontena. Kwa kifupi, tumeunda mfano jinsi, kwa maoni yetu, ni bora kuendesha Buildah ndani ya chombo, na kuchapisha picha zinazofanana quay.io/buildah. Tuanze...

marekebisho

Picha hizi zimeundwa kutoka kwa Dockerfiles, ambazo zinaweza kupatikana kwenye hazina ya Buildah kwenye folda ujenzi.
Hapa tutaangalia toleo thabiti la 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

Badala ya OverlayFS, inayotekelezwa katika kiwango cha msingi cha Linux kernel, tunatumia programu ndani ya kontena fuse-overlay, kwa sababu kwa sasa OverlayFS inaweza tu kupanda ikiwa utaipa SYS_ADMIN ruhusa kwa kutumia uwezo wa Linux. Na tunataka kuendesha vyombo vyetu vya Buildah bila upendeleo wowote wa mizizi. Uwekeleaji wa Fuse hufanya kazi haraka sana na una utendakazi bora kuliko kiendeshi cha hifadhi ya VFS. Tafadhali kumbuka kuwa unapoendesha chombo cha Buildah kinachotumia Fuse, lazima utoe kifaa cha /dev/fuse.

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

Ifuatayo, tunaunda saraka kwa hifadhi ya ziada. Chombo/hifadhi inasaidia dhana ya kuunganisha maduka ya ziada ya picha za kusoma pekee. Kwa mfano, unaweza kusanidi eneo la uhifadhi wa viwekeleo kwenye mashine moja, na kisha utumie NFS kuweka hifadhi hii kwenye mashine nyingine na kutumia picha kutoka kwayo bila kupakua kupitia kuvuta. Tunahitaji hifadhi hii ili tuweze kuunganisha baadhi ya hifadhi ya picha kutoka kwa seva pangishi kama sauti na kuitumia ndani ya chombo.

# 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

Hatimaye, kwa kutumia utofauti wa mazingira wa BUILDAH_ISOLATION, tunaambia kontena la Buildah liendeshe kwa kutengwa kwa chroot kwa chaguo-msingi. Insulation ya ziada haihitajiki hapa, kwani tayari tunafanya kazi kwenye chombo. Ili Buildah itengeneze makontena yake yaliyotenganishwa na nafasi ya majina, haki ya SYS_ADMIN inahitajika, ambayo itahitaji kulegeza sheria za kontena za SELinux na SECCOM, jambo ambalo ni kinyume na mapendeleo yetu ya kuunda kutoka kwa chombo salama.

Kuendesha Buildah ndani ya chombo

Mchoro wa picha ya chombo cha Buildah kilichojadiliwa hapo juu hukuruhusu kubadilisha kwa urahisi mbinu za kuzindua vyombo kama hivyo.

Kasi dhidi ya usalama

Usalama wa kompyuta daima ni maelewano kati ya kasi ya mchakato na ni kiasi gani cha ulinzi kinachozunguka. Taarifa hii pia ni kweli wakati wa kukusanya vyombo, kwa hivyo hapa chini tutazingatia chaguzi za maelewano kama haya.

Picha ya kontena iliyojadiliwa hapo juu itaweka uhifadhi wake ndani /var/lib/containers. Kwa hiyo, tunahitaji kuweka maudhui kwenye folda hii, na jinsi tunavyofanya hii itaathiri sana kasi ya kujenga picha za chombo.

Hebu tuchunguze chaguzi tatu.

Chaguo la 1. Ikiwa usalama wa juu zaidi unahitajika, basi kwa kila kontena unaweza kuunda folda yako mwenyewe ya vyombo/picha na kuiunganisha kwenye kontena kupitia kuongeza sauti. Na zaidi ya hayo, weka saraka ya muktadha kwenye chombo chenyewe, kwenye /build folda:

# 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

Usalama. Buildah inayoendeshwa katika kontena kama hilo ina usalama wa juu zaidi: haijapewa upendeleo wowote wa mizizi kwa kutumia uwezo, na vizuizi vyote vya SECOMP na SELinux vinatumika kwake. Chombo kama hicho kinaweza kuendeshwa kwa kutengwa kwa Jina la Mtumiaji kwa kuongeza chaguo kama -uidmap 0: 100000:10000.

Utendaji. Lakini utendaji hapa ni mdogo, kwani picha zozote kutoka kwa sajili za kontena zinakiliwa kwa mwenyeji kila wakati, na kache haifanyi kazi hata kidogo. Wakati wa kukamilisha kazi yake, chombo cha Buildah lazima kitume picha kwenye sajili na kuharibu maudhui kwenye seva pangishi. Wakati ujao picha ya chombo itajengwa, italazimika kupakuliwa kutoka kwa Usajili tena, kwani kwa wakati huo hakutakuwa na chochote kilichobaki kwenye mwenyeji.

Chaguo la 2. Ikiwa unahitaji utendaji wa kiwango cha Docker, unaweza kuweka kontena/hifadhi moja kwa moja kwenye kontena.

# 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

Usalama. Hii ndiyo njia salama kabisa ya kuunda vyombo kwa sababu inaruhusu chombo kurekebisha hifadhi ya seva pangishi na inaweza kulisha Podman au CRI-O picha mbaya. Kwa kuongeza, utahitaji kuzima utenganishaji wa SELinux ili michakato katika chombo cha Buildah iweze kuingiliana na hifadhi kwenye seva pangishi. Kumbuka kuwa chaguo hili bado ni bora kuliko soketi ya Doka kwa sababu kontena limefungwa kwa vipengele vilivyosalia vya usalama na haliwezi tu kuendesha kontena kwenye seva pangishi.

Utendaji. Hapa ni kiwango cha juu, kwani caching hutumiwa kikamilifu. Ikiwa Podman au CRI-O tayari wamepakua picha inayohitajika kwa mwenyeji, basi mchakato wa Buildah ndani ya chombo hautalazimika kuipakua tena, na miundo inayofuata kulingana na picha hii pia itaweza kuchukua kile wanachohitaji kutoka kwa kashe. .

Chaguo la 3. Kiini cha njia hii ni kuchanganya picha kadhaa kwenye mradi mmoja na folda ya kawaida ya picha za chombo.

# 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

Katika mfano huu, hatufuti folda ya mradi (/var/lib/project3) kati ya kukimbia, kwa hivyo ujenzi wote unaofuata ndani ya mradi unanufaika na kache.

Usalama. Kitu kati ya chaguo 1 na 2. Kwa upande mmoja, vyombo havina ufikiaji wa maudhui kwenye seva pangishi na, ipasavyo, haziwezi kuingiza kitu kibaya kwenye hifadhi ya picha ya Podman/CRI-O. Kwa upande mwingine, kama sehemu ya muundo wake, chombo kinaweza kuingiliana na mkusanyiko wa vyombo vingine.

Utendaji. Hapa ni mbaya zaidi kuliko wakati wa kutumia cache iliyoshirikiwa kwenye kiwango cha mwenyeji, kwani huwezi kutumia picha ambazo tayari zimepakuliwa kwa kutumia Podman/CRI-O. Hata hivyo, Buildah inapopakua picha, picha inaweza kutumika katika miundo yoyote inayofuata ndani ya mradi.

Hifadhi ya ziada

Π£ vyombo/hifadhi Kuna kitu kizuri kama duka za ziada (duka za ziada), shukrani ambayo wakati wa kuzindua na kujenga vyombo, injini za kontena zinaweza kutumia duka za picha za nje katika hali ya kusoma tu. Kimsingi, unaweza kuongeza hifadhi moja au zaidi za kusoma pekee kwenye faili ya storage.conf ili unapowasha chombo, injini ya kontena itafute picha inayotaka ndani yake. Zaidi ya hayo, itapakua picha kutoka kwa Usajili ikiwa tu haipati katika hifadhi hizi. Injini ya kontena itaweza kuandika kwa hifadhi inayoweza kuandikwa pekee...

Ukisogeza juu na kuangalia Dockerfile tunayotumia kujenga picha quay.io/buildah/stable, kuna mistari kama hii:

# 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

Katika mstari wa kwanza, tunarekebisha /etc/containers/storage.conf ndani ya picha ya chombo, tukimwambia kiendesha hifadhi kutumia "additionalimagestores" kwenye folda ya /var/lib/shared. Na katika mstari unaofuata tunaunda folda iliyoshirikiwa na kuongeza faili kadhaa za kufuli ili hakuna unyanyasaji kutoka kwa vyombo / hifadhi. Kimsingi, tunaunda duka tupu la picha za chombo.

Ukiweka vyombo/hifadhi katika kiwango cha juu zaidi ya folda hii, Buildah itaweza kutumia picha.

Sasa hebu turejee Chaguo la 2 lililojadiliwa hapo juu, wakati kontena la Buildah linaweza kusoma na kuandika kwa kontena/hifadhi kwenye seva pangishi na, ipasavyo, ina utendaji wa hali ya juu kwa sababu ya picha za kache katika kiwango cha Podman/CRI-O, lakini hutoa usalama wa kiwango cha chini. kwani inaweza kuandika moja kwa moja kwenye uhifadhi. Sasa hebu tuongeze hifadhi ya ziada hapa na tupate ubora zaidi wa ulimwengu wote.

# 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

Kumbuka kuwa /var/lib/containers/storage ya mwenyeji imewekwa kwenye /var/lib/shared ndani ya chombo katika hali ya kusoma tu. Kwa hiyo, kufanya kazi katika chombo, Buildah inaweza kutumia picha yoyote ambayo hapo awali ilipakuliwa kwa kutumia Podman/CRI-O (hello, kasi), lakini inaweza tu kuandika kwa hifadhi yake mwenyewe (hello, usalama). Pia kumbuka kuwa hii inafanywa bila kuzima utengano wa SELinux kwa kontena.

Muhimu muhimu

Kwa hali yoyote unapaswa kufuta picha zozote kutoka kwa hazina ya msingi. Vinginevyo, chombo cha Buildah kinaweza kuanguka.

Na hizi sio faida zote

Uwezekano wa hifadhi ya ziada hauzuiliwi na hali iliyo hapo juu. Kwa mfano, unaweza kuweka picha zote za kontena kwenye hifadhi iliyoshirikiwa ya mtandao na kuipa ufikiaji kwa vyombo vyote vya Buildah. Wacha tuseme tuna mamia ya picha ambazo mfumo wetu wa CI/CD hutumia mara kwa mara kuunda picha za kontena. Tunaelekeza picha hizi zote kwenye seva pangishi moja kisha, kwa kutumia zana za hifadhi ya mtandao zinazopendekezwa (NFS, Gluster, Ceph, ISCSI, S3...), tunafungua ufikiaji wa jumla wa hifadhi hii kwa nodi zote za Buildah au Kubernetes.

Sasa inatosha kupachika hifadhi hii ya mtandao kwenye kontena la Buildah kwenye /var/lib/shared na ndivyo ilivyo - Vyombo vya Buildah havihitaji tena kupakua picha kupitia kuvuta. Kwa hivyo, tunatupa awamu ya kabla ya idadi ya watu na tuko tayari mara moja kusambaza vyombo.

Na bila shaka, hii inaweza kutumika ndani ya mfumo wa moja kwa moja wa Kubernetes au miundombinu ya kontena kuzindua na kuendesha vyombo popote bila upakuaji wowote wa picha. Kwa kuongezea, sajili ya chombo, ikipokea ombi la kushinikiza kupakia picha iliyosasishwa, inaweza kutuma kiotomatiki picha hii kwa hifadhi iliyoshirikiwa ya mtandao, ambapo inapatikana mara moja kwa nodi zote.

Picha za chombo wakati mwingine zinaweza kufikia gigabytes nyingi kwa ukubwa. Utendaji wa hifadhi ya ziada hukuruhusu kuzuia kuiga picha kama hizo kwenye nodi na hufanya vyombo vya uzinduzi kuwa karibu mara moja.

Kwa kuongeza, kwa sasa tunafanyia kazi kipengele kipya kinachoitwa viwekeo vya juu vya sauti, ambavyo vitafanya vyombo vya ujenzi kuwa haraka zaidi.

Hitimisho

Kuendesha Buildah ndani ya kontena katika Kubernetes/CRI-O, Podman, au hata Docker kunawezekana, rahisi, na ni salama zaidi kuliko kutumia docker.socket. Tumeongeza kwa kiasi kikubwa unyumbufu wa kufanya kazi na picha, kwa hivyo unaweza kuziendesha kwa njia mbalimbali ili kuboresha usawa kati ya usalama na utendakazi.

Utendaji wa hifadhi ya ziada inakuwezesha kuharakisha au hata kuondoa kabisa upakuaji wa picha kwenye nodes.

Chanzo: mapenzi.com

Kuongeza maoni