Препоруке за покретање Буилдах-а унутар контејнера

Која је лепота раздвајања времена рада контејнера на засебне компоненте алата? Конкретно, ови алати могу почети да се комбинују тако да штите једни друге.

Препоруке за покретање Буилдах-а унутар контејнера

Многе људе привлачи идеја о изградњи контејнерских ОЦИ слика унутар Кубернетес или сличан систем. Рецимо да имамо ЦИ/ЦД који стално прикупља слике, па нешто слично Ред Хат ОпенСхифт/Кубернетес би био прилично користан у смислу балансирања оптерећења током изградње. До недавно, већина људи је једноставно давала контејнерима приступ Доцкер сокету и дозвољавала им да покрећу команду за изградњу доцкер-а. Пре неколико година смо показалида је ово веома несигурно, у ствари, чак је горе од давања роот-а без лозинке или судо-а.

Зато људи стално покушавају да покрену Буилдах у контејнеру. Укратко, створили смо пример како је, по нашем мишљењу, најбоље покренути Буилдах унутар контејнера и поставити одговарајуће слике на кеј.ио/буилдах. Хајде да почнемо...

подешавање

Ове слике су направљене од Доцкерфилес-а, који се могу наћи у Буилдах спремишту у фасцикли буилдахимаге.
Овде ћемо размотрити стабилна верзија Доцкерфиле-а.

# 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

Уместо ОверлаиФС-а, имплементираног на нивоу Линук кернела домаћина, користимо програм унутар контејнера осигурач-преклоп, јер тренутно ОверлаиФС може да се монтира само ако му дате СИС_АДМИН дозволе користећи Линук могућности. И желимо да покренемо наше Буилдах контејнере без икаквих роот привилегија. Фусе-оверлаи ради прилично брзо и има боље перформансе од ВФС драјвера за складиштење. Имајте на уму да када покрећете Буилдах контејнер који користи Фусе, морате обезбедити /дев/фусе уређај.

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

Затим креирамо директоријум за додатно складиштење. Контејнер/складиште подржава концепт повезивања додатних складишта слика само за читање. На пример, можете да конфигуришете област за складиштење са преклапањем на једној машини, а затим да користите НФС да монтирате ову меморију на другу машину и користите слике са ње без преузимања путем повлачења. Ово складиште нам је потребно да бисмо могли да повежемо нешто складиштења слика са хоста као волумен и користимо га унутар контејнера.

# 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

Коначно, коришћењем променљиве окружења БУИЛДАХ_ИСОЛАТИОН, ми говоримо Буилдах контејнеру да се подразумевано покреће са цхроот изолацијом. Овде није потребна додатна изолација, пошто већ радимо у контејнеру. Да би Буилдах креирао сопствене контејнере раздвојене именским простором, потребна је привилегија СИС_АДМИН, што би захтевало опуштање СЕЛинук и СЕЦЦОМП правила контејнера, што је у супротности са нашим преференцијама да градимо из безбедног контејнера.

Покретање Буилдах-а унутар контејнера

Дијаграм слике контејнера Буилдах о коме смо горе говорили омогућава вам да флексибилно варирате методе покретања таквих контејнера.

Брзина наспрам безбедности

Безбедност рачунара је увек компромис између брзине процеса и количине заштите која је око њега умотана. Ова изјава важи и за састављање контејнера, па ћемо у наставку размотрити опције за такав компромис.

Слика контејнера о којој је било речи горе ће задржати своје складиште у /вар/либ/цонтаинерс. Због тога морамо да монтирамо садржај у ову фасциклу, а начин на који то урадимо у великој мери ће утицати на брзину прављења слика контејнера.

Хајде да размотримо три опције.

Опција КСНУМКС. Ако је потребна максимална безбедност, онда за сваки контејнер можете креирати сопствену фасциклу за контејнере/слику и повезати је са контејнером преко волуме-моунт-а. Поред тога, поставите контекстни директоријум у сам контејнер, у фасциклу /буилд:

# 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

Сигурност. Буилдах који ради у таквом контејнеру има максималну безбедност: не добијају никакве привилегије роот користећи могућности, а на њега се примењују сва СЕЦОМП и СЕЛинук ограничења. Такав контејнер се чак може покренути са изолацијом корисничког именског простора додавањем опције као што је —уидмап 0: 100000:10000.

Перформансе. Али перформансе су овде минималне, пошто се све слике из регистара контејнера сваки пут копирају на хост, а кеширање уопште не ради. Када заврши свој рад, Буилдах контејнер мора послати слику у регистар и уништити садржај на хосту. Следећи пут када се направи имиџ контејнера, мораће да се поново преузме из регистра, пошто до тада на хосту неће остати ништа.

Опција КСНУМКС. Ако су вам потребне перформансе на нивоу Доцкер-а, можете монтирати хост контејнер/складиште директно у контејнер.

# 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

Сигурност. Ово је најмање безбедан начин за прављење контејнера јер омогућава контејнеру да модификује складиште хоста и потенцијално може да храни Подман или ЦРИ-О злонамерну слику. Поред тога, мораћете да онемогућите раздвајање СЕЛинук-а како би процеси у Буилдах контејнеру могли да комуницирају са складиштем на хосту. Имајте на уму да је ова опција и даље боља од Доцкер соцкета јер је контејнер закључан преосталим безбедносним функцијама и не може једноставно да покрене контејнер на хосту.

Перформансе. Овде је максимално, пошто је кеширање у потпуности искоришћено. Ако су Подман или ЦРИ-О већ преузели потребну слику на хост, онда Буилдах процес унутар контејнера неће морати поново да је преузима, а наредне верзије засноване на овој слици ће такође моћи да преузму оно што им је потребно из кеша. .

Опција КСНУМКС. Суштина ове методе је комбиновање неколико слика у један пројекат са заједничким фолдером за слике контејнера.

# 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

У овом примеру, ми не бришемо фасциклу пројекта (/вар/либ/пројецт3) између покретања, тако да све наредне израде у оквиру пројекта имају користи од кеширања.

Сигурност. Нешто између опција 1 и 2. С једне стране, контејнери немају приступ садржају на хосту и, сходно томе, не могу да убаце нешто лоше у Подман/ЦРИ-О складиште слика. С друге стране, као део свог дизајна, контејнер може ометати монтажу других контејнера.

Перформансе. Овде је горе него када користите дељени кеш на нивоу хоста, пошто не можете да користите слике које су већ преузете помоћу Подман/ЦРИ-О. Међутим, када Буилдах преузме слику, слика се може користити у било којој наредној градњи у оквиру пројекта.

Додатно складиште

У контејнери/складиште Постоји тако цоол ствар као што су додатне продавнице (додатне продавнице), захваљујући којима приликом покретања и изградње контејнера, контејнерски мотори могу да користе екстерне продавнице слика у режиму преклапања само за читање. У суштини, можете додати једно или више складишта само за читање у датотеку стораге.цонф тако да када покренете контејнер, механизам контејнера тражи жељену слику у њима. Штавише, он ће преузети слику из регистра само ако је не пронађе ни у једном од ових складишта. Контејнерски механизам ће моћи да уписује само у меморију за писање...

Ако скролујете нагоре и погледате Доцкерфиле који користимо за прављење слике куаи.ио/буилдах/стабле, постоје редови попут ове:

# 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

У првом реду мењамо /етц/цонтаинерс/стораге.цонф унутар слике контејнера, говорећи драјверу за складиштење да користи „аддитионалимагесторес“ у директоријуму /вар/либ/схаред. И у следећем реду креирамо дељени фолдер и додајемо пар фајлова за закључавање како не би било злоупотреба од контејнера/складишта. У суштини, ми једноставно креирамо празно складиште слика контејнера.

Ако монтирате контејнере/складиште на вишем нивоу од ове фасцикле, Буилдах ће моћи да користи слике.

Сада се вратимо на опцију 2 о којој смо горе говорили, када Буилдах контејнер може да чита и пише у контејнере/складиште на хостовима и, сходно томе, има максималне перформансе због кеширања слика на нивоу Подман/ЦРИ-О, али пружа минимум сигурности од може писати директно у складиште. Хајде сада да додамо додатни простор за складиштење овде и искористимо најбоље од оба света.

# 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

Имајте на уму да је /вар/либ/цонтаинерс/стораге хоста монтиран на /вар/либ/схаред унутар контејнера у режиму само за читање. Због тога, радећи у контејнеру, Буилдах може да користи све слике које су претходно преузете помоћу Подман/ЦРИ-О (здраво, брзина), али може само да пише у сопствено складиште (здраво, безбедност). Такође имајте на уму да се ово ради без онемогућавања СЕЛинук раздвајања за контејнер.

Важна нијанса

Ни у ком случају не треба да бришете слике из основног спремишта. У супротном, Буилдах контејнер може да се сруши.

И то нису све предности

Могућности додатног складиштења нису ограничене на горњи сценарио. На пример, можете да поставите све слике контејнера на заједничку мрежну меморију и дате јој приступ свим Буилдах контејнерима. Рецимо да имамо стотине слика које наш ЦИ/ЦД систем редовно користи за прављење слика контејнера. Концентришемо све ове слике на један хост за складиштење и затим, користећи жељене алате за мрежно складиштење (НФС, Глустер, Цепх, ИСЦСИ, С3...), отварамо општи приступ овом складишту за све Буилдах или Кубернетес чворове.

Сада је довољно да монтирате ову мрежну меморију у Буилдах контејнер на /вар/либ/схаред и то је то - Буилдах контејнери више не морају да преузимају слике путем повлачења. Тако избацујемо фазу пре насељавања и одмах смо спремни за извлачење контејнера.

И наравно, ово се може користити у оквиру живог Кубернетес система или инфраструктуре контејнера за покретање и покретање контејнера било где без икаквог преузимања слика. Штавише, регистар контејнера, примајући пусх захтев за отпремање ажуриране слике у њега, може аутоматски да пошаље ову слику у дељено мрежно складиште, где она одмах постаје доступна свим чворовима.

Слике контејнера понекад могу достићи величину од много гигабајта. Функционалност додатног складишта вам омогућава да избегнете клонирање таквих слика у различитим чворовима и чини покретање контејнера скоро тренутним.

Поред тога, тренутно радимо на новој функцији која се зове преклопни носачи запремине, што ће учинити изградњу контејнера још бржом.

Закључак

Покретање Буилдах-а унутар контејнера у Кубернетес/ЦРИ-О, Подман-у или чак Доцкер-у је изводљиво, једноставно и много безбедније од коришћења доцкер.соцкет-а. Увелико смо повећали флексибилност рада са сликама, тако да можете да их покрећете на различите начине да бисте оптимизовали равнотежу између безбедности и перформанси.

Функционалност додатног складишта омогућава вам да убрзате или чак потпуно елиминишете преузимање слика у чворове.

Извор: ввв.хабр.цом

Додај коментар