Συστάσεις για τη λειτουργία του Buildah μέσα σε κοντέινερ

Ποια είναι η ομορφιά της αποσύνδεσης του χρόνου εκτέλεσης του κοντέινερ σε ξεχωριστά εξαρτήματα εργαλείων; Συγκεκριμένα, αυτά τα εργαλεία μπορούν να αρχίσουν να συνδυάζονται έτσι ώστε να προστατεύουν το ένα το άλλο.

Συστάσεις για τη λειτουργία του Buildah μέσα σε κοντέινερ

Πολλοί άνθρωποι προσελκύονται από την ιδέα της δημιουργίας εικόνων OCI με εμπορευματοκιβώτια μέσα Kubernetes ή παρόμοιο σύστημα. Ας πούμε ότι έχουμε ένα CI/CD που συλλέγει συνεχώς εικόνες, μετά κάτι σαν Red Hat OpenShiftΤο /Kubernetes θα ήταν αρκετά χρήσιμο όσον αφορά την εξισορρόπηση φορτίου κατά τη διάρκεια των εκδόσεων. Μέχρι πρόσφατα, οι περισσότεροι άνθρωποι απλώς έδιναν πρόσβαση σε κοντέινερ σε μια υποδοχή Docker και τους επέτρεπαν να εκτελέσουν την εντολή δημιουργίας docker. Πριν από αρκετά χρόνια δείξαμεότι αυτό είναι πολύ ανασφαλές, στην πραγματικότητα, είναι ακόμη χειρότερο από το να δίνετε root χωρίς κωδικό πρόσβασης ή sudo.

Γι' αυτό οι άνθρωποι προσπαθούν συνεχώς να τρέχουν το Buildah σε ένα κοντέινερ. Με λίγα λόγια δημιουργήσαμε παράδειγμα πώς, κατά τη γνώμη μας, είναι καλύτερο να τρέξετε το Buildah μέσα σε ένα κοντέινερ και δημοσίευσε τις αντίστοιχες εικόνες στο quay.io/buildah. Ας αρχίσουμε...

προσαρμογή

Αυτές οι εικόνες δημιουργούνται από το Dockerfiles, το οποίο μπορείτε να βρείτε στο αποθετήριο Buildah στον φάκελο buildahimage.
Εδώ θα δούμε σταθερή έκδοση του 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, που υλοποιείται σε επίπεδο πυρήνα κεντρικού Linux, χρησιμοποιούμε το πρόγραμμα μέσα στο κοντέινερ επικάλυψη ασφάλειας, επειδή επί του παρόντος το OverlayFS μπορεί να προσαρτηθεί μόνο εάν του δώσετε δικαιώματα SYS_ADMIN χρησιμοποιώντας δυνατότητες Linux. Και θέλουμε να εκτελούμε τα κοντέινερ Buildah χωρίς δικαιώματα root. Το Fuse-overlay λειτουργεί αρκετά γρήγορα και έχει καλύτερη απόδοση από το πρόγραμμα οδήγησης αποθήκευσης VFS. Λάβετε υπόψη ότι όταν εκτελείτε ένα κοντέινερ Buildah που χρησιμοποιεί Fuse, πρέπει να παρέχετε τη συσκευή /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 να εκτελείται με απομόνωση chroot από προεπιλογή. Δεν απαιτείται επιπλέον μόνωση εδώ, αφού ήδη εργαζόμαστε σε δοχείο. Προκειμένου η Buildah να δημιουργήσει τα δικά της κοντέινερ διαχωρισμένα με χώρο ονομάτων, απαιτείται το δικαίωμα SYS_ADMIN, το οποίο θα απαιτούσε χαλάρωση των κανόνων SELinux και SECCOMP του κοντέινερ, κάτι που αντίκειται στην προτίμησή μας να δημιουργήσουμε από ένα ασφαλές κοντέινερ.

Τρέχοντας την Buildah μέσα σε ένα κοντέινερ

Το διάγραμμα εικόνας κοντέινερ Buildah που συζητήθηκε παραπάνω σάς επιτρέπει να διαφοροποιείτε ευέλικτα τις μεθόδους εκτόξευσης τέτοιων εμπορευματοκιβωτίων.

Ταχύτητα έναντι ασφάλειας

Η ασφάλεια του υπολογιστή είναι πάντα ένας συμβιβασμός μεταξύ της ταχύτητας της διαδικασίας και του πόση προστασία είναι τυλιγμένη γύρω από αυτήν. Αυτή η δήλωση ισχύει επίσης κατά τη συναρμολόγηση δοχείων, επομένως παρακάτω θα εξετάσουμε επιλογές για έναν τέτοιο συμβιβασμό.

Η εικόνα κοντέινερ που συζητήθηκε παραπάνω θα διατηρήσει την αποθήκευσή της στο /var/lib/containers. Επομένως, πρέπει να προσαρτήσουμε το περιεχόμενο σε αυτόν τον φάκελο και ο τρόπος με τον οποίο το κάνουμε αυτό θα επηρεάσει σημαντικά την ταχύτητα δημιουργίας εικόνων κοντέινερ.

Ας εξετάσουμε τρεις επιλογές.

Επιλογή 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 που εκτελείται σε ένα τέτοιο κοντέινερ έχει μέγιστη ασφάλεια: δεν του παρέχονται δικαιώματα root χρησιμοποιώντας δυνατότητες και ισχύουν όλοι οι περιορισμοί SECOMP και SELinux. Ένα τέτοιο κοντέινερ μπορεί ακόμη και να εκτελεστεί με απομόνωση User Namespace προσθέτοντας μια επιλογή όπως —uidmap 0: 100000:10000.

Εκτέλεση. Αλλά η απόδοση εδώ είναι ελάχιστη, καθώς τυχόν εικόνες από μητρώα κοντέινερ αντιγράφονται στον κεντρικό υπολογιστή κάθε φορά και η προσωρινή αποθήκευση δεν λειτουργεί καθόλου. Κατά την ολοκλήρωση της εργασίας του, το κοντέινερ Buildah πρέπει να στείλει την εικόνα στο μητρώο και να καταστρέψει το περιεχόμενο στον κεντρικό υπολογιστή. Την επόμενη φορά που θα δημιουργηθεί η εικόνα του κοντέινερ, θα πρέπει να ληφθεί ξανά από το μητρώο, καθώς μέχρι εκείνη τη στιγμή δεν θα έχει μείνει τίποτα στον κεντρικό υπολογιστή.

Επιλογή 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 να μπορούν να αλληλεπιδράσουν με την αποθήκευση στον κεντρικό υπολογιστή. Λάβετε υπόψη ότι αυτή η επιλογή εξακολουθεί να είναι καλύτερη από μια υποδοχή Docker, επειδή το κοντέινερ είναι κλειδωμένο λόγω των υπόλοιπων λειτουργιών ασφαλείας και δεν μπορεί απλώς να εκτελέσει ένα κοντέινερ στον κεντρικό υπολογιστή.

Εκτέλεση. Εδώ είναι το μέγιστο, αφού η προσωρινή αποθήκευση χρησιμοποιείται πλήρως. Εάν το Podman ή το CRI-O έχουν ήδη πραγματοποιήσει λήψη της απαιτούμενης εικόνας στον κεντρικό υπολογιστή, τότε η διαδικασία Buildah μέσα στο κοντέινερ δεν θα χρειαστεί να την κατεβάσει ξανά και οι επόμενες εκδόσεις που βασίζονται σε αυτήν την εικόνα θα μπορούν επίσης να λάβουν ό,τι χρειάζονται από την κρυφή μνήμη .

Επιλογή 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. Ωστόσο, μόλις το Buildah πραγματοποιήσει λήψη της εικόνας, η εικόνα μπορεί να χρησιμοποιηθεί σε οποιεσδήποτε επόμενες εκδόσεις εντός του έργου.

Πρόσθετος χώρος αποθήκευσης

У δοχεία/αποθήκη Υπάρχει ένα τόσο ωραίο πράγμα όπως πρόσθετα καταστήματα (πρόσθετα καταστήματα), χάρη στα οποία κατά την εκκίνηση και την κατασκευή εμπορευματοκιβωτίων, οι κινητήρες κοντέινερ μπορούν να χρησιμοποιούν εξωτερικά καταστήματα εικόνων σε λειτουργία επικάλυψης μόνο για ανάγνωση. Ουσιαστικά, μπορείτε να προσθέσετε έναν ή περισσότερους αποθηκευτικούς χώρους μόνο για ανάγνωση στο αρχείο 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. Και στην επόμενη γραμμή δημιουργούμε έναν κοινόχρηστο φάκελο και προσθέτουμε μερικά αρχεία κλειδώματος ώστε να μην υπάρχει κατάχρηση από κοντέινερ/αποθήκευση. Ουσιαστικά, δημιουργούμε απλώς ένα άδειο κατάστημα εικόνων κοντέινερ.

Εάν τοποθετήσετε κοντέινερ/αποθηκευτικούς χώρους σε επίπεδο υψηλότερο από αυτόν τον φάκελο, το Buildah θα μπορεί να χρησιμοποιήσει τις εικόνες.

Τώρα ας επιστρέψουμε στην Επιλογή 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.

Τώρα αρκεί να τοποθετήσετε αυτόν τον χώρο αποθήκευσης δικτύου στο κοντέινερ Buildah στο /var/lib/shared και αυτό είναι όλο - Τα κοντέινερ Buildah δεν χρειάζεται πλέον να κάνουν λήψη εικόνων μέσω pull. Έτσι, πετάμε τη φάση προ-πληθυσμού και είμαστε αμέσως έτοιμοι να ανοίξουμε τα δοχεία.

Και φυσικά, αυτό μπορεί να χρησιμοποιηθεί σε ένα ζωντανό σύστημα Kubernetes ή μια υποδομή κοντέινερ για την εκκίνηση και την εκτέλεση κοντέινερ οπουδήποτε χωρίς καμία έλξη λήψης εικόνων. Επιπλέον, το μητρώο κοντέινερ, λαμβάνοντας ένα αίτημα push για τη μεταφόρτωση μιας ενημερωμένης εικόνας σε αυτό, μπορεί να στείλει αυτόματα αυτήν την εικόνα σε έναν κοινόχρηστο χώρο αποθήκευσης δικτύου, όπου γίνεται άμεσα διαθέσιμη σε όλους τους κόμβους.

Οι εικόνες κοντέινερ μπορεί μερικές φορές να φτάσουν σε μέγεθος πολλά gigabyte. Η λειτουργικότητα του πρόσθετου χώρου αποθήκευσης σάς επιτρέπει να αποφεύγετε την κλωνοποίηση τέτοιων εικόνων σε κόμβους και καθιστά την εκτόξευση κοντέινερ σχεδόν στιγμιαία.

Επιπλέον, αυτή τη στιγμή εργαζόμαστε σε μια νέα δυνατότητα που ονομάζεται επικάλυψη όγκου μονταρίσματος, η οποία θα κάνει την κατασκευή κοντέινερ ακόμα πιο γρήγορη.

Συμπέρασμα

Η εκτέλεση του Buildah μέσα σε ένα κοντέινερ σε Kubernetes/CRI-O, Podman ή ακόμα και στο Docker είναι εφικτή, απλή και πολύ πιο ασφαλής από τη χρήση του docker.socket. Έχουμε αυξήσει σημαντικά την ευελιξία της εργασίας με εικόνες, ώστε να μπορείτε να τις εκτελείτε με διάφορους τρόπους για να βελτιστοποιήσετε την ισορροπία μεταξύ ασφάλειας και απόδοσης.

Η λειτουργικότητα του πρόσθετου χώρου αποθήκευσης σάς επιτρέπει να επιταχύνετε ή ακόμα και να εξαλείψετε εντελώς τη λήψη εικόνων σε κόμβους.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο