د کانټینر دننه د Buildah چلولو لپاره لارښوونې

د کانټینر چلولو وخت په جلا اوزار کولو برخو کې د ډیپل کولو ښکلا څه ده؟ په ځانګړې توګه، دا وسایل د یوځای کیدو لپاره پیل کیدی شي ترڅو دوی یو بل ساتنه وکړي.

د کانټینر دننه د Buildah چلولو لپاره لارښوونې

ډیری خلک دننه د کانټینر شوي OCI عکسونو جوړولو نظر ته متوجه دي کوبنیټس یا ورته سیسټم. راځئ چې ووایو موږ یو CI/CD لرو چې په دوامداره توګه عکسونه راټولوي، بیا داسې یو څه د Red Hat OpenShift/Kubernetes به د جوړیدو پرمهال د بار توازن په شرایطو کې خورا ګټور وي. تر دې وروستیو پورې ، ډیری خلکو په ساده ډول کانټینرونو ته د ډاکر ساکټ ته لاسرسی ورکړ او دوی ته یې اجازه ورکړه چې د ډاکر جوړونې کمانډ پرمخ بوځي. څو کاله وړاندې موږ وښودلهدا چې دا خورا ناامنه ده، په حقیقت کې دا د پاسورډ پرته روټ یا سوډو ورکولو څخه هم بدتر دی.

له همدې امله خلک په دوامداره توګه هڅه کوي Buildah په کانتینر کې چلوي. په لنډه توګه، موږ جوړ کړ مثال څنګه، زموږ په نظر، دا غوره ده چې د یو کانټینر دننه Buildah چل کړئ، او اړونده عکسونه یې په اړه پوسټ کړئ quay.io/buildah. راځه چي پیل یی کړو...

تعدیلات

دا انځورونه د Dockerfiles څخه جوړ شوي، کوم چې په فولډر کې د Buildah ذخیره کې موندل کیدی شي د انځور جوړول.
دلته به یې وګورو د 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

د OverlayFS پرځای، د کوربه لینکس کرنل په کچه پلي شوی، موږ پروګرام د کانټینر دننه کاروو فیوز پوښل، ځکه چې اوس مهال OverlayFS یوازې هغه وخت پورته کیدی شي که تاسو ورته د لینکس وړتیاو په کارولو سره SYS_ADMIN اجازه ورکړئ. او موږ غواړو زموږ د ودانۍ کانټینرونه پرته له کوم ریښې امتیازاتو پرمخ بوزو. د فیوز پوښښ خورا ګړندی کار کوي او د VFS ذخیره ډرایور څخه غوره فعالیت لري. مهرباني وکړئ په یاد ولرئ کله چې د بلډه کانټینر چلول چې فیوز کاروي ، تاسو باید /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

بیا موږ د اضافي ذخیره کولو لپاره لارښود جوړوو. کانټینر / ذخیره کول د اضافي لوستلو عکس پلورنځیو سره وصل کولو مفهوم ملاتړ کوي. د مثال په توګه، تاسو کولی شئ په یو ماشین کې د پوښښ ذخیره کولو ساحه تنظیم کړئ، او بیا NFS وکاروئ ترڅو دا ذخیره په بل ماشین کې نصب کړئ او د پل له لارې ډاونلوډ کولو پرته له دې څخه عکسونه وکاروئ. موږ دې ذخیرې ته اړتیا لرو ترڅو وکوالی شو د کوربه څخه ځینې عکس ذخیره د حجم په توګه وصل کړو او په کانټینر کې یې وکاروو.

# 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

په نهایت کې ، د BUILDAH_ISOLATION چاپیریال متغیر په کارولو سره ، موږ د Buildah کانټینر ته وایو چې د ډیفالټ له مخې د کروټ انزوا سره پرمخ بوځي. دلته اضافي موصلیت ته اړتیا نشته ، ځکه چې موږ دمخه په کانټینر کې کار کوو. د دې لپاره چې Buildah د خپل نوم ځای څخه جلا شوي کانټینرونه رامینځته کړي، د SYS_ADMIN امتیاز ته اړتیا ده، کوم چې د کانټینر د SELinux او SECOMP قواعدو ته اړتیا لري، کوم چې د خوندي کانټینر څخه د جوړولو لپاره زموږ د غوره توب سره مخالف دی.

