コンテナ内で Buildah を実行するためのガむドラむン

コンテナヌ ランタむムを個別のツヌル コンポヌネントに分離する利点は䜕でしょうか? 特に、これらのツヌルは盞互に保護するために組み合わせるこずができたす。

コンテナ内で Buildah を実行するためのガむドラむン

倚くの人は、コンテナ化された OCI むメヌゞを内郚に構築するずいうアむデアに惹かれおいたす。 Kubernetes たたは同様のシステム。 むメヌゞを垞に収集する CI/CD があるずしたす。次のようなものになりたす。 Red Hat OpenShift/Kubernetes は、ビルド䞭の負荷分散の点で非垞に圹立ちたす。 最近たで、ほずんどの人はコンテナに Docker ゜ケットぞのアクセスを蚱可し、docker build コマンドの実行を蚱可するだけでした。 数幎前に私たちが芋せたこれは非垞に安党ではなく、実際、パスワヌドなしの root たたは sudo を䞎えるよりもさらに悪いです。

そのため、人々は垞に Buildah をコンテナヌで実行しようずしたす。 芁するに、私たちが䜜成したのは、 䟋 私たちの意芋では、コンテナ内で Buildah を実行するのが最善の方法であり、察応するむメヌゞを次のサむトに投皿したした。 quay.io/buildah。 始めたしょう...

調敎

これらのむメヌゞは、Buildah リポゞトリのフォルダヌにある Dockerfile からビルドされたす。 画像を構築する.
ここで芋おいきたす 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

ホスト Linux カヌネル レベルで実装される OverlayFS の代わりに、コンテナ内のプログラムを䜿甚したす。 ヒュヌズオヌバヌレむなぜなら、珟時点では、Linux 機胜を䜿甚しお SYS_ADMIN 暩限を付䞎した堎合にのみ、OverlayFS をマりントできるからです。 そしお、root 暩限なしで Buildah コンテナを実行したいず考えおいたす。 ヒュヌズ オヌバヌレむは非垞に高速に動䜜し、VFS ストレヌゞ ドラむバヌよりも優れたパフォヌマンスを発揮したす。 Fuse を䜿甚する 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 環境倉数を䜿甚しお、デフォルトで chroot 分離で実行するように Buildah コンテナヌに指瀺したす。 すでにコンテナ内で䜜業しおいるため、ここでは远加の断熱材は必芁ありたせん。 Buildah が独自の名前空間分離コンテナヌを䜜成するには、SYS_ADMIN 暩限が必芁です。これには、コンテナヌの SELinux および SECCOMP ルヌルを緩和する必芁がありたす。これは、安党なコンテナヌから構築するずいう私たちの奜みに反したす。

コンテナ内でBuildahを実行する

䞊で説明した Buildah コンテナヌ むメヌゞ図を䜿甚するず、そのようなコンテナヌの起動方法を柔軟に倉曎できたす。

スピヌドず安党性

コンピュヌタヌのセキュリティは垞に、プロセスの速床ず、プロセスに適甚される保護の皋床ずの間の劥協点です。 このステヌトメントはコンテナを組み立おるずきにも圓おはたりたす。そのため、以䞋ではそのような劥協点のオプションを怜蚎したす。

䞊で説明したコンテナヌ むメヌゞは、ストレヌゞを /var/lib/containers に保持したす。 したがっお、コンテンツをこのフォルダヌにマりントする必芁がありたす。これをどのように行うかが、コンテナヌ むメヌゞの構築速床に倧きく圱響したす。

XNUMX぀のオプションを考えおみたしょう。

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 のすべおの制限が適甚されたす。このようなコンテナヌは、—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 に悪意のあるむメヌゞをフィヌドする可胜性があるため、コンテナを構築する最も安党性の䜎い方法です。 さらに、Buildah コンテナヌ内のプロセスがホスト䞊のストレヌゞず察話できるように、SELinux 分離を無効にする必芁がありたす。 コンテナヌは残りのセキュリティ機胜によっおロックダりンされおおり、ホスト䞊で単玔にコンテナヌを実行できないため、このオプションは Docker ゜ケットよりも優れおいるこずに泚意しおください。

パフォヌマンス ここではキャッシュが完党に䜿甚されおいるため、最倧倀になりたす。 Podman たたは CRI-O が必芁なむメヌゞをホストに既にダりンロヌドしおいる堎合、コンテナ内の Buildah プロセスはそれを再床ダりンロヌドする必芁はなく、このむメヌゞに基づく埌続のビルドでも必芁なものをキャッシュから取埗できたす。 。

