Савны ажиллах хугацааг салангид багаж хэрэгслийн бүрэлдэхүүн хэсгүүдэд салгах нь ямар сайхан зүйл вэ? Ялангуяа эдгээр хэрэгслүүд нь бие биенээ хамгаалахын тулд нэгтгэж эхэлдэг.
Олон хүмүүс дотор нь чингэлэгтэй 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. Хэрэв хамгийн дээд аюулгүй байдлыг хангах шаардлагатай бол контейнер тус бүрт та өөрийн контейнер/зургийн хавтас үүсгэж, 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 нь хамгийн их хамгаалалттай: түүнд боломжуудыг ашиглан ямар ч root эрх олгогдоогүй бөгөөд 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