Buildah-ийг саванд хийх заавар

Савны ажиллах хугацааг салангид багаж хэрэгслийн бүрэлдэхүүн хэсгүүдэд салгах нь ямар сайхан зүйл вэ? Ялангуяа эдгээр хэрэгслүүд нь бие биенээ хамгаалахын тулд нэгтгэж эхэлдэг.

Buildah-ийг саванд хийх заавар

Олон хүмүүс дотор нь чингэлэгтэй OCI зургийг бүтээх санааг татдаг Kubernetes эсвэл ижил төстэй систем. Бидэнд байнга зураг цуглуулдаг CI/CD байгаа гэж бодъё RedHat OpenShift/Кубернетес нь угсралтын явцад ачааллыг тэнцвэржүүлэхэд маш хэрэгтэй болно. Саяхныг хүртэл ихэнх хүмүүс чингэлэгт Docker залгуурт хандах эрх олгож, docker build командыг ажиллуулахыг зөвшөөрдөг байсан. Хэдэн жилийн өмнө бид үзүүлж байсанЭнэ нь маш аюултай, үнэндээ энэ нь нууц үггүй root эсвэл 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 нь Линуксийн чадавхийг ашиглан SYS_ADMIN зөвшөөрлийг өгвөл л холбогдох боломжтой. Мөн бид Buildah контейнеруудаа ямар ч root эрхгүйгээр ажиллуулахыг хүсч байна. Гал хамгаалагч нь маш хурдан ажилладаг бөгөөд 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. Хэрэв хамгийн дээд аюулгүй байдлыг хангах шаардлагатай бол контейнер тус бүрт та өөрийн контейнер/зургийн хавтас үүсгэж, 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 зургийг татаж авсны дараа уг зургийг төслийн хүрээнд дараагийн бүтээн байгуулалтад ашиглаж болно.

Нэмэлт хадгалах сан

У сав/хадгалах Нэмэлт дэлгүүрүүд (нэмэлт дэлгүүрүүд) гэх мэт гайхалтай зүйл байдаг бөгөөд үүний ачаар чингэлэгийг эхлүүлэх, барих үед чингэлэг хөдөлгүүрүүд зөвхөн унших горимд гадаад зургийн дэлгүүрүүдийг ашиглах боломжтой байдаг. Үндсэндээ та 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

сэтгэгдэл нэмэх