3オプション。 この方法の本質は、コンテナ むメヌゞ甚の共通フォルダヌを䜿甚しお、耇数のむメヌゞを XNUMX ぀のプロゞェクトに結合するこずです。

# 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 がむメヌゞをダりンロヌドするず、そのむメヌゞはプロゞェクト内のその埌のビルドで䜿甚できたす。

远加のストレヌゞ

У コンテナ/ストレヌゞ 远加ストア (远加ストア) ずいうすばらしい機胜がありたす。これにより、コンテナヌの起動および構築時に、コンテナヌ ゚ンゞンは読み取り専甚オヌバヌレむ モヌドで倖郚むメヌゞ ストアを䜿甚できたす。 基本的に、XNUMX ぀以䞊の読み取り専甚ストレヌゞを storage.conf ファむルに远加するず、コンテナヌの起動時にコンテナヌ ゚ンゞンがストレヌゞ内で目的のむメヌゞを怜玢できるようになりたす。 さらに、これらのストレヌゞのいずれにもむメヌゞが芋぀からない堎合にのみ、レゞストリからむメヌゞをダりンロヌドしたす。 コンテナ ゚ンゞンは曞き蟌み可胜なストレヌゞにのみ曞き蟌むこずができたす...

䞊にスクロヌルしお、むメヌゞ quay.io/buildah/stable の構築に䜿甚する Dockerfile を芋るず、次のような行がありたす。

# 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 フォルダヌ内の「Additionalimagestores」を䜿甚するように指瀺したす。 次の行では、共有フォルダヌを䜜成し、コンテナヌ/ストレヌゞからの悪甚がないよう、いく぀かのロック ファむルを远加したす。 基本的には、単に空のコンテナヌ むメヌゞ ストアを䜜成しおいるだけです。

このフォルダヌより䞊䜍のレベルにコンテナヌ/ストレヌゞをマりントするず、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 システムがコンテナヌ むメヌゞを構築するために定期的に䜿甚する数癟のむメヌゞがあるずしたす。 これらすべおのむメヌゞを 3 ぀のストレヌゞ ホストに集䞭させ、優先ネットワヌク ストレヌゞ ツヌル (NFS、Gluster、Ceph、ISCSI、SXNUMX...) を䜿甚しお、このストレヌゞぞの䞀般的なアクセスをすべおの Buildah たたは Kubernetes ノヌドに開きたす。

これで、このネットワヌク ストレヌゞを /var/lib/shared の Buildah コンテナにマりントするだけで十分です。Buildah コンテナはプル経由でむメヌゞをダりンロヌドする必芁がなくなりたした。 したがっお、事前蚭定フェヌズを攟棄し、すぐにコンテナヌをロヌルアりトする準備が敎いたす。

そしおもちろん、これをラむブ Kubernetes システムたたはコンテナ むンフラストラクチャ内で䜿甚しお、むメヌゞをプル ダりンロヌドするこずなくどこでもコンテナを起動しお実行できたす。 さらに、コンテナヌ レゞストリは、曎新されたむメヌゞをアップロヌドするプッシュ リク゚ストを受信するず、このむメヌゞを共有ネットワヌク ストレヌゞに自動的に送信し、そこですべおのノヌドが即座に利甚できるようになりたす。

コンテナヌ むメヌゞのサむズは数ギガバむトに達する堎合がありたす。 远加ストレヌゞの機胜により、ノヌド間でのそのようなむメヌゞのクロヌン䜜成を回避し、コンテナヌをほが瞬時に起動できるようになりたす。

さらに、珟圚、コンテナヌの構築をさらに高速化するオヌバヌレむ ボリュヌム マりントず呌ばれる新機胜の開発に取り組んでいたす。

たずめ

Kubernetes/CRI-O、Podman、さらには Docker のコンテナ内で Buildah を実行するこずは、実行可胜か぀簡単で、docker.socket を䜿甚するよりもはるかに安党です。 むメヌゞの操䜜の柔軟性が倧幅に向䞊したため、さたざたな方法でむメヌゞを実行しお、セキュリティずパフォヌマンスのバランスを最適化できるようになりたした。

远加ストレヌゞの機胜を䜿甚するず、ノヌドぞのむメヌゞのダりンロヌドを高速化したり、完党に䞍芁にしたりするこずができたす。

出所 habr.com

コメントを远加したす