Richtlinnen fir Buildah an engem Container ze lafen

Wat ass d'Schéinheet vun der Ofkupplung vum Container Runtime an getrennten Tooling Komponenten? Besonnesch dës Tools kënnen ufänken ze kombinéieren sou datt se sech géigesäiteg schützen.

Richtlinnen fir Buildah an engem Container ze lafen

Vill Leit ginn op d'Iddi ugezunn fir containeriséiert OCI Biller bannent ze bauen Kubernetes oder ähnleche System. Loosst eis soen, mir hunn e CI/CD deen dauernd Biller sammelt, dann eppes wéi Red Hat OpenShift/ Kubernetes wier zimmlech nëtzlech a punkto Laaschtbalancéierung wärend Builds. Bis viru kuerzem hunn déi meescht Leit Containeren einfach Zougang zu engem Docker Socket ginn an hinnen erlaabt den Docker Build Kommando auszeféieren. Virun e puer Joer hu mir gewisendatt dëst ganz onsécher ass, tatsächlech, et ass nach méi schlëmm wéi Passwuertlose Root oder Sudo ze ginn.

Dofir probéieren d'Leit dauernd Buildah an engem Container ze lafen. Kuerz gesot, mir hunn geschaf Beispill wéi, eiser Meenung no, ass am beschten Buildah an engem Container ze lafen, an déi entspriechend Biller op gepost quay.io/buildah. Loosst eis ufänken ...

Upassung

Dës Biller sinn aus Dockerfiles gebaut, déi am Buildah Repository am Dossier fonnt ginn bauenahimage.
Hei wäerte mir betruecht stabil Versioun vum 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

Amplaz vun OverlayFS, implementéiert um Host Linux Kernel Niveau, benotze mir de Programm am Container Sicherung iwwerlageren, well de Moment OverlayFS kann nëmme montéieren wann Dir et SYS_ADMIN Permissiounen mat Linux Fäegkeeten gitt. A mir wëllen eis Buildah Container ouni Root Privilegien lafen. Fuse-Overlay funktionnéiert zimlech séier an huet besser Leeschtung wéi de VFS Storage Chauffer. Maacht weg datt wann Dir e Buildah Container leeft deen Fuse benotzt, musst Dir den /dev/fuse Apparat ubidden.

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

Als nächst erstelle mir e Verzeichnis fir zousätzlech Späichere. Container / Stockage ënnerstëtzt d'Konzept fir zousätzlech liesbare Bildgeschäfter ze verbannen. Zum Beispill, kënnt Dir en Iwwerlagerungsgebitt op enger Maschinn konfiguréieren, an dann NFS benotzen fir dës Späichere op enger anerer Maschinn ze montéieren a Biller dovun ze benotzen ouni iwwer Pull erofzelueden. Mir brauchen dës Späichere fir e bësse Bildlagerung vum Host als Volumen ze verbannen an et am Container ze benotzen.

# 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

Endlech, andeems Dir d'BUILDAH_ISOLATION Ëmfeldvariabel benotzt, soen mir dem Buildah Container fir Standard mat Chroot Isolatioun ze lafen. Zousätzlech Isolatioun ass hei net erfuerderlech, well mir schonn an engem Container schaffen. Fir datt Buildah seng eege Nummraum getrennt Container erstellt, ass de SYS_ADMIN Privileg erfuerderlech, wat d'Regele vum Container SELinux an SECCOMP entspaant erfuerdert, wat géint eis Präferenz ass fir aus engem séchere Container ze bauen.

Lafen Buildah bannent engem Container

D'Buildah Container Bild Diagramm uewen diskutéiert erlaabt Iech d'Methoden flexibel ze variéieren fir esou Container ze lancéieren.

Geschwindegkeet versus Sécherheet

Computersécherheet ass ëmmer e Kompromiss tëscht der Geschwindegkeet vum Prozess a wéi vill Schutz ronderëm ass. Dës Ausso ass och richteg wann Dir Container montéiert, also drënner wäerte mir d'Optioune fir sou e Kompromiss betruechten.

D'Containerbild hei uewen diskutéiert hält seng Lagerung an /var/lib/containers. Dofir musse mir den Inhalt an dësen Dossier montéieren, a wéi mir dat maachen wäert d'Geschwindegkeet vum Bau vu Containerbiller staark beaflossen.

Loosst eis dräi Optiounen betruechten.

Option 1. Wann maximal Sécherheet erfuerderlech ass, da kënnt Dir fir all Container Ären eegenen Dossier fir Container / Bild erstellen an et mam Container iwwer Volumen-Mount verbannen. An ausserdeem, plazéiert de Kontextverzeechnes am Container selwer, am / Build Dossier:

# 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

Sécherheet. Buildah, deen an esou engem Container leeft, huet maximal Sécherheet: et gëtt keng Root-Privilegien mat Fäegkeeten, an all SECOMP an SELinux Restriktiounen gëllen dofir. Sou e Container ka souguer mat User Namespace Isolatioun lafen andeems Dir eng Optioun bäidréit wéi —uidmap 0: 100000:10000.

Leeschtung. Awer d'Performance hei ass minimal, well all Biller aus Containerregistréiere ginn all Kéier op den Host kopéiert, an de Cache funktionnéiert guer net. Wann Dir seng Aarbecht ofgeschloss huet, muss de Buildah Container d'Bild an d'Registry schécken an den Inhalt am Host zerstéieren. Déi nächst Kéier wann d'Containerbild gebaut gëtt, muss et erëm aus der Registry erofgeluede ginn, well bis déi Zäit näischt méi um Host bleift.

Option 2. Wann Dir Docker-Niveau Leeschtung braucht, kënnt Dir den Host Container / Lagerung direkt an de Container montéieren.

# 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

Sécherheet. Dëst ass de mannst séchere Wee fir Container ze bauen well et dem Container erlaabt d'Späichere vum Host z'änneren a potenziell Podman oder CRI-O e béiswëlleg Bild fidderen. Zousätzlech musst Dir d'SELinux Trennung auszeschalten, sou datt Prozesser am Buildah Container mat der Lagerung um Host interagéiere kënnen. Bedenkt datt dës Optioun nach ëmmer besser ass wéi en Docker Socket well de Container duerch verbleiwen Sécherheetsfeatures gespaart ass a kann net einfach e Container um Host lafen.

Leeschtung. Hei ass et maximal, well de Caching voll benotzt gëtt. Wann de Podman oder CRI-O dat erfuerderlecht Bild schonn op den Host erofgelueden hunn, da muss de Buildah-Prozess am Container et net erëm eroflueden, a spéider Builds baséiert op dësem Bild kënnen och aus dem Cache huelen wat se brauchen. .

Option 3. D'Essenz vun dëser Method ass e puer Biller an ee Projet mat engem gemeinsamen Dossier fir Container Biller ze kombinéieren.

# 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

An dësem Beispill läsche mir de Projet Dossier (/var/lib/project3) net tëscht Runen, sou datt all spéider Builds am Projet vum Caching profitéieren.

Sécherheet. Eppes tëscht Optiounen 1 an 2. Engersäits hunn d'Container keen Zougang zum Inhalt um Host an deementspriechend kënnen net eppes Schlechtes an d'Podman/CRI-O Bildlagerung rutschen. Op der anerer Säit, als Deel vu sengem Design, kann e Container mat der Versammlung vun anere Container stéieren.

Leeschtung. Hei ass et méi schlëmm wéi wann Dir e gemeinsame Cache um Hostniveau benotzt, well Dir kënnt keng Biller benotzen déi scho mat Podman/CRI-O erofgeluede goufen. Wéi och ëmmer, wann Buildah d'Bild erofgelueden huet, kann d'Bild an all spéider Builds am Projet benotzt ginn.

Zousätzlech Späichere

У Container / Stockage Et gëtt sou eng cool Saach wéi zousätzlech Geschäfter (zousätzlech Geschäfter), duerch déi wann Dir Container lancéiert an baut, Containermotoren extern Bildgeschäfter am Read-only Overlay Modus benotzen. Am Wesentlechen kënnt Dir een oder méi liesen-nëmme Späichere fir d'storage.conf Datei addéieren, sou datt wann Dir de Container ufänkt, de Containermotor sicht dat gewënschte Bild an hinnen. Ausserdeem wäert et d'Bild aus der Registry eroflueden nëmmen wann et et net an enger vun dëse Späicher fënnt. De Containermotor wäert nëmme fäeg sinn op schrëftlech Späichere ze schreiwen ...

Wann Dir erop scrollt an d'Dockerfile kuckt, déi mir benotze fir d'Bild ze bauen quay.io/buildah/stable, da ginn et Linnen wéi dës:

# 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

An der éischter Zeil änneren mir /etc/containers/storage.conf am Containerbild, a soen dem Späicherchauffer fir "additionalimagestores" am /var/lib/shared folder ze benotzen. An an der nächster Zeil erstellen mir e gemeinsamen Dossier an addéiere e puer Sperrdateien fir datt et kee Mëssbrauch vu Container / Lagerung gëtt. Wesentlech kreéiere mir einfach en eidele Container Image Store.

Wann Dir Container / Lagerung op engem Niveau méi héich wéi dësen Dossier montéiert, wäert Buildah d'Biller benotzen.

Loosst eis elo zréck op d'Optioun 2, déi hei uewe diskutéiert gouf, wann de Buildah Container kann op Container liesen a schreiwen / Store op de Hosten an deementspriechend maximal Leeschtung huet wéinst Cache Biller um Podman / CRI-O Niveau, awer bitt e Minimum vu Sécherheet well et kann direkt op Stockage schreiwen. Loosst eis hei zousätzlech Späichere addéieren a kréien dat Bescht vu béide Welten.

# 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

Notéiert datt de Host /var/lib/containers/storage op /var/lib/shared am Container am Read-only Modus montéiert ass. Dofir, schafft an engem Container, Buildah kann all Biller benotzen déi virdru mat Podman / CRI-O erofgeluede goufen (Moien, Geschwindegkeet), awer kann nëmmen op seng eege Späichere schreiwen (Moien, Sécherheet). Notéiert och datt dëst gemaach gëtt ouni d'SELinux Trennung fir de Container auszeschalten.

Wichteg Nuancen

Ënner kengen Ëmstänn sollt Dir Biller aus dem ënnerierdesche Repository läschen. Soss kann de Buildah Container Crash.

An dëst sinn net all d'Virdeeler

D'Méiglechkeete fir zousätzlech Späichere sinn net limitéiert op den uewe genannte Szenario. Zum Beispill kënnt Dir all Containerbiller op enger gemeinsamer Netzwierkspäicherung setzen an Zougang zu all Buildah Container ginn. Loosst eis soen datt mir Honnerte vu Biller hunn déi eise CI/CD System regelméisseg benotzt fir Container Biller ze bauen. Mir konzentréieren all dës Biller op engem Späicherhost an dann, mat de bevorzugten Netzwierkspeicher Tools (NFS, Gluster, Ceph, ISCSI, S3 ...), öffnen mir allgemeng Zougang zu dëser Späichere fir all Buildah oder Kubernetes Noden.

Elo ass et genuch fir dës Netzwierkspäicherung an de Buildah Container op /var/lib/shared ze montéieren an dat ass et - Buildah Container mussen net méi Biller iwwer Pull eroflueden. Sou geheie mir d'Phase vun der Pre-Populatioun eraus a sinn direkt prett fir d'Container auszerollen.

An natierlech kann dëst an engem Live Kubernetes System oder Containerinfrastruktur benotzt ginn fir Container iwwerall ze lancéieren an ze lafen ouni Pull Download vun Biller. Ausserdeem kann d'Containerregistrierung, déi eng Push-Ufro kritt fir en aktualiséiert Bild drop eropzelueden, dëst Bild automatesch op eng gemeinsam Netzwierkspäicherung schécken, wou et direkt fir all Noden verfügbar ass.

Container Biller kënnen heiansdo vill Gigabyte an der Gréisst erreechen. D'Funktionalitéit vun zousätzlech Späicher erlaabt Iech esou Biller iwwer Wirbelen ze klonen ze vermeiden a mécht d'Startbehälter bal direkt.

Zousätzlech schaffe mir momentan un enger neier Feature genannt Overlay Volume mounts, déi d'Baubehälter nach méi séier maachen.

Konklusioun

Buildah an engem Container an Kubernetes/CRI-O, Podman oder souguer Docker ze lafen ass machbar, einfach a vill méi sécher wéi docker.socket ze benotzen. Mir hunn d'Flexibilitéit vun der Aarbecht mat Biller staark erhéicht, sou datt Dir se op verschidde Manéiere lafen kënnt fir d'Gläichgewiicht tëscht Sécherheet a Leeschtung ze optimiséieren.

D'Funktionalitéit vun zousätzlech Späicher erlaabt Iech d'Download vu Biller op Noden ze beschleunegen oder souguer komplett ze eliminéieren.

Source: will.com

Setzt e Commentaire