Контейнердің жұмыс уақытын бөлек құрал құрамдастарына ажыратудың қандай кереметі бар? Атап айтқанда, бұл құралдарды бірін-бірі қорғау үшін біріктіре бастауға болады.
Көптеген адамдарды контейнерлік OCI кескіндерін құру идеясы қызықтырады
Сондықтан адамдар үнемі Buildah-ты контейнерде жүргізуге тырысады. Қысқасы, біз құрдық
реттеу
Бұл кескіндер қалтадағы Buildah репозиторийінен табуға болатын Dockerfiles файлынан құрастырылған
Мұнда біз қарастырамыз
# 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 орнына біз контейнер ішіндегі бағдарламаны қолданамыз.
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
Соңында, 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 кескінді жүктеп алғаннан кейін, суретті жобадағы кез келген келесі құрастыруларда пайдалануға болады.
Қосымша сақтау орны
У
Егер сіз жоғары айналдырып, 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