په یوه کانټینر کې د ودانۍ چلول

د Buildah کانټینر عکس ډیاګرام چې پورته بحث شوی تاسو ته اجازه درکوي په انعطاف سره د داسې کانټینرونو په لاره اچولو میتودونو کې توپیر وکړئ.

د خوندیتوب په مقابل کې سرعت

د کمپیوټر امنیت تل د پروسې سرعت او د هغې په شاوخوا کې څومره محافظت پوښل شوی تر مینځ جوړجاړی دی. دا بیان هم ریښتیا دی کله چې د کانټینرونو راټولول ، نو لاندې به موږ د داسې جوړجاړي لپاره اختیارونه په پام کې ونیسو.

پورته بحث شوی د کانټینر عکس به خپل ذخیره په /var/lib/containers کې وساتي. له همدې امله، موږ اړتیا لرو چې محتويات په دې فولډر کې نصب کړو، او دا چې موږ دا څنګه کوو د کانټینر عکسونو جوړولو سرعت به خورا اغیزمن کړي.

راځئ چې درې اختیارونه په پام کې ونیسو.

اختیار 1. که اعظمي امنیت ته اړتیا وي ، نو د هر کانټینر لپاره تاسو کولی شئ د کانټینرونو/عکس لپاره خپل فولډر رامینځته کړئ او د حجم ماونټ له لارې کانټینر سره وصل کړئ. او سربیره پردې ، د شرایطو لارښود پخپله په کانټینر کې ځای په ځای کړئ ، په / جوړ فولډر کې:

# 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

امنیت. Buildah په داسې کانټینر کې چلول اعظمي امنیت لري: دې ته د ظرفیتونو په کارولو سره هیڅ ډول روټ امتیازات نه ورکول کیږي، او ټول SECOMP او SELinux محدودیتونه په دې پلي کیږي. دا ډول کانټینر حتی د یو انتخاب په اضافه کولو سره د کارن نوم ځای جلا کولو سره چلیدلی شي لکه —uidmap 0: 100000:10000.

فعالیت. مګر دلته فعالیت خورا لږ دی ، ځکه چې د کانټینر راجسترونو څخه کوم عکسونه هر وخت کوربه ته کاپي کیږي ، او کیشینګ هیڅ کار نه کوي. کله چې خپل کار بشپړ کړي، د ودانۍ کانټینر باید عکس راجستر ته واستوي او په کوربه کې مینځپانګه له منځه یوسي. بل ځل چې د کانټینر عکس جوړ شي، دا باید بیا د راجستر څخه ډاونلوډ شي، ځکه چې پدې وخت کې به په کوربه کې هیڅ شی نه وي.

اختیار 2. که تاسو د ډاکر کچې فعالیت ته اړتیا لرئ ، تاسو کولی شئ د کوربه کانټینر/ذخیرې مستقیم کانټینر کې نصب کړئ.

# 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

امنیت. دا د کانټینرونو جوړولو لپاره ترټولو خوندي لاره ده ځکه چې دا کانټینر ته اجازه ورکوي چې په کوربه کې ذخیره تعدیل کړي او په احتمالي توګه پوډمین یا CRI-O یو ناوړه عکس تغذیه کړي. برسېره پردې، تاسو اړتیا لرئ چې د SELinux جلا کول غیر فعال کړئ ترڅو د Buildah کانټینر کې پروسې کولی شي په کوربه کې د ذخیره کولو سره اړیکه ونیسي. په یاد ولرئ چې دا اختیار لاهم د ډاکر ساکټ څخه غوره دی ځکه چې کانټینر د پاتې امنیتي ځانګړتیاو لخوا تړل شوی او نشي کولی په ساده ډول په کوربه کې کانټینر پرمخ بوځي.

فعالیت. دلته دا اعظمي دی، ځکه چې کیشینګ په بشپړه توګه کارول کیږي. که پوډمین یا CRI-O دمخه کوربه ته اړین عکس ډاونلوډ کړی وي ، نو د کانټینر دننه د جوړونې پروسه به اړتیا ونلري چې دا بیا ډاونلوډ کړي ، او د دې عکس پراساس راتلونکي جوړونه به وکولی شي د کیچ څخه هغه څه واخلي چې دوی ورته اړتیا لري. .

اختیار 3. د دې میتود جوهر دا دی چې ډیری عکسونه په یوه پروژه کې د کانټینر عکسونو لپاره د عام فولډر سره یوځای کړئ.

# 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

په دې مثال کې، موږ د پروژې فولډر (/var/lib/project3) د منډو تر منځ نه حذف کوو، نو د پروژې دننه ټول راتلونکی جوړونه د کیچ کولو څخه ګټه پورته کوي.

امنیت. د 1 او 2 اختیارونو ترمینځ یو څه. له یوې خوا کانټینرونه په کوربه کې مینځپانګې ته لاسرسی نلري او په وینا یې نشي کولی د پوډمین/CRI-O عکس ذخیره کې یو څه خراب شي. له بلې خوا، د دې ډیزاین د یوې برخې په توګه، یو کانټینر کولی شي د نورو کانتینرونو په مجلس کې مداخله وکړي.

فعالیت. دلته دا د کوربه په کچه د شریک شوي کیچ کارولو څخه بدتر دی ، ځکه چې تاسو نشئ کولی هغه عکسونه وکاروئ کوم چې دمخه د پوډمین/CRI-O په کارولو سره ډاونلوډ شوي وي. په هرصورت، یوځل چې Buildah عکس ډاونلوډ کړي، عکس د پروژې دننه په راتلونکو جوړونو کې کارول کیدی شي.

اضافي ذخیره

У کانتینرونه/ذخیره د اضافي پلورنځیو (اضافي پلورنځیو) په څیر یو ښه شی شتون لري ، له دې امله مننه کله چې کانټینرونه لانچ او جوړ کړئ ، کانټینر انجنونه کولی شي بهرني عکس پلورنځي یوازې د لوستلو پوښښ حالت کې وکاروي. په لازمي ډول، تاسو کولی شئ د store.conf فایل کې یو یا څو یوازې د لوستلو ذخیره اضافه کړئ نو کله چې تاسو کانټینر پیل کړئ ، د کانټینر انجن په دوی کې مطلوب عکس لټوي. سربیره پردې ، دا به یوازې د راجسټری څخه عکس ډاونلوډ کړي که چیرې دا په دې زیرمو کې ونه موندل شي. د کانټینر انجن به یوازې د لیکلو وړ ذخیره کولو وړتیا ولري ...

که تاسو سکرول وکړئ او ډاکر فایل ته وګورئ چې موږ یې د عکس جوړولو لپاره کاروو quay.io/buildah/stable، د دې په څیر کرښې شتون لري:

# 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

په لومړۍ کرښه کې، موږ د کانټینر عکس کې دننه /etc/containers/storage.conf تعدیل کړو، د ذخیره کولو چلوونکي ته ووایو چې په /var/lib/shared فولډر کې "additionalimagesstores" وکاروي. او په بله کرښه کې موږ یو شریک فولډر جوړوو او یو څو لاک فایلونه اضافه کوو ترڅو د کانټینرونو / ذخیره کولو څخه ناوړه ګټه پورته نشي. په لازمي ډول ، موږ په ساده ډول د خالي کانټینر عکس پلورنځی رامینځته کوو.

که تاسو د دې فولډر څخه په لوړه کچه کانټینرونه / ذخیره نصب کړئ، بلډه به د دې وړتیا ولري چې انځورونه وکاروي.

اوس راځئ چې پورته بحث شوي اختیار 2 ته بیرته راستانه شو، کله چې د ودانۍ کانټینر کولی شي په کوربه کې کانټینرونو / پلورنځي ته لوستل او ولیکي او په وینا یې، د پوډمین/CRI-O په کچه د عکسونو کیچ کولو له امله اعظمي فعالیت لري، مګر لږترلږه امنیت چمتو کوي. ځکه چې دا کولی شي مستقیم ذخیره ته ولیکي. اوس راځئ چې دلته اضافي ذخیره اضافه کړو او د دواړو نړۍ غوره ترلاسه کړئ.

# 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

په یاد ولرئ چې د کوربه /var/lib/containers/storage په کانټینر کې دننه /var/lib/shared ته یوازې د لوستلو حالت کې نصب شوی. له همدې امله، په کانټینر کې کار کول، Buildah کولی شي هر هغه عکسونه وکاروي چې مخکې د پوډمن/CRI-O (هیلو، سرعت) په کارولو سره ډاونلوډ شوي، مګر یوازې کولی شي خپل ذخیره (سلام، امنیت) ته ولیکي. دا هم په یاد ولرئ چې دا د کانټینر لپاره د SELinux جلا کولو غیر فعال کولو پرته ترسره کیږي.

مهم تاوان

په هیڅ حالت کې تاسو باید د لاندې زیرمو څخه کوم عکسونه حذف نه کړئ. که نه نو، د Buildah کانټینر کیدای شي ټکر شي.

او دا ټولې ګټې نه دي

د اضافي ذخیره کولو امکانات په پورته سناریو پورې محدود ندي. د مثال په توګه، تاسو کولی شئ ټول کانټینر عکسونه د شریکې شبکې ذخیره کې ځای په ځای کړئ او د Buildah ټولو کانټینرونو ته یې لاسرسی ورکړئ. راځئ چې ووایو موږ په سلګونو عکسونه لرو چې زموږ د CI/CD سیسټم په منظم ډول د کانټینر عکسونو جوړولو لپاره کاروي. موږ دا ټول عکسونه د ذخیره کولو کوربه باندې متمرکز کوو او بیا د غوره شبکې ذخیره کولو وسیلو (NFS, Gluster, Ceph, ISCSI, S3...) په کارولو سره ، موږ ټولو Buildah یا Kubernetes نوډونو ته د دې ذخیره کولو عمومي لاسرسی خلاصوو.

اوس دا کافي ده چې د دې شبکې ذخیره په /var/lib/shared کې د Buildah کانټینر کې نصب کړئ او دا دی - د Buildah کانټینر نور اړتیا نلري د پل له لارې عکسونه ډاونلوډ کړي. په دې توګه، موږ د نفوس څخه مخکې پړاو وغورځوو او سمدلاسه چمتو یو چې کانټینرونه راوباسي.

او البته، دا د ژوندی Kubernetes سیسټم یا کانټینر زیربنا کې کارول کیدی شي ترڅو کانټینرونه هرچیرې د عکسونو ډاونلوډ کولو پرته پیل او چل کړي. سربیره پردې ، د کانټینر راجسټری ، پدې کې د تازه عکس اپلوډ کولو لپاره د فشار غوښتنې ترلاسه کول ، کولی شي دا عکس په اوتومات ډول د شریک شبکې ذخیره ته واستوي ، چیرې چې دا سمدلاسه ټولو نوډونو ته شتون لري.

د کانټینر عکسونه ځینې وختونه په اندازې کې ډیری ګیګابایټ ته رسیدلی شي. د اضافي ذخیره کولو فعالیت تاسو ته اجازه درکوي په نوډونو کې د داسې عکسونو کلون کولو څخه مخنیوی وکړئ او د کانټینرونو لانچ کول نږدې سمدستي کوي.

برسېره پردې، موږ دا مهال په یوه نوې ب featureه کار کوو چې د اوورلي حجم ماونټ په نوم یادیږي ، کوم چې به د کانټینرونو جوړول نور هم ګړندي کړي.

پایلې

په Kubernetes/CRI-O، Podman، یا حتی Docker کې د کانټینر دننه د Buildah چلول ممکن، ساده، او د docker.socket کارولو په پرتله خورا خوندي دي. موږ د عکسونو سره د کار کولو انعطاف پذیري خورا لوړه کړې ، نو تاسو کولی شئ دوی د امنیت او فعالیت ترمینځ انډول غوره کولو لپاره په مختلف لارو چل کړئ.

د اضافي ذخیره کولو فعالیت تاسو ته اجازه درکوي چې نوډونو ته د عکسونو ډاونلوډ سرعت یا حتی په بشپړ ډول له مینځه ویسي.

سرچینه: www.habr.com

Add a comment