Rekomandime për nisjen e Buildah brenda kontejnerëve

Çfarë e bën të jashtëzakonshme ndarjen e mjedisit të ekzekutimit të konteinerëve në komponentë të veçantë? Në veçanti, është se këta mjete mund të fillohet t'i kombinojmë, në mënyrë që ato të mbrojnë njëra-tjetrën.

Rekomandime për nisjen e Buildah brenda kontejnerëve

Shumë tërhiqet ideja e ndërtimit të imazheve OCI të konteinerëve në kuadër të Kubernetes ose një sistemi të ngjashëm. Supozoni se kemi një CI/CD që vazhdimisht ndërton imazhe, atëherë diçka e tillë Red Hat OpenShift/Kubernetes было бы весьма полезно с точки зрения распределения нагрузки при сборке. До недавних пор большинство людей просто давали контейнерам доступ к Docker-сокету и разрешали выполнять команду docker build. Ne e treguam disa vjet më parë, se kjo është shumë e pasigurt, në fakt, është më keq sesa t’i jepni root pa fjalëkalim ose sudo.

Prandaj njerëzit vazhdojnë të përpiqen të ekzekutojnë Buildah në një konteiner. Në përmbledhje, ne krijuam është se si, sipas mendimit tonë, është më mirë të ekzekutojmë Buildah brenda konteinerit dhe publikuan imazhet përkatëse në quay.io/buildah. Le të fillojmë…

Configuration

Këto imazhe janë mbledhur nga Dockerfiles që mund të gjenden në repositorin e Buildah në dosjen buildahimage.
Këtu do të shqyrtojmë versionin e stabilizuar të 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

Në vend të OverlayFS, e cila implementohet në nivelin e kernel-it të hosts, ne përdorim brenda konteinerit programin fuse-overlay, pasi në këtë moment OverlayFS mund të kryejë montimet vetëm nëse i jepet autorizimi SYS_ADMIN përmes mundësive të Linux. Ne duam të ekzekutojmë konteinerët tanë Buildah pa asnjë privilegj të nivelit root. Fuse-overlay funksionon mjaft shpejt dhe është më efikas në performancë se drejtuesi i ruajtjes VFS. Kujdes, që kur ekzekutoni një konteiner Buildah që përdor Fuse, kërkohet të sigurohet pajisja /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

Pastaj krijojmë një katalog për ruajtjet shtesë. Container/storage mbështet konceptin e lidhjes së ruajtjeve shtesë në mënyrë lexuese vetëm. Për shembull, mund të konfigurohet një zona ruajtjeje overlay në një makinë dhe pastaj të nënmontohet ky ruajtje në një makinë tjetër duke përdorur NFS dhe të përdoren imazhet nga ajo pa i shkarkuar përmes pull. Kjo ruajtje na nevojitet për të qenë në gjendje të lidhim si një vëllim ndonjë ruajtje imazhesh nga hosti dhe ta përdorim atë brenda konteinerit.

# 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

Dhe për më tepër, duke përdorur variablin e mjedisit BUILDAH_ISOLATION, ne themi se, si parazgjedhje, konteineri Buildah duhet të fillojë me izolim chroot. Izolimi shtesë këtu nuk është i nevojshëm, pasi ne tashmë po punojmë brenda një konteineri. Për të bërë që Buildah të krijojë kontenerët e tij me ndarje emërish, kërkohet privilegji SYS_ADMIN, dhe për këtë, do të duhet të zbusim rregullat e SELinux dhe SECCOMP për kontenierin, të cilat bien ndesh me instalimin tonë për të kryer ndërtimin nga një kontejner të sigurt.

Nisni Buildah brenda konteinerit

Skema e përmendur më sipër e imazhit të konteinerit Buildah lejon një variabilitet të fleksibël të mënyrave të nisjes së këtyre kontejnerëve.

Shpejtësia përballë sigurisë

Siguria kompjuterike është gjithmonë një kompromis midis shpejtësisë së procesit dhe sa mbrojtje është përreth tij. Ky pohim është i vërtetë edhe gjatë ndërtimit të kontejnerëve, prandaj më poshtë do të shqyrtojmë opsionet e tilla të kompromisit.

Imazhi e sipërpërmendur i konteinerit do të mbajë magazinën e tij në /var/lib/containers. Prandaj na nevojitet të montojmë përmbajtjen në këtë dosje, dhe si do ta bëjmë këtë do të ketë një ndikim të madh në shpejtësinë e ndërtimit të imazheve të kontejnerëve.

