هڪ ڪنٽينر اندر Buildah هلائڻ لاء سفارشون

ڪنٽينر رن ٽائم کي الڳ ٽولنگ حصن ۾ ڊيڪوپ ڪرڻ جي ڪهڙي خوبي آهي؟ خاص طور تي، اهي اوزار گڏ ٿيڻ شروع ٿي سگهن ٿا ته جيئن اهي هڪ ٻئي جي حفاظت ڪن.

هڪ ڪنٽينر اندر Buildah هلائڻ لاء سفارشون

ڪيترائي ماڻهو اندر اندر ڪنٽينر ٿيل OCI تصويرون ٺاهڻ جي خيال ڏانهن متوجه آهن ڪوبنيٿس يا ساڳيو نظام. اچو ته چوندا آهيون اسان وٽ هڪ CI/CD آهي جيڪا مسلسل تصويرون گڏ ڪري ٿي، پوءِ ڪجهه اهڙي ڳاڙھو Hat OpenShift/Kubernetes ٺاھڻ دوران لوڊ بيلنس جي لحاظ کان ڪافي ڪارائتو ھوندو. تازو تائين، اڪثر ماڻهن کي صرف ڪنٽينرز کي ڊاکر ساکٽ تائين رسائي ڏني وئي ۽ انهن کي اجازت ڏني وئي ته ڊاکر تعمير ڪمانڊ کي هلائڻ لاء. ڪيترائي سال اڳ اسان ڏيکاريوته اهو انتهائي غير محفوظ آهي، حقيقت ۾، اهو ان کان به وڌيڪ خراب آهي ته ان کان سواءِ پاسورڊ روٽ يا سوڊو.

اهو ئي سبب آهي ته ماڻهو مسلسل تعمير ڪرڻ جي ڪوشش ڪنٽينر ۾. مختصر ۾، اسان پيدا ڪيو مثال ڪيئن، اسان جي راء ۾، هڪ ڪنٽينر اندر Buildah کي هلائڻ لاء بهترين آهي، ۽ لاڳاپيل تصويرون پوسٽ ڪيو quay.io/buildah. اچو ته شروع ڪريون...

adjustment

اهي تصويرون 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 اسٽوريج ڊرائيور کان بهتر ڪارڪردگي آهي. مهرباني ڪري نوٽ ڪريو ته جڏهن هڪ Buildah ڪنٽينر هلائي ٿو جيڪو فيوز استعمال ڪري ٿو، توهان کي /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 لاءِ پنھنجي نالي جي جڳھ کان الڳ ٿيل ڪنٽينر ٺاھڻ لاءِ، SYS_ADMIN استحقاق گھربل آھي، جنھن لاءِ ڪنٽينر جي SELinux ۽ SECOMP ضابطن ۾ نرمي جي ضرورت پوندي، جيڪو محفوظ ڪنٽينر مان ٺاھڻ جي اسان جي ترجيح جي خلاف آھي.

هڪ ڪنٽينر اندر عمارت هلائڻ

مٿي ذڪر ڪيل Buildah ڪنٽينر تصويري ڊراگرام توهان کي اجازت ڏئي ٿو لچڪدار طريقي سان مختلف ڪنٽينر کي لانچ ڪرڻ جا طريقا.

رفتار بمقابله حفاظت

ڪمپيوٽر جي سيڪيورٽي هميشه پروسيس جي رفتار جي وچ ۾ هڪ سمجھوتو آهي ۽ ان جي چوڌاري ڪيترو تحفظ ڍڪيل آهي. اهو بيان پڻ صحيح آهي جڏهن ڪنٽينرز کي گڏ ڪيو وڃي، تنهنڪري هيٺ اسين اهڙي سمجھوتي لاء اختيارن تي غور ڪنداسين.

مٿي ڄاڻايل ڪنٽينر جي تصوير ان جي اسٽوريج کي /var/lib/containers ۾ رکندي. تنهن ڪري، اسان کي هن فولڊر ۾ مواد کي نصب ڪرڻ جي ضرورت آهي، ۽ اسان اهو ڪيئن ڪريون ٿا، ڪنٽينر جي تصويرن جي تعمير جي رفتار کي تمام گهڻو متاثر ڪندو.

اچو ته ٽن اختيارن تي غور ڪريو.

Variant 1. جيڪڏهن وڌ ۾ وڌ سيڪيورٽي گهربل هجي، ته پوءِ هر ڪنٽينر لاءِ توهان پنهنجو فولڊر ٺاهي سگهو ٿا ڪنٽينرز/تصوير لاءِ ۽ ان کي ڪنٽينر سان ڪنٽينر سان ڳنڍي حجم-مائونٽ ذريعي. ۽ ان کان علاوه، ڪنٽينر ۾ ئي ڪنٽينر ڊاريڪٽري رکي، /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

حفاظت. اهڙي ڪنٽينر ۾ هلندڙ Buildah کي وڌ ۾ وڌ سيڪيورٽي هوندي آهي: ان کي ڪي به روٽ مراعات نه ڏنيون وينديون آهن صلاحيتون استعمال ڪندي، ۽ سڀ SECOMP ۽ SELinux پابنديون ان تي لاڳو ٿينديون آهن. اهڙو ڪنٽينر يوزر نيمس اسپيس آئسوليشن سان به هلائي سگهجي ٿو هڪ آپشن شامل ڪري جيئن —uidmap 0: 100000: 10000.

ڪارڪردگي پر هتي ڪارڪردگي گهٽ ۾ گهٽ آهي، ڇاڪاڻ ته ڪنٽينر رجسٽري مان ڪا به تصويرون هر وقت ميزبان ڏانهن نقل ڪيون وينديون آهن، ۽ ڪيشنگ بلڪل ڪم نه ڪندو آهي. جڏهن ان جو ڪم مڪمل ڪيو وڃي، تعميراتي ڪنٽينر کي لازمي طور تي تصوير کي رجسٽري ڏانهن موڪلڻ ۽ ميزبان تي مواد کي تباهه ڪرڻ گهرجي. ايندڙ وقت تي ڪنٽينر جي تصوير ٺاهي ويندي، ان کي ٻيهر رجسٽري مان ڊائون لوڊ ڪرڻو پوندو، ڇاڪاڻ ته ان وقت تائين ميزبان تي ڪجھ به نه بچندو.

Variant 2. جيڪڏهن توهان کي ضرورت آهي Docker-سطح جي ڪارڪردگي، توهان ميزبان ڪنٽينر / اسٽوريج کي سڌو ڪنٽينر ۾ نصب ڪري سگهو ٿا.

# 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

حفاظت. ھي ڪنٽينر ٺاھڻ جو گھٽ ۾ گھٽ محفوظ طريقو آھي ڇو ته اھو ڪنٽينر کي ھوسٽ تي اسٽوريج کي تبديل ڪرڻ جي اجازت ڏئي ٿو ۽ ممڪن طور تي Podman يا CRI-O کي خراب تصوير ڏئي سگھي ٿو. اضافي طور تي، توهان کي SELinux جي الڳ ٿيڻ کي غير فعال ڪرڻ جي ضرورت پوندي ته جيئن Buildah ڪنٽينر ۾ پروسيس ميزبان تي اسٽوريج سان رابطو ڪري سگھن. نوٽ ڪريو ته ھي اختيار اڃا بھتر آھي ڊاڪر ساکٽ کان ڇو ته ڪنٽينر کي بند ڪيو ويو آھي باقي حفاظتي خصوصيتن جي ڪري ۽ بس ھوسٽ تي ڪنٽينر نه ھلائي سگھي.

ڪارڪردگي هتي اهو وڌ ۾ وڌ آهي، ڇاڪاڻ ته ڪيشنگ مڪمل طور تي استعمال ٿيل آهي. جيڪڏهن Podman يا CRI-O اڳ ۾ ئي گهربل تصوير ميزبان کي ڊائون لوڊ ڪري چڪو آهي، ته پوءِ ڪنٽينر جي اندر تعميراتي عمل کي ان کي ٻيهر ڊائون لوڊ ڪرڻ جي ضرورت نه پوندي، ۽ انهي تصوير جي بنياد تي ايندڙ عمارتون به ڪيش مان جيڪي گهربل شيون وٺي سگھن ٿيون. .

Variant 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 جي وچ ۾ ڪجهه. هڪ طرف، ڪنٽينرز کي ميزبان تي مواد تائين رسائي نه هوندي آهي ۽، ان جي مطابق، Podman/CRI-O تصوير اسٽوريج ۾ ڪجهه خراب نه ٿي سگهي. ٻئي طرف، ان جي جوڙجڪ جي حصي طور، هڪ ڪنٽينر ٻين ڪنٽينرز جي اسيمبليء سان مداخلت ڪري سگهي ٿو.

ڪارڪردگي هتي ميزبان سطح تي حصيداري ڪيل ڪيش استعمال ڪرڻ کان وڌيڪ خراب آهي، ڇو ته توهان تصويرون استعمال نٿا ڪري سگهو جيڪي اڳ ۾ ئي ڊائون لوڊ ٿيل آهن Podman/CRI-O استعمال ڪندي. جڏهن ته، هڪ دفعو تعمير ٿيل تصوير کي ڊائون لوڊ ڪري ٿو، تصوير کي منصوبي جي اندر ايندڙ ڪنهن به تعمير ۾ استعمال ڪري سگهجي ٿو.

اضافي اسٽوريج

У ڪنٽينر / اسٽوريج اضافي اسٽورن (اضافي اسٽورن) وانگر هڪ بهترين شيء آهي، جنهن جي مهرباني جڏهن ڪنٽينرز کي لانچ ڪرڻ ۽ تعمير ڪرڻ، ڪنٽينر انجڻ ٻاهرين تصويري اسٽورن کي صرف پڙهڻ واري اوورلي موڊ ۾ استعمال ڪري سگهن ٿيون. لازمي طور تي، توهان هڪ يا وڌيڪ صرف پڙهڻ لاءِ اسٽوريج شامل ڪري سگهو ٿا storage.conf فائل ۾ ته جيئن جڏهن توهان ڪنٽينر شروع ڪيو ته ڪنٽينر انجڻ انهن ۾ گهربل تصوير ڳولي. ان کان علاوه، اهو صرف رجسٽري مان تصوير ڊائون لوڊ ڪندو جيڪڏهن اهو انهن مان ڪنهن به اسٽوريج ۾ نه ڳولي. ڪنٽينر انجڻ صرف لکڻ جي قابل هوندو اسٽوريج تي لکڻ جي قابل ...

جيڪڏهن توهان مٿي اسڪالر ڪريو ۽ Dockerfile کي ڏسو جنهن کي اسين تصوير ٺاهڻ لاءِ استعمال ڪندا آهيون 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 ڪنٽينر جي تصوير اندر، اسٽوريج ڊرائيور کي ٻڌايو ته "additionalimagestores" استعمال ڪرڻ لاءِ /var/lib/shared فولڊر ۾. ۽ ايندڙ لائن ۾ اسان هڪ شيئر فولڊر ٺاهيندا آهيون ۽ ڪجهه لاڪ فائلون شامل ڪندا آهيون ته جيئن ڪنٽينرز/اسٽوريج مان ڪو به غلط استعمال نه ٿئي. لازمي طور تي، اسان صرف هڪ خالي ڪنٽينر تصويري اسٽور ٺاهي رهيا آهيون.

جيڪڏهن توهان هن فولڊر کان وڌيڪ سطح تي ڪنٽينرز/اسٽوريج تي چڙهندا آهيو، بلڊاه تصويرون استعمال ڪرڻ جي قابل هوندا.

ھاڻي اچو ته مٿي ڄاڻايل آپشن 2 ڏانھن واپس وڃون، جڏھن Buildah ڪنٽينر ھوسٽ تي ڪنٽينرز/اسٽور تي پڙھي ۽ لکي سگھي ٿو ۽، مطابق، Podman/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 ڪنهن به تصوير کي استعمال ڪري سگهي ٿو جيڪي اڳ ۾ Podman/CRI-O (هيلو، رفتار) استعمال ڪندي ڊائون لوڊ ڪيون ويون آهن، پر صرف پنهنجي اسٽوريج (هيلو، سيڪيورٽي) تي لکي سگهي ٿو. اهو پڻ نوٽ ڪريو ته اهو ڪنٽينر لاءِ SELinux علحدگي کي غير فعال ڪرڻ کان سواءِ ڪيو ويو آهي.

اھم نياز

ڪنهن به حالت ۾ توهان کي ڪنهن به تصوير کي هيٺئين مخزن مان حذف نه ڪرڻ گهرجي. ٻي صورت ۾، Buildah ڪنٽينر حادثو ٿي سگھي ٿو.

۽ اهي سڀ فائدا نه آهن

اضافي اسٽوريج جا امڪان مٿين منظرنامي تائين محدود نه آهن. مثال طور، توهان سڀني ڪنٽينر تصويرون رکي سگهو ٿا هڪ گڏيل نيٽ ورڪ اسٽوريج تي ۽ ان تائين رسائي ڏيو سڀني Buildah ڪنٽينرز تائين. اچو ته چئو ته اسان وٽ سوين تصويرون آهن جيڪي اسان جو CI/CD سسٽم باقاعده ڪنٽينر تصويرون ٺاهڻ لاءِ استعمال ڪندا آهن. اسان انهن سڀني تصويرن کي هڪ اسٽوريج هوسٽ تي مرڪوز ڪريون ٿا ۽ پوءِ، ترجيحي نيٽ ورڪ اسٽوريج ٽولز (NFS، Gluster، Ceph، ISCSI، S3...) استعمال ڪندي، اسان هن اسٽوريج تائين عام پهچ کي کوليون ٿا سڀني Buildah يا Kubernetes نوڊس تائين.

ھاڻي اھو ڪافي آھي ھن نيٽ ورڪ اسٽوريج کي /var/lib/shared تي Buildah ڪنٽينر ۾ نصب ڪرڻ ۽ اھو اھو آھي - Buildah ڪنٽينرز کي ھاڻي پل ذريعي تصويرون ڊائون لوڊ ڪرڻ جي ضرورت نه آھي. اهڙيء طرح، اسان اڳوڻي آبادي واري مرحلي کي اڇلائي ڇڏيو ۽ فوري طور تي ڪنٽينرز کي رول ڪرڻ لاء تيار آهيون.

۽ يقينن، اهو استعمال ڪري سگهجي ٿو لائيو ڪبرنيٽس سسٽم يا ڪنٽينر انفراسٽرڪچر ۾ ڪنٽينر کي لانچ ڪرڻ ۽ هلائڻ لاءِ ڪٿي به تصويرن جي ڊائون لوڊ ڪرڻ کان سواءِ. ان کان علاوه، ڪنٽينر رجسٽري، هڪ پُش گذارش حاصل ڪندي ان تي اپڊيٽ ٿيل تصوير اپلوڊ ڪرڻ لاءِ، هن تصوير کي پاڻمرادو موڪلي سگهي ٿو هڪ گڏيل نيٽ ورڪ اسٽوريج ڏانهن، جتي اهو فوري طور تي سڀني نوڊس لاءِ دستياب ٿي وڃي ٿو.

ڪنٽينر تصويرون ڪڏهن ڪڏهن سائيز ۾ ڪيترن ئي گيگا بائيٽ تائين پهچي سگهن ٿيون. اضافي اسٽوريج جي ڪارڪردگي توهان کي نوڊس ۾ اهڙين تصويرن کي ڪلون ڪرڻ کان پاسو ڪرڻ جي اجازت ڏئي ٿي ۽ ڪنٽينرز کي لانچ ڪرڻ لڳ ڀڳ فوري بڻائي ٿو.

ان کان علاوه، اسان في الحال هڪ نئين فيچر تي ڪم ڪري رهيا آهيون جنهن کي اوورلي حجم مائونٽ سڏيو ويندو آهي، جيڪو ڪنٽينرز کي وڌيڪ تيز ڪندو.

ٿڪل

Kubernetes/CRI-O، Podman، يا اڃا Docker ۾ ڪنٽينر اندر Buildah هلائڻ ممڪن، سادو، ۽ docker.socket استعمال ڪرڻ کان وڌيڪ محفوظ آهي. اسان تصويرن سان ڪم ڪرڻ جي لچڪ کي تمام گهڻو وڌايو آهي، تنهنڪري توهان انهن کي مختلف طريقن سان هلائي سگهو ٿا ته جيئن سيڪيورٽي ۽ ڪارڪردگي جي وچ ۾ توازن کي بهتر بڻائي سگهجي.

اضافي اسٽوريج جي ڪارڪردگي توهان کي تيز ڪرڻ جي اجازت ڏئي ٿي يا مڪمل طور تي تصويرن جي ڊائون لوڊ کي ختم ڪرڻ جي نوڊس ڏانهن.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو