Chì ci hè a bellezza di disaccoppià u runtime di u containeru in cumpunenti di l'uttellu separati? In particulare, sti arnesi ponu esse cumminati in modu chì prutegge l'altri.
Parechje persone sò attratte da l'idea di custruisce l'imaghjini OCI in containeri
Hè per quessa chì a ghjente prova constantemente à eseguisce Buildah in un containeru. In corta, avemu creatu
cutter
Queste imagine sò custruite da Dockerfiles, chì ponu esse truvati in u repository Buildah in u cartulare
Quì avemu da cunsiderà
# 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
Invece di OverlayFS, implementatu à u livellu di u kernel Linux host, usemu u prugramma in u cuntinuu
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
Dopu avemu creatu un repertoriu per u almacenamentu supplementu.
# 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
Infine, usendu a variabile di l'ambiente BUILDAH_ISOLATION, dicemu à u containeru Buildah per eseguisce cù chroot isolamentu per difettu. Un insulamentu supplementu ùn hè micca necessariu quì, postu chì avemu digià travagliatu in un containeru. Per Buildah per creà i so cuntenituri separati da u spaziu di nomi, u privilegiu SYS_ADMIN hè necessariu, chì deve esse rilassate e regule SELinux è SECCOMP di u containeru, chì hè contru à a nostra preferenza di custruisce da un containeru sicuru.
Running Buildah in un containeru
U diagramma di l'imaghjini di u containeru Buildah discussatu sopra permette di varià in modu flessibile i metudi di lanciari tali cuntenituri.
Velocità versus sicurità
A sicurità di l'informatica hè sempre un cumprumissu trà a velocità di u prucessu è a quantità di prutezzione hè impannillata. Questa dichjarazione hè ancu vera quandu si assemblanu cuntenituri, cusì sottu cunsideremu l'opzioni per un tali cumprumissu.
L'imaghjini di u containeru discutitu sopra mantene u so almacenamentu in /var/lib/containers. Per quessa, avemu bisognu di muntà u cuntenutu in stu cartulare, è cumu facemu questu affetterà assai a velocità di custruisce l'imaghjini di u containeru.
Cunsideremu trè opzioni.
Opzione 1. Se a massima sicurezza hè necessaria, allora per ogni cuntinuu pudete creà u vostru propiu cartulare per cuntenituri / imaghjini è cunnette à u cuntainer via volume-mount. È in più, mette u cartulare di cuntestu in u cuntinuu stessu, in u cartulare /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
Seguretat. Buildah chì funziona in un tali containeru hà a massima sicurezza: ùn hè micca datu alcun privilegiu di root usendu capacità, è tutte e restrizioni SECOMP è SELinux s'applicanu à questu. Un tali containeru pò ancu esse eseguitu cù l'isolamentu di u User Namespace aghjustendu una opzione cum'è -uidmap 0: 100000: 10000.
Rendimentu. Ma u rendiment quì hè minimu, postu chì ogni imaghjini da i registri di u containeru sò copiati in l'ospitu ogni volta, è a caching ùn funziona micca. Quandu finisce u so travagliu, u containeru Buildah deve mandà l'imaghjini à u registru è distrughje u cuntenutu nantu à l'ospite. A prossima volta chì l'imaghjini di u cuntinuu hè custruitu, duverà esse scaricatu da u registru di novu, postu chì da quellu tempu ùn ci sarà nunda in l'ospitu.
Opzione 2. Sè avete bisognu di prestazioni à livellu Docker, pudete muntà u cuntainer / almacenamentu di l'ospiti direttamente in u containeru.
# 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
Seguretat. Questu hè u modu menu sicuru per custruisce cuntenituri perchè permette à u cuntinuu di mudificà l'almacenamiento nantu à l'ospitu è puderia alimentà Podman o CRI-O una maghjina maliciosa. Inoltre, avete bisognu di disattivà a separazione SELinux per chì i prucessi in u containeru Buildah ponu interagisce cù l'almacenamiento nantu à l'ospite. Innota chì sta opzione hè sempre megliu cà un socket Docker perchè u cuntinuu hè chjusu da e funzioni di sicurezza rimanenti è ùn pò micca solu eseguisce un containeru nantu à l'ospite.
Rendimentu. Quì hè massimu, postu chì u caching hè cumplettamente utilizatu. Se Podman o CRI-O anu digià scaricatu l'imaghjina necessaria à l'ospite, allora u prucessu di Buildah in u cuntinuu ùn duverà micca scaricallu di novu, è e custruzzioni successive basate nantu à sta maghjina puderanu ancu piglià ciò chì necessitanu da a cache. .
Opzione 3. L'essenza di stu metudu hè di cunghjuntà parechje imagine in un prughjettu cù un cartulare cumuni per l'imaghjini di cuntainer.
# 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
In questu esempiu, ùn sguassate micca u cartulare di u prughjettu (/var/lib/project3) trà e runs, cusì tutte e custruzzioni successive in u prughjettu beneficianu di caching.
Seguretat. Qualcosa trà l'opzioni 1 è 2. Per una banda, i cuntenituri ùn anu micca accessu à u cuntenutu nantu à l'ospitu è, per quessa, ùn ponu micca slip qualcosa di male in l'almacenamiento d'imaghjini Podman / CRI-O. Per d 'altra banda, cum'è parte di u so disignu, un cuntinuu pò interferiscenu cù l'assemblea di altri cuntenituri.
Rendimentu. Quì hè peghju chè quandu si usa un cache spartutu à u livellu di l'ospite, postu chì ùn pudete micca aduprà l'imaghjini chì sò digià scaricati cù Podman/CRI-O. In ogni casu, una volta Buildah scarica l'imaghjini, l'imaghjini pò esse aduprata in ogni custruzzione sussegwenti in u prugettu.
Storage supplementu
У
Se scorri è fighjate à u Dockerfile chì avemu usatu per custruisce l'imaghjini quay.io/buildah/stable, ci sò linii cum'è questu:
# 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
In a prima linea, mudificàmu /etc/containers/storage.conf in l'imaghjini di u containeru, dicendu à u driver di almacenamento per aduprà "additionalimagestores" in u cartulare /var/lib/shared. È in a prossima linea creamu un cartulare spartutu è aghjunghje un coppiu di schedarii di serratura in modu chì ùn ci hè micca abusu da cuntenituri / almacenamentu. Essenzialmente, simu simpliciamente creendu un magazinu d'imaghjini di cuntainer viotu.
Se muntate cuntenituri / almacenamentu à un livellu più altu ch'è stu cartulare, Buildah puderà utilizà l'imaghjini.
Avà vultemu à l'Opzione 2 discutitu sopra, quandu u containeru Buildah pò leghje è scrive in cuntenituri / magazzini nantu à l'ospiti è, per quessa, hà u massimu rendimentu per via di caching images à u livellu Podman / CRI-O, ma furnisce un minimu di sicurità postu chì pò scrive direttamente à u almacenamiento. Avà aghjunghjemu un almacenamentu supplementu quì è uttene u megliu di i dui mondi.
# 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
Nota chì u /var/lib/containers/storage di l'ospite hè muntatu à /var/lib/shared in u containeru in modu di sola lettura. Dunque, travagliendu in un cuntainer, Buildah pò utilizà qualsiasi imaghjini chì sò stati scaricati prima cù Podman/CRI-O (salutu, veloce), ma pò scrive solu à u so propiu almacenamentu (salutu, sicurità). Innota ancu chì questu hè fattu senza disattivà a separazione SELinux per u cuntinuu.
Nuance importante
In nessuna circustanza ùn duvete eliminà alcuna imagine da u repositoriu sottostante. Altrimenti, u cuntinuu Buildah pò fallu.
È ùn sò micca tutti i vantaghji
E pussibilità di almacenamentu supplementu ùn sò micca limitati à u scenariu sopra. Per esempiu, pudete mette tutte l'imaghjini di cuntenituri in un almacenamentu di rete spartutu è dà accessu à tutti i cuntenituri Buildah. Diciamu chì avemu centinaie d'imaghjini chì u nostru sistema CI / CD usa regularmente per custruisce l'imaghjini di u containeru. Cuncentrate tutte queste imagine nantu à un host di almacenamentu è dopu, utilizendu l'arnesi di almacenamentu di rete preferiti (NFS, Gluster, Ceph, ISCSI, S3...), apremu l'accessu generale à questu almacenamentu à tutti i nodi Buildah o Kubernetes.
Avà hè abbastanza per muntà stu almacenamentu di rete in u containeru Buildah in /var/lib/shared è basta - i cuntenituri Buildah ùn anu più da scaricà l'imaghjini via pull. Cusì, scacciemu a fase di pre-populazione è sò subitu pronti à sparghje i cuntenituri.
E, sicuru, questu pò esse usatu in un sistema Kubernetes live o infrastruttura di cuntainer per lancià è eseguisce cuntenituri in ogni locu senza scaricamentu di l'imaghjini. Inoltre, u registru di u containeru, riceve una dumanda push per carica una maghjina aghjurnata, pò mandà automaticamente sta maghjina à un almacenamentu di rete spartutu, induve diventa immediatamente dispunibule per tutti i nodi.
L'imaghjini di u containeru ponu qualchì volta ghjunghje à parechji gigabyte in grandezza. A funziunalità di l'almacenamiento supplementu permette di evità di clonà tali imaghjini attraversu i nodi è rende u lanciamentu di cuntenituri quasi istantaneu.
Inoltre, simu attualmente travagliendu in una nova funzione chjamata monti di volumi di sovrapposizione, chì farà custruì cuntenituri ancu più veloce.
cunchiusioni
Eseguisce Buildah in un containeru in Kubernetes/CRI-O, Podman, o ancu Docker hè fattibile, simplice è assai più sicuru ch'è cù docker.socket. Avemu aumentatu assai a flessibilità di travaglià cù l'imaghjini, cusì pudete eseguisce in una varietà di modi per ottimisà l'equilibriu trà a sicurità è u rendiment.
A funziunalità di l'almacenamiento supplementu permette di accelerà o ancu eliminà cumplettamente u scaricamentu di l'imaghjini à i nodi.
Source: www.habr.com