Le të shqyrtojmë tre variante.

Varianti 1. Nëse kërkohet maksimumi i sigurisë, atëherë për çdo kontejner mund të krijoni një dosje të tij për containers/image dhe ta lidhnit atë me kontejnerin përmes volume-mount. Përveç kësaj, mund të vendosni direktorinë e kontekstit brenda vetë kontejnerit, në dosjen /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

Siguria. Buildah që punon në një kontejner të tillë ka maksimumin e sigurisë: nuk i jepen asnjë privilegj root përmes capabilities, dhe i nënshtrohet të gjitha kufizimeve të SECOMP dhe SELinux. Një kontejner i tillë madje mund të nisë me izolim të Emrit të Përdoruesit, duke shtuar një opsion si —uidmap 0:100000:10000.

Performanca. Megjithatë, performanca këtu është minimale, pasi çdo imazh nga regjistrat e kontejnerëve kopjohet çdo herë në host, dhe cache nuk funksionon fare. Duke përfunduar punën e tij, konteineri Buildah duhet të dërgojë imazhin në regjistër dhe të shkatërrojë përmbajtjen në host. Kur imazhi i kontejnerit të ndërtohet përsëri, do të duhet të shkarkohet nga regjistri, pasi deri atëherë në host nuk do të mbetet asgjë.

Varianti 2. Nëse keni nevojë për performancë në nivelin e Docker-it, mund të montoni container/storage të hostit drejtpërdrejt në kontejner.

# 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

Siguria. Ky është mënyra më pak e sigurt për ndërtimin e kontejnerëve, pasi këtu kontejneri lejohet të modifikojë ruajtjen në host, dhe potencialisht mund të fusë një imazh të dëmshëm në Podman ose CRI-O. Për më tepër, do të kërkohet të çaktivizoni ndarjen e SELinux-it, që proceset brenda kontejnerit Buildah të mund të ndërveprojnë me ruajtjen në host. Vini re se kjo mundësi është akoma më e mirë se socket-i i Docker-it, pasi kontejneri bllokohet nga funksionet e tjera të sigurisë dhe nuk mund thjesht të marrë dhe të ekzekutojë ndonjë kontejner në host.

Performanca. Këtu është maksimale, pasi angazhohet plotësisht caching. Nëse Podman ose CRI-O kanë përfunduar duke shkarkuar imazhin e nevojshëm në host, atëherë procesit Buildah brenda kontejnerit nuk do t'i duhet ta shkarkojë përsëri, dhe ndërtimet e ardhshme që bazohen në këtë imazh gjithashtu mund të marrin atë që u duhen nga cache.

Mënyra 3. Thelbi i kësaj mënyre është që të bashkohen disa imazhe në një projekt me një dosje të përbashkët për imazhet e kontejnerëve.

# 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

Në këtë shembull ne nuk e fshijmë dosjen e projektit (/var/lib/project3) midis ekzekutimeve, kështu që të gjitha ndërtimet e ardhshme brenda projektit përfitojnë nga caching.

Siguria. Një gjë e ndërmjetme mes mundësive 1 dhe 2. Nga njëra anë, kontejnerët nuk kanë akses në përmbajtjen e hostit dhe, për rrjedhojë, nuk mund të fusin diçka të keqe në ruajtjen e imazheve Podman/CRI-O. Nga ana tjetër, brenda projektit të tij, kontejneri mund të ndërhyjë në ndërtimin e kontejnerëve të tjerë.

Performanca. Këtu është më keq se përdorimi i caching të përgjithshëm në nivelin e hostit, pasi nuk mund të përdoren imazhe që janë shkarkuar më parë me ndihmën e Podman/CRI-O. Megjithatë, pasi Buildah të ketë shkarkuar imazhin, ky imazh mund të përdoret në çdo ndërtim të ardhshëm brenda projektit.

Ruajtje të tjera

Me containers/storage Kaçka si gjë e shkëlqyer si depozitat shtesë (additional stores), falë së cilës, gjatë ekzekutimit dhe ndërtimit të kontejnerëve, motorët e kontejnerëve mund të përdorin depozita të jashtme imazhesh në modalitetin read-only overlay. Në thelb, në skedarin storage.conf mund të shtoni një ose më shumë depozita "vetëm për lexim", në mënyrë që, gjatë ekzekutimit të kontejnerit, motori i kontejnerit ta kërkojë imazhin e nevojshëm në to. Dhe ai do ta shkarkojë imazhin nga regjistri vetëm në rast se nuk e gjen atë në asnjë nga këto depozita. Motori i kontejnerit do të mund të shkruajë vetëm në depozitat e aksesueshme për shkronjën...

Nëse rrotullojmë lart dhe shohim Dockerfile, që po përdorim për ndërtimin e imazhit quay.io/buildah/stable, atje ka këto rreshta:

# 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

Në rreshtin e parë ne modifikojmë /etc/containers/storage.conf brenda imazhit të kontejnerit, duke thënë motorit të storage të përdorë "additionalimagestores" në folderin /var/lib/shared. Dhe në rreshtin tjetër krijojmë një folder të përbashkët dhe shtojmë disa skedarë lock, që të mos ketë nënshtresa nga containers/storage. Në thelb, ne thjesht krijojmë një depo të zbrazët për imazhet e kontejnerëve.

Nëse montoni containers/storage në një nivel më lart se ky folder, Buildah do të mund të përdorë imazhet.

Tani, le të kthehemi te varianti i sipërm 2, kur kontejneri Buildah mund të lexojë dhe shkruajë në containers/store në host dhe, për rrjedhojë, ka performancën maksimale për shkak të caching të imazheve në nivelin e Podman/CRI-O, por ofron minimumin e sigurisë, sepse mund të shkruajë drejtpërdrejt në depozita. Tani le ta lidhim këtu depozitën shtesë dhe të marrim më të mirën e dy botëve.

# 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

Kujdes, që /var/lib/containers/storage i hostit është montuar në /var/lib/shared brenda kontejnerit në modalitetin read-only. Prandaj, duke punuar në kontejner, Buildah mund të përdorë çdo imazh që është shkarkuar më parë nga Podman/CRI-O (përshëndetje, shpejtësi), por mund të shkruajë vetëm në depozitën e tij (përshëndetje, siguri). Gjithashtu, vini re se kjo bëhet pa çaktivizimin e ndarjes SELinux për kontejnerin.

Një nuancë e rëndësishme

Asnjëherë mos hiqni asnjë imazh nga depozita nënkatër. Në të kundërt, kontejneri Buildah mund të dalë jashtë.

Dhe kjo nuk është e gjitha përfitimi

Opciones de almacenamiento adicionales no se limitan solo al escenario descrito anteriormente. Por ejemplo, se pueden alojar todas las imágenes de contenedores en un almacenamiento en red compartido y permitir el acceso a todos los contenedores de Buildah. Supongamos que tenemos cientos de imágenes que nuestro sistema CI/CD utiliza regularmente para construir imágenes de contenedores. Concentramos todas estas imágenes en un único host de almacenamiento y luego, utilizando las herramientas de almacenamiento en red preferidas (NFS, Gluster, Ceph, ISCSI, S3…), abrimos el acceso a este almacenamiento a todos los nodos de Buildah o Kubernetes.

Ahora solo es necesario montar este almacenamiento en red en el contenedor de Buildah en /var/lib/shared y listo: los contenedores de Buildah ya no tendrán que descargar imágenes mediante pull. De esta manera, eliminamos la fase de pre-población y estamos listos para lanzar contenedores de inmediato.

Y, por supuesto, esto se puede utilizar en el marco de un sistema Kubernetes existente o infraestructura de contenedores para ejecutar y ejecutar contenedores en cualquier lugar sin tener que descargar imágenes mediante pull. Además, el registro de contenedores, al recibir una solicitud push para cargar una imagen actualizada en él, puede enviar automáticamente esta imagen al almacenamiento en red compartido, donde se vuelve instantáneamente accesible para todos los nodos.

Los tamaños de las imágenes de contenedores a veces pueden alcanzar varios gigabytes. La funcionalidad de almacenamiento adicional permite evitar clonar estas imágenes en los nodos y hace que la ejecución de contenedores sea prácticamente instantánea.

Además, actualmente estamos trabajando en una nueva función de montajes de volúmenes overlay que hará que la construcción de contenedores sea aún más rápida.

Përfundim

Ejecutar Buildah dentro de un contenedor en un entorno Kubernetes/CRI-O, Podman o incluso en Docker es bastante realista, además es simple y mucho más seguro que usar docker.socket. Hemos mejorado significativamente la flexibilidad para trabajar con imágenes, y ahora puedes ejecutarlas de varias maneras para un equilibrio óptimo entre seguridad y rendimiento.

La funcionalidad de almacenamiento adicional permite acelerar o incluso eliminar por completo la descarga de imágenes en los nodos.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster