Pêşniyarên ji bo meşandina Buildah di hundurê konteynerek de

Bedewiya veqetandina dema xebitandina konteyneran di nav hêmanên amûrên cihêreng de çi ye? Bi taybetî, van amûran dikarin dest pê bikin ku werin berhev kirin da ku ew hevûdu biparêzin.

Pêşniyarên ji bo meşandina Buildah di hundurê konteynerek de

Pir kes bala xwe didin ramana avakirina wêneyên OCI yên konteyneran di hundurê de Kubernetes an sîstemeke mîna. Ka em bêjin me CI/CD heye ku bi berdewamî wêneyan berhev dike, paşê tiştek mîna Red Hat OpenShift/Kubernetes dê di warê hevsengkirina barkirinê de di dema çêkirinê de pir bikêr be. Heya vê dawiyê, pir kesan bi tenê konteyneran gihandin soketek Docker û destûr dida wan ku emrê avakirina dockerê bimeşînin. Çend sal berê me nîşan daku ev pir ne ewle ye, bi rastî, ew ji dayîna root an sudo ya bê şîfre jî xirabtir e.

Ji ber vê yekê mirov bi berdewamî hewl didin ku Buildah di konteynerê de bimeşînin. Bi kurtasî, me afirandin nimûne çawa, li gorî me, çêtirîn e ku meriv Buildah di hundurê konteynerek de bimeşîne, û wêneyên têkildar li ser bişîne quay.io/buildah. Ka em dest pê bikin...

ligorî

Van wêneyan ji Dockerfiles, ku di peldankê de di depoya Buildah de têne dîtin têne çêkirin. buildahimage.
Li vir em ê bifikirin guhertoya stabîl a 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

Li şûna OverlayFS, ku di asta kernel Linux-ya mêvandar de hatî bicîh kirin, em bernameyê di hundurê konteynerê de bikar tînin. sîgorteyê-overlay, ji ber ku aniha OverlayFS tenê dikare lê bike ger hûn destûrên SYS_ADMIN bidin bi karanîna kapasîteyên Linux. Û em dixwazin konteynerên xwe yên Buildah bêyî îmtiyazên root bimeşînin. Fuse-overlay pir zû dixebite û ji ajokera hilanînê VFS performansa çêtir heye. Ji kerema xwe not bikin ku dema ku konteynerek Buildah ku Fuse bikar tîne dimeşîne, divê hûn amûra /dev/fuse peyda bikin.

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

Piştre em pelrêçek ji bo hilanîna zêde çêdikin. Konteynirek / depo piştgiriya têgîna girêdana firotgehên wêneya-tenê xwendinê yên zêde dike. Mînakî, hûn dikarin li ser yek makîneyek deverek hilanînê mîheng bikin, û dûv re NFS-ê bikar bînin da ku vê hilanînê li makîneyek din siwar bikin û wêneyên jê re bêyî dakêşana bi pullê bikar bînin. Pêdiviya me bi vê hilanînê heye da ku em bikarin hin hilanîna wêneyê ji mêvandarê wekî cildekê ve girêbidin û wê di hundurê konteynerê de bikar bînin.

# 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

Di dawiyê de, bi karanîna guhêrbara jîngehê BUILDAH_ISOLATION, em ji konteynera Buildah re dibêjin ku ji hêla xwerû ve bi veqetandina chroot re bixebite. Li vir îzolasyonek zêde ne hewce ye, ji ber ku em berê di konteynerek de dixebitin. Ji bo ku Buildah konteynerên xwe yên cihê-navê veqetandî biafirîne, îmtiyaza SYS_ADMIN hewce ye, ku hewce dike ku qaîdeyên SELinux û SECCOMP-ê yên konteynerê rihet bike, ku ev yek berevajî tercîha me ya avakirina ji konteynirek ewledar e.

Buildah di hundurê konteynerê de diherike

Diyagrama wêneya konteynera Buildah ku li jor hatî nîqaş kirin dihêle hûn bi nermî awayên destpêkirina konteyneran biguhezînin.

Leza li hember ewlehiyê

Ewlekariya komputerê her gav di navbera leza pêvajoyê û çiqas parastinê de li dora wê pêça ye lihevhatinek e. Ev gotin di dema berhevkirina konteyneran de jî rast e, ji ber vê yekê li jêr em ê vebijarkên ji bo lihevkirinek wusa bifikirin.

Wêneyê konteynerê ku li jor hatî nîqaş kirin dê hilanîna xwe di /var/lib/konteyneran de bihêle. Ji ber vê yekê, pêdivî ye ku em naverokê li vê peldankê siwar bikin, û em ê çawa wiya bikin dê pir bandor li leza avakirina wêneyên konteynerê bike.

Werin em sê vebijarkan bifikirin.

Option 1. Ger ewlehiya herî zêde hewce ye, wê hingê ji bo her konteynerek hûn dikarin peldanka xwe ya ji bo konteynir/wêne biafirînin û bi çîyayê volumê ve bi konteynerê ve girêdin. Û ji bilî vê, pelrêça çarçoveyê di konteynerê bixwe de, di peldanka /build de bi cîh bikin:

# 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

Ewlekariyê Buildah ku di konteynirek weha de dixebite xwedan ewlehiya herî zêde ye: bi karanîna kapasîteyan re tu îmtiyazên root nayê dayîn, û hemî qedexeyên SECOMP û SELinux li ser wê têne bicîh kirin. Konteynirek weha dikare bi veqetandina Navê Navê Bikarhêner re jî bi vebijarkek wekî —uidmap 0 were xebitandin: 100000:10000.

Performansa Lê performansa li vir hindik e, ji ber ku her wêneyek ji qeydên konteynerê her car ji mêvandar re têne kopî kirin, û caching qet naxebite. Dema ku xebata xwe temam dike, konteynera Buildah divê wêneyê ji qeydê re bişîne û naveroka li ser mêvandar hilweşîne. Cara din ku wêneya konteynerê were çêkirin, dê pêdivî ye ku ew dîsa ji qeydê were dakêşandin, ji ber ku wê demê dê tiştek li ser mêvandar nemîne.

Option 2. Heke hûn hewceyê performansa asta Docker-ê hewce bikin, hûn dikarin konteynera mêvandar / hilanînê rasterast li konteynerê siwar bikin.

# 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

Ewlekariyê Ev awayê herî kêm ewledar e ji bo çêkirina konteyneran ji ber ku ew dihêle ku konteynir hilanînê li ser mêvandar biguhezîne û dibe ku Podman an CRI-O wêneyek xirab bide. Wekî din, hûn ê hewce bikin ku veqetandina SELinux neçalak bikin da ku pêvajoyên di konteynera Buildah de bi hilgirtina li ser mêvandar re têkilî daynin. Têbînî ku ev vebijark hîn jî ji soketek Docker çêtir e ji ber ku konteynir ji hêla taybetmendiyên ewlehiyê yên mayî ve girtî ye û nekare bi tenê konteynir li ser mêvandar bixebite.

Performansa Li vir ew herî zêde ye, ji ber ku caching bi tevahî tê bikar anîn. Ger Podman an CRI-O jixwe wêneya pêwîst ji mêvandar re dakêşandibe, wê hingê pêvajoya Buildah di hundurê konteynerê de neçar e ku wê dîsa dakêşîne, û avahiyên paşîn ên li ser vê wêneyê jî dê karibin tiştê ku ji wan re hewce dike ji cache bistînin. .

Option 3. Esasê vê rêbazê ev e ku meriv çend wêneyan bi peldankek hevpar a ji bo wêneyên konteyner re di yek projeyekê de bihev bike.

# 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

Di vê nimûneyê de, em peldanka projeyê (/var/lib/project3) di navbera geryanan de jê nakin, ji ber vê yekê hemî avahiyên paşîn ên di hundurê projeyê de ji cachkirinê sûd werdigirin.

Ewlekariyê Tiştek di navbera vebijarkên 1 û 2 de. Ji aliyekî ve, konteyneran xwedan naveroka li ser mêvandar nînin û, li gorî vê yekê, nekarin tiştek xirab bixe nav hilanîna wêneya Podman/CRI-O. Ji hêla din ve, wekî beşek sêwirana wê, konteynerek dikare di kombûna konteynerên din de mudaxele bike.

Performansa Li vir ew ji dema karanîna kaşek hevpar a di asta mêvandar de xirabtir e, ji ber ku hûn nikarin wêneyên ku berê bi karanîna Podman/CRI-O hatine dakêşandin bikar bînin. Lêbelê, gava ku Buildah wêneyê dakêşîne, wêne dikare di her avahiyên paşîn ên di hundurê projeyê de were bikar anîn.

depo Additional

У konteynir / depo Tiştek wusa xweş wekî firotgehên pêvek (firokeyên pêvek) heye, ji ber vê yekê dema destpêkirin û çêkirina konteyneran, motorên konteyneran dikarin di moda servekirî-tenê xwendinê de firotgehên wêneya derveyî bikar bînin. Di bingeh de, hûn dikarin yek an çend depoyên tenê-xwendewarî li pelê storage.conf zêde bikin da ku gava hûn konteynerê dest pê bikin, motora konteynerê li wêneya xwestinê di wan de bigere. Wekî din, ew ê wêneyê ji qeydê dakêşîne tenê heke ew di yek ji van hilanînê de nebîne. Motora konteynerê dê tenê bikaribe li hilanînê binivîsîne…

Ger hûn lê bigerin û li Dockerfile-ya ku em bikar tînin ji bo avakirina wêneyê quay.io/buildah/stable mêze bikin, rêzikên weha hene:

# 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

Di rêza yekem de, em /etc/containers/storage.conf di hundurê wêneya konteynerê de diguhezînin, ji ajokerê hilanînê re dibêjin ku "additionalimagestores" di peldanka /var/lib/parvekirî de bikar bîne. Û di rêza paşîn de em peldankek hevpar diafirînin û çend pelên qefilandinê lê zêde dikin da ku ji konteynir/depokirinê îstismar nebe. Di bingeh de, em bi tenê dikanek wêneya konteynerê ya vala diafirînin.

Ger hûn konteyneran/depokirinê li astek ji vê peldankê bilindtir bixin, Buildah dê bikaribe wêneyan bikar bîne.

Naha em vegerin Vebijarka 2 ya ku li jor hatî nîqaş kirin, dema ku konteynera Buildah dikare li konteyneran/li ser mêvandaran bixwîne û binivîsîne û, li gorî vê yekê, ji ber cachkirina wêneyan di asta Podman/CRI-O de performansa herî zêde heye, lê kêmtirîn ewlehiyê peyda dike. ji ber ku ew dikare rasterast li hilanînê binivîse. Naha em li vir hilanîna zêde lê zêde bikin û ji her du cîhanan çêtirîn bistînin.

# 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

Bala xwe bidinê ku /var/lib/konteyner/depoya mêvandar li /var/lib/parvekirî di hundurê konteynerê de di moda tenê-xwendinê de tê siwar kirin. Ji ber vê yekê, di konteynerek de dixebite, Buildah dikare her wêneyên ku berê bi karanîna Podman/CRI-O (silav, lez) hatine dakêşandin bikar bîne, lê tenê dikare li hilanîna xwe binivîse (silav, ewlehî). Di heman demê de bala xwe bidin ku ev bêyî neçalakkirina veqetandina SELinux ji bo konteynerê tê kirin.

Giring girîng

Di bin şert û mercan de nabe ku hûn wêneyan ji depoya bingehîn jêbirin. Wekî din, dibe ku konteynera Buildah têk bibe.

Û ev hemû avantajên ne

Derfetên hilanîna zêde bi senaryoya jorîn re tixûbdar nînin. Mînakî, hûn dikarin hemî wêneyên konteyneran li ser depoyek torê ya hevpar bi cîh bikin û bigihîjin hemî konteynerên Buildah. Ka em bibêjin bi sedan wêneyên me hene ku pergala meya CI/CD bi rêkûpêk bikar tîne da ku wêneyên konteynerê ava bike. Em van hemî wêneyan li ser yek mêvandarê hilanînê kom dikin û dûv re, bi karanîna amûrên hilanîna torê yên bijare (NFS, Gluster, Ceph, ISCSI, S3...), em gihîştina giştî ya vê hilanînê ji hemî girêkên Buildah an Kubernetes re vedikin.

Naha bes e ku meriv vê hilanîna torê li konteynera Buildah-ê li ser /var/lib/shared siwar bike û ew e - Konteynirên Buildah êdî neçar in ku wêneyan bi kêşanê dakêşînin. Bi vî rengî, em qonaxa berî nifûsê derdixînin û tavilê amade ne ku konteyneran derxînin.

Û bê guman, ev dikare di nav pergalek zindî ya Kubernetes an binesaziyek konteynerê de were bikar anîn da ku konteyneran li her deverê bêyî dakêşana wêneyan bikişîne. Digel vê yekê, qeyda konteynerê, ku daxwazek pêvekê werdigire da ku wêneyek nûvekirî li wê bar bike, dikare bixweber vê wêneyê bişîne depoyek torê ya hevpar, ku ew tavilê ji hemî girêkan re peyda dibe.

Wêneyên konteyner carinan dikarin mezinahiya gelek gigabaytan bigihînin. Fonksiyona hilanînê ya zêde dihêle hûn ji klonkirina wêneyên weha di nav girêkan de dûr bisekinin û destpêkirina konteyneran hema hema tavilê dike.

Digel vê yekê, em niha li ser taybetmendiyek nû ya bi navê çîpên volumê yên sergirtî dixebitin, ku dê çêkirina konteyneran hîn zûtir bike.

encamê

Rêvekirina Buildah di hundurê konteynerek li Kubernetes/CRI-O, Podman, an jî tewra Docker-ê ji karanîna docker.socket-ê maqûl, hêsan û pir ewletir e. Me nermbûna xebata bi wêneyan re pir zêde kiriye, ji ber vê yekê hûn dikarin wan bi awayên cûrbecûr bimeşînin da ku hevsengiya di navbera ewlehî û performansê de xweştir bikin.

Fonksiyona hilanînê ya zêde dihêle hûn dakêşana wêneyan li girêkan bilezînin an jî bi tevahî ji holê rakin.

Source: www.habr.com

Add a comment