Тавсияҳо оид ба кор дар дохили контейнер

Зебогии ҷудо кардани вақти кори контейнер ба ҷузъҳои алоҳидаи асбобҳо чист? Махсусан, ин воситаҳо метавонанд якҷоя карда шаванд, то онҳо якдигарро муҳофизат кунанд.

Тавсияҳо оид ба кор дар дохили контейнер

Бисёр одамон ба идеяи сохтани тасвирҳои контейнерии OCI дар дохили он ҷалб карда мешаванд Кубернитель ё системаи шабеҳ. Биёед бигӯем, ки мо як CI/CD дорем, ки пайваста тасвирҳоро ҷамъоварӣ мекунад, пас чизе монанди он RedHat OpenShift/Кубернетес дар робита ба мувозинати сарборӣ ҳангоми сохтмон хеле муфид хоҳад буд. То ба наздикӣ, аксари одамон ба контейнерҳо ба васлаки Docker дастрасӣ медоданд ва ба онҳо иҷозат доданд, ки фармони сохтани docker-ро иҷро кунанд. Якчанд сол пеш мо нишон додемки ин хеле бехавф аст, дар хакикат ин аз додани решаи бепарол ё судо хам бадтар аст.

Аз ин чост, ки одамон пайваста кушиш мекунанд, ки Buildah-ро дар контейнер идора кунанд. Хулоса, мо офаридаем намуна Чӣ тавр, ба андешаи мо, беҳтар аст, ки Buildah-ро дар дохили контейнер иҷро кунед ва тасвирҳои мувофиқро дар он ҷойгир кунед quay.io/buildah. Биёед оғоз кунем...

танзим

Ин тасвирҳо аз Dockerfiles сохта шудаанд, ки онҳоро дар анбори Buildah дар ҷузвдон пайдо кардан мумкин аст сохтмон.
Дар ин ҷо мо дида мебароем версияи устувори 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

Ба ҷои OverlayFS, ки дар сатҳи ядрои Linux амалӣ карда мешавад, мо барномаро дар дохили контейнер истифода мебарем. қабати муҳофизаткунанда, зеро дар айни замон OverlayFS метавонад танҳо дар сурате насб карда шавад, агар шумо ба он иҷозатҳои SYS_ADMIN бо истифода аз имкониятҳои Linux диҳед. Ва мо мехоҳем контейнерҳои Buildah-и худро бе ягон имтиёзи реша идора кунем. Fuse-overlay хеле зуд кор мекунад ва нисбат ба драйвери нигаҳдории VFS иҷрои беҳтар дорад. Лутфан таваҷҷӯҳ намоед, ки ҳангоми кор кардани контейнери Buildah, ки Fuse-ро истифода мебарад, шумо бояд дастгоҳи /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. Агар амнияти ҳадди аксар талаб карда шавад, пас барои ҳар як контейнер шумо метавонед папкаи шахсии худро барои контейнерҳо/тасвир эҷод кунед ва онро ба контейнер тавассути volume-mount пайваст кунед. Ғайр аз он, феҳристи контекстро дар худи контейнер, дар папкаи /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 ба он татбиқ мешаванд. Чунин контейнерро ҳатто бо изолятсияи Фазои User Namespace бо илова кардани опсия ба монанди -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-ро тасвири зараровар таъмин кунад. Илова бар ин, ба шумо лозим меояд, ки ҷудокунии SELinux-ро ғайрифаъол кунед, то равандҳо дар контейнери Buildah бо нигаҳдории ҳост ҳамкорӣ кунанд. Дар хотир доред, ки ин хосият то ҳол аз васлаки 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 илова кунед, то вақте ки шумо контейнерро оғоз мекунед, муҳаррики контейнер дар онҳо тасвири дилхоҳро ҷустуҷӯ мекунад. Ғайр аз он, он тасвирро аз реестр танҳо дар сурате зеркашӣ мекунад, ки онро дар ҳеҷ яке аз ин анборҳо пайдо накунад. Муҳаррики контейнер метавонад танҳо ба анбори сабтшаванда навишта шавад...

Агар шумо ба боло ҳаракат кунед ва ба Dockerfile нигаред, ки мо барои сохтани тасвир quay.io/buildah/stable истифода мебарем, сатрҳои монанди инҳо мавҷуданд:

# 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 host ба /var/lib/shared дар дохили контейнер дар ҳолати танҳо барои хондан насб карда шудааст. Аз ин рӯ, дар як контейнер кор карда, Buildah метавонад ҳама гуна тасвирҳоеро, ки қаблан бо Podman/CRI-O (салом, суръат) бор карда шуда буданд, истифода барад, аммо метавонад танҳо ба анбори худ нависад (салом, амният). Инчунин қайд кунед, ки ин бидуни хомӯш кардани ҷудокунии SELinux барои контейнер анҷом дода мешавад.

Нюйсаи муҳим

Дар ҳеҷ сурат набояд ягон тасвирро аз анбори аслӣ нест кунед. Дар акси ҳол, контейнери Buildah метавонад ба садама дучор шавад.

Ва ин ҳама афзалиятҳо нестанд

Имкониятҳои нигаҳдории иловагӣ бо сенарияи дар боло зикршуда маҳдуд нестанд. Масалан, шумо метавонед ҳамаи тасвирҳои контейнерро дар як анбори шабакаи муштарак ҷойгир кунед ва ба он ба ҳама контейнерҳои Buildah дастрасӣ диҳед. Фарз мекунем, ки мо садҳо тасвир дорем, ки системаи CI/CD-и мо барои сохтани тасвирҳои контейнерӣ мунтазам истифода мебарад. Мо ҳамаи ин тасвирҳоро дар як ҳости нигаҳдорӣ мутамарказ мекунем ва сипас бо истифода аз абзорҳои нигаҳдории шабакавӣ (NFS, Gluster, Ceph, ISCSI, S3...), мо дастрасии умумиро ба ин анбор ба ҳама гиреҳҳои Buildah ё Kubernetes мекушояд.

Ҳоло барои насб кардани ин анбори шабакавӣ ба контейнери Buildah дар /var/lib/shared кифоя аст ва ҳамин тавр - контейнерҳои Buildah дигар набояд тасвирҳоро тавассути кашидан зеркашӣ кунанд. Ҳамин тариқ, мо марҳилаи пеш аз популятсияро мепартоем ва дарҳол омодаем, ки контейнерҳоро паҳн кунем.

Ва албатта, онро дар як системаи зиндаи Kubernetes ё инфрасохтори контейнерӣ барои оғоз ва идора кардани контейнерҳо дар ҳама ҷо бидуни зеркашии тасвирҳо истифода бурдан мумкин аст. Ғайр аз он, феҳристи контейнер, ки дархости push барои бор кардани тасвири навшуда ба он мегирад, метавонад ин тасвирро ба таври худкор ба анбори шабакавии муштарак ирсол кунад, ки он фавран ба ҳама гиреҳҳо дастрас мешавад.

Тасвирҳои контейнерӣ баъзан метавонанд андозаи зиёди гигабайтро расонанд. Функсияи нигаҳдории иловагӣ ба шумо имкон медиҳад, ки аз клон кардани ин гуна тасвирҳо дар гиреҳҳо канорагирӣ кунед ва кушодани контейнерҳоро қариб як лаҳза месозад.

Илова бар ин, мо дар айни замон дар болои як хусусияти нав кор карда истодаем, ки бо номи қабати ҳаҷм насб карда мешавад, ки сохтани контейнерҳоро боз ҳам тезтар мекунад.

хулоса

Иҷрои Buildah дар дохили контейнер дар Kubernetes/CRI-O, Podman ё ҳатто Docker имконпазир, содда ва бехатартар аз истифодаи docker.socket аст. Мо чандирии кор бо тасвирҳоро хеле афзоиш додем, то шумо метавонед онҳоро бо роҳҳои гуногун иҷро кунед, то тавозуни байни амният ва иҷроишро беҳтар созед.

Функсияи нигаҳдории иловагӣ ба шумо имкон медиҳад, ки зеркашии тасвирҳоро ба гиреҳҳо суръат бахшед ё ҳатто пурра нест кунед.

Манбаъ: will.com

Илова Эзоҳ