Linee guida per eseguisce Buildah in un containeru

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.

Linee guida per eseguisce Buildah in un containeru

Parechje persone sò attratte da l'idea di custruisce l'imaghjini OCI in containeri Kubernetes o sistema simile. Diciamu chì avemu un CI / CD chì cullighja constantemente l'imaghjini, dopu qualcosa cum'è RedHat OpenShift/Kubernetes seria abbastanza utile in termini di bilanciamentu di carica durante e custruzzioni. Finu à pocu tempu, a maiò parte di a ghjente hà datu l'accessu à i cuntenituri à un socket Docker è li permette di eseguisce u cumandamentu di creazione di docker. Parechji anni fà avemu dimustratuchì questu hè assai inseguru, in fattu, hè ancu peggiu di dà root o sudo senza password.

Hè per quessa chì a ghjente prova constantemente à eseguisce Buildah in un containeru. In corta, avemu creatu esempiu cumu, in u nostru parè, hè megliu per eseguisce Buildah in un containeru, è hà publicatu l'imaghjini currispondenti quay.io/buildah. Cuminciamu...

cutter

Queste imagine sò custruite da Dockerfiles, chì ponu esse truvati in u repository Buildah in u cartulare custruì l'immagine.
Quì avemu da cunsiderà versione stabile di 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

Invece di OverlayFS, implementatu à u livellu di u kernel Linux host, usemu u prugramma in u cuntinuu fusible-overlay, perchè attualmente OverlayFS pò esse muntatu solu s'ellu li dete permessi SYS_ADMIN utilizendu capacità Linux. È vulemu eseguisce i nostri cuntenituri Buildah senza privilegi di root. Fuse-overlay funziona abbastanza rapidamente è hà un rendimentu megliu cà u driver di almacenamiento VFS. Per piacè nutate chì quandu eseguite un containeru Buildah chì usa Fuse, duvete furnisce u dispositivu /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

Dopu avemu creatu un repertoriu per u almacenamentu supplementu. Container/magazzini supporta u cuncettu di cunnessione di magazzini d'imaghjini di sola lettura supplementari. Per esempiu, pudete cunfigurà un spaziu di almacenamentu di overlay in una macchina, è dopu aduprà NFS per muntà stu almacenamentu nantu à un'altra macchina è utilizate l'imaghjini da ellu senza scaricà via pull. Avemu bisognu di stu almacenamentu per pudè cunnette qualchì almacenamentu di l'imaghjini da l'ospite cum'è un voluminu è l'utilizanu in u cuntinuu.

# 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

У contenitori/magazzini Ci hè una cosa cusì bella cum'è magazzini supplementari (magazzini supplementari), grazie à quale quandu lancianu è custruiscenu cuntenituri, i mutori di cuntainer ponu utilizà magazzini d'imaghjini esterni in modu di superposizione di sola lettura. Essenzialmente, pudete aghjunghje unu o più magazzini di sola lettura à u schedariu storage.conf per chì quandu avete principiatu u cuntinuu, u mutore di cuntainer cerca l'imaghjini desiderate in elli. Inoltre, scaricarà l'imaghjini da u registru solu s'ellu ùn a trova micca in alcunu di sti magazzini. U mutore di u containeru serà capaci di scrive solu in u almacenamentu scrivibile...

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

Add a comment