Контейнер ішінде Buildah жүргізуге арналған нұсқаулар

Контейнердің жұмыс уақытын бөлек құрал құрамдастарына ажыратудың қандай кереметі бар? Атап айтқанда, бұл құралдарды бірін-бірі қорғау үшін біріктіре бастауға болады.

Контейнер ішінде Buildah жүргізуге арналған нұсқаулар

Көптеген адамдарды контейнерлік OCI кескіндерін құру идеясы қызықтырады Kubernetes немесе ұқсас жүйе. Бізде суреттерді үнемі жинайтын CI/CD бар делік, содан кейін бір нәрсе Red Hat OpenShift/Кубернетес құрастыру кезінде жүктемені теңестіру тұрғысынан өте пайдалы болар еді. Соңғы уақытқа дейін адамдардың көпшілігі контейнерлерге Docker розеткасына рұқсат берді және оларға докер құрастыру пәрменін орындауға мүмкіндік берді. Бірнеше жыл бұрын көрсеттікбұл өте қауіпті, шын мәнінде, бұл құпия сөзсіз түбір немесе sudo беруден де жаман.

Сондықтан адамдар үнемі Buildah-ты контейнерде жүргізуге тырысады. Қысқасы, біз құрдық мысал Біздің ойымызша, Buildah-ты контейнер ішінде қалай іске қосқан дұрыс және сәйкес суреттерді орналастырды quay.io/buildah. Бастайық...

реттеу

Бұл кескіндер қалтадағы Buildah репозиторийінен табуға болатын Dockerfiles файлынан құрастырылған құрылыс.
Мұнда біз қарастырамыз 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

Негізгі Linux ядросы деңгейінде жүзеге асырылатын OverlayFS орнына біз контейнер ішіндегі бағдарламаны қолданамыз. сақтандырғыш қабаты, себебі қазіргі уақытта OverlayFS Linux мүмкіндіктерін пайдаланып SYS_ADMIN рұқсаттарын берген жағдайда ғана орнатыла алады. Біз Buildah контейнерлерімізді ешқандай түбірлік артықшылықтарсыз іске қосқымыз келеді. Сақтандырғыш қабаты өте жылдам жұмыс істейді және VFS сақтау драйверіне қарағанда жақсы өнімділікке ие. Fuse пайдаланатын Buildah контейнерін іске қосқан кезде /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

Содан кейін біз қосымша сақтау үшін каталог жасаймыз. Контейнер/қойма қосымша тек оқуға арналған кескін қоймаларын қосу тұжырымдамасын қолдайды. Мысалы, бір құрылғыда қабаттас сақтау аймағын конфигурациялауға болады, содан кейін бұл жадты басқа құрылғыға орнату үшін NFS пайдалана аласыз және одан суреттерді тарту арқылы жүктеп алмай-ақ пайдалана аласыз. Хосттың кейбір кескін жадын көлем ретінде қосу және оны контейнер ішінде пайдалану үшін бізге бұл жад қажет.

# 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

Соңында, BUILDAH_ISOLATION ортасының айнымалы мәнін пайдалану арқылы біз Buildah контейнеріне әдепкі бойынша chroot оқшаулауымен жұмыс істеуін айтамыз. Мұнда қосымша оқшаулау қажет емес, өйткені біз қазірдің өзінде контейнерде жұмыс істеп жатырмыз. Buildah өзінің аттар кеңістігімен бөлінген контейнерлерін жасау үшін SYS_ADMIN артықшылығы қажет, ол контейнердің SELinux және SECCOMP ережелерін жеңілдетуді талап етеді, бұл қауіпсіз контейнерден құрастыруды қалауымызға қайшы келеді.

Контейнер ішінде Buildah іске қосу

Жоғарыда қарастырылған Buildah контейнерінің кескін диаграммасы мұндай контейнерлерді іске қосу әдістерін икемді түрде өзгертуге мүмкіндік береді.

Қауіпсіздікке қарсы жылдамдық

Компьютер қауіпсіздігі әрқашан процестің жылдамдығы мен оның айналасында қаншалықты қорғалғандығы арасындағы ымыра болып табылады. Бұл мәлімдеме контейнерлерді құрастыру кезінде де дұрыс, сондықтан төменде біз осындай ымыраға келу нұсқаларын қарастырамыз.

Жоғарыда талқыланған контейнер кескіні /var/lib/containers ішінде сақтауды сақтайды. Сондықтан, біз осы қалтаға мазмұнды орнатуымыз керек және мұны қалай жасайтынымыз контейнер кескіндерін құру жылдамдығына айтарлықтай әсер етеді.

Үш нұсқаны қарастырайық.

1 нұсқасы. Максималды қауіпсіздік қажет болса, әрбір контейнер үшін контейнерлер/кескіндер үшін жеке қалтаңызды жасап, оны көлемді орнату арқылы контейнерге қосуға болады. Сонымен қатар, контекстік каталогты контейнердің өзінде, /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

Қауіпсіздік. Мұндай контейнерде жұмыс істейтін Buildah максималды қауіпсіздікке ие: мүмкіндіктерді пайдалана отырып, оған ешқандай түбірлік артықшылықтар берілмейді және оған барлық SECOMP және SELinux шектеулері қолданылады.Мұндай контейнерді тіпті —uidmap 0 сияқты опцияны қосу арқылы Пайдаланушы аттары кеңістігінің оқшаулауымен іске қосуға болады: 100000:10000.

Өнімділік. Бірақ мұнда өнімділік минималды, өйткені контейнер тізілімдеріндегі кез келген кескін хостқа әр уақытта көшіріледі және кэштеу мүлдем жұмыс істемейді. Өз жұмысын аяқтаған кезде, Buildah контейнері кескінді тізілімге жіберуі және хосттағы мазмұнды жоюы керек. Контейнер кескіні келесі жолы салынғанда, оны тізілімнен қайтадан жүктеп алу керек болады, өйткені осы уақытқа дейін хостта ештеңе қалмайды.

2 нұсқасы. Егер сізге Docker деңгейіндегі өнімділік қажет болса, хост контейнерін/сақтауын тікелей контейнерге орнатуға болады.

# 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

Қауіпсіздік. Бұл контейнерлерді құрудың ең қауіпсіз жолы, себебі ол контейнерге хосттағы сақтау орнын өзгертуге мүмкіндік береді және Podman немесе CRI-O-ға зиянды кескінді жіберуі мүмкін. Оған қоса, Buildah контейнеріндегі процестер хосттағы сақтаумен өзара әрекеттесу үшін SELinux бөлуді өшіру керек. Бұл опция әлі де Docker ұяшығына қарағанда жақсырақ екенін ескеріңіз, себебі контейнер қалған қауіпсіздік мүмкіндіктері арқылы құлыпталған және хостта контейнерді жай ғана іске қоса алмайды.

Өнімділік. Мұнда ол максималды, өйткені кэштеу толығымен пайдаланылады. Podman немесе CRI-O хостқа қажетті кескінді әлдеқашан жүктеп алған болса, контейнер ішіндегі Buildah процесі оны қайтадан жүктеп алудың қажеті жоқ және осы кескінге негізделген кейінгі құрастырулар да кэштен қажет нәрсені ала алады. .

3 нұсқасы. Бұл әдістің мәні бірнеше кескінді контейнерлік кескіндерге арналған ортақ қалтамен бір жобаға біріктіру болып табылады.

# 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

Бұл мысалда іске қосулар арасында жоба қалтасын (/var/lib/project3) жоймаймыз, сондықтан жобадағы барлық келесі құрастырмалар кэштеуден пайда көреді.

Қауіпсіздік. 1 және 2 опцияларының арасында бірдеңе. Бір жағынан, контейнерлер хосттағы мазмұнға қол жеткізе алмайды және сәйкесінше Podman/CRI-O кескін жадына жаман нәрсені жібере алмайды. Екінші жағынан, оның дизайнының бөлігі ретінде контейнер басқа контейнерлерді жинауға кедергі келтіруі мүмкін.

Өнімділік. Бұл жерде хост деңгейінде ортақ кэшті пайдаланудан гөрі нашар, өйткені Podman/CRI-O арқылы жүктеп алынған кескіндерді пайдалана алмайсыз. Дегенмен, Buildah кескінді жүктеп алғаннан кейін, суретті жобадағы кез келген келесі құрастыруларда пайдалануға болады.

Қосымша сақтау орны

У контейнерлер/сақтау Қосымша дүкендер (қосымша дүкендер) сияқты керемет нәрсе бар, соның арқасында контейнерлерді іске қосу және салу кезінде контейнерлік қозғалтқыштар тек оқуға арналған қабаттасу режимінде сыртқы кескін дүкендерін пайдалана алады. Негізінде, бір немесе бірнеше тек оқуға арналған қоймаларды storage.conf файлына қосуға болады, осылайша контейнерді іске қосқан кезде контейнер қозғалтқышы олардан қажетті кескінді іздейді. Сонымен қатар, ол суретті осы қоймалардың ешқайсысында таппаған жағдайда ғана тізілімнен жүктеп алады. Контейнер қозғалтқышы тек жазылатын жадқа жаза алады...

Егер сіз жоғары айналдырып, quay.io/buildah/stable кескінін құру үшін қолданатын Dockerfile файлына қарасаңыз, келесідей жолдар бар:

# 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

Бірінші жолда біз /etc/containers/storage.conf файлын контейнер кескінінің ішінде өзгертіп, сақтау драйверіне /var/lib/shared қалтасында “additionalimagestores” пайдалануды айтамыз. Келесі жолда біз ортақ қалтаны жасаймыз және контейнерлер/қоймалар тарапынан теріс пайдалану болмас үшін бірнеше құлыптау файлдарын қосамыз. Негізінде, біз жай ғана бос контейнерлік кескіндер дүкенін жасаймыз.

Контейнерлерді/сақтауды осы қалтадан жоғарырақ деңгейге орнатсаңыз, Buildah кескіндерді пайдалана алады.

Енді жоғарыда талқыланған 2-нұсқаға оралайық, бұл кезде Buildah контейнері контейнерлерге/хосттарда сақтай алады және сәйкесінше, Podman/CRI-O деңгейінде кескіндерді кэштеу есебінен максималды өнімділікке ие болады, бірақ қауіпсіздіктің ең төменгі деңгейін қамтамасыз етеді. өйткені ол тікелей жадқа жаза алады. Енді осы жерге қосымша жад қосып, екі дүниенің де жақсысын алайық.

# 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

Хосттың /var/lib/containers/storage тек оқуға арналған режимде контейнер ішіндегі /var/lib/shared ішіне орнатылғанын ескеріңіз. Сондықтан, контейнерде жұмыс істей отырып, Buildah бұрын Podman/CRI-O (сәлем, жылдамдық) арқылы жүктеп алынған кез келген кескіндерді пайдалана алады, бірақ тек өзінің қоймасына жаза алады (сәлем, қауіпсіздік). Сондай-ақ, бұл контейнер үшін SELinux бөлуді өшірмей орындалатынын ескеріңіз.

Маңызды нюанс

Ешбір жағдайда негізгі репозиторийден ешбір кескінді жоюға болмайды. Әйтпесе, Buildah контейнері апатқа ұшырауы мүмкін.

Және бұл барлық артықшылықтар емес

Қосымша сақтау мүмкіндіктері жоғарыдағы сценариймен шектелмейді. Мысалы, сіз барлық контейнер кескіндерін ортақ желілік жадқа орналастырып, оған барлық Buildah контейнерлеріне кіруге рұқсат бере аласыз. Біздің CI/CD жүйемізде контейнерлік кескіндерді жасау үшін үнемі пайдаланатын жүздеген кескіндер бар делік. Біз осы кескіндердің барлығын бір сақтау хостына шоғырландырамыз, содан кейін таңдаулы желілік сақтау құралдарын (NFS, Gluster, Ceph, ISCSI, S3...) пайдалана отырып, барлық Buildah немесе Kubernetes түйіндеріне осы жадқа жалпы қолжетімділікті ашамыз.

Енді осы желілік сақтау орнын /var/lib/shared жүйесіндегі Buildah контейнеріне орнату жеткілікті, міне, осымен аяқталды - Buildah контейнерлері бұдан былай суреттерді тарту арқылы жүктеп алудың қажеті жоқ. Осылайша, біз популяцияға дейінгі кезеңді тастаймыз және контейнерлерді шығаруға дереу дайынбыз.

Және, әрине, оны кез келген жерде кескіндерді жүктеп алмай-ақ іске қосу және іске қосу үшін тірі Kubernetes жүйесінде немесе контейнерлік инфрақұрылымда пайдалануға болады. Сонымен қатар, контейнер тізілімі оған жаңартылған кескінді жүктеп салуға сұрауды қабылдай отырып, бұл суретті автоматты түрде ортақ желілік жадқа жібере алады, онда ол бірден барлық түйіндерге қол жетімді болады.

Контейнерлік кескіндер кейде көптеген гигабайттарға жетуі мүмкін. Қосымша жадтың функционалдығы мұндай кескіндерді түйіндер бойынша клондаудан аулақ болуға мүмкіндік береді және контейнерлерді бірден іске қосады.

Бұған қоса, біз қазір контейнерлерді салуды тездететін қабаттасқан көлемді орнату деп аталатын жаңа мүмкіндікпен жұмыс істеп жатырмыз.

қорытынды

Buildah бағдарламасын Kubernetes/CRI-O, Podman немесе тіпті Docker ішіндегі контейнер ішінде іске қосу docker.socket пайдаланудан гөрі мүмкін, қарапайым және әлдеқайда қауіпсіз. Біз кескіндермен жұмыс істеу икемділігін айтарлықтай арттырдық, сондықтан қауіпсіздік пен өнімділік арасындағы теңгерімді оңтайландыру үшін оларды әртүрлі жолдармен іске қосуға болады.

Қосымша жадтың функционалдығы кескіндерді түйіндерге жүктеуді жылдамдатуға немесе тіпті толығымен жоюға мүмкіндік береді.

Ақпарат көзі: www.habr.com

пікір қалдыру