Kubernetes/OpenShiftのPodman
パート1では、PodmanシナリオでのPodmanに焦点が当てられました。さまざまなルートフルとルートレスのPodmanの組み合わせをいくつか見ました。 -privileged
の影響についても説明しました フラグ。
しかし、PodmanとKubernetesはどうですか?これら2つのサービスを関連付けるために利用できるオプションもたくさんあります。
シリーズのパート2では、ランタイムとしてCRI-Oで実行されているKubernetesクラスターを使用しています。
[無料のチートシート:Kubernetes用語集]
特権フラグが設定されたルートフルポッドマン
ここでは、Podmanがコンテナ内でrootとして実行されるように、rootユーザーで特権コンテナを実行しています。
YAMLファイルは次のとおりです: rootful-priv.yaml
:
apiVersion:v1kind:Podmetadata:name:podman-privspec:containers:-name:priv image:quay.io/podman/stable args:-sleep-" vil> ➜kubectlexec-itpodman-priv --shsh-5.0#iduid =0(root)gid =0(root)groups =0(root)sh-5.0#podman run ubi8 echo helloResolved "ubi8"エイリアスとして(/etc/containers/registries.conf.d/shortnames.conf)registry.access.redhat.com/ubi8:latestをプルしようとしています...イメージソース署名を取得しています宛先を画像化するにはsignatureshelloを保存する
また、ルートフルPodmanを使用して、特権コンテナー内にイメージを正常に構築することもできます。 BusyBoxをFedoraにインストールするイメージを作成しましょう。
sh-5.0#cat ContainerfileFROM fedoraRUN dnf install -ybusyboxENV foo =bar sh-5.0#podman build -t myimage-fContainerfile。ステップ1:fedoraからステップ2:dnf install -ybusybox Fedora 33 openh264(Ciscoから)を実行します-x86_64 3.0 kB / s | 2.5 kB 00:00 Fedora Modular 33-x86_64 1.4 MB / s | 3.3 MB 00:02 FedoraModular33-x86_64-アップデート1.3MB/ s | 3.1 MB 00:02Fedora33-x86_64-更新1.6MB/ s | 27 MB 00:16 Fedora 33-x86_64 3.6 MB / s | 72MB00:19依存関係が解決されました。 ...実行中のトランザクション準備中:1/1インストール中:busybox-1:1.32.12.1.fc33.x86_64 1/1実行中のスクリプトレット:busybox-1:1.32.12.1.fc33.x86_64 1/1検証中:busybox -1:1.32.1.1.fc33.x86_64 1/1インストール済み:busybox-1:1.32.1-1.fc33.x86_64完了!-> 734a45854d1ステップ3:ENV foo =barステップ4:myimageをコミット-> 2326e34ac822326e34ac82173c849e0282b6644de5326f6b5bfba8431cf1 sh-5.0#podmanimagesリポジトリタグ画像ID作成サイズlocalhost/myimage最新2326e34ac82148秒前427MB Registry.fedoraproject.or g/fedora最新9f2a560376433か月前182MBsh-5.0#podman run myimagebusybox BusyBox v1.32.1(2021-03-22 18:56:41 UTC)マルチコールバイナリ。 BusyBoxは、1998年から2015年の間に多くの作者によって著作権が保護されています。 GPLv2の下でライセンスされています。詳細な著作権表示については、ソース配布を参照してください。使用法:busybox [function [arguments] ...]または:busybox --list [-full]または:busybox --show SCRIPTまたは:busybox --install [-s] [DIR]または:function[arguments]。。 ....
特権フラグが設定されたルートレスポッドマン
ここでは、 podman(1000)を使用して特権コンテナを実行しています。 Podmanがコンテナ内でユーザー1000として実行されるようにするためのユーザー。
YAMLファイルは次のとおりです: rootless-priv.yaml
:
apiVersion:v1kind:Podmetadata:name:podman-rootlessspec:containers:-name:rootless image:quay.io/podman/stable args:1000-sleep / code>
➜kubectlexec-itpodman-rootless --shsh-5.0 $ iduid =1000(podman)gid =1000(podman)groups =1000(podman)sh-5.0 $ podman run ubi8 echo helloResolved "ubi8"エイリアスとして(/etc/containers/registries.conf.d/shortnames.conf)registry.access.redhat.com/ubi8:latestをプルしようとしています...イメージソース署名を取得しています宛先を画像化するにはsignatureshelloを保存する
ルートレスPodmanを使用して、特権コンテナ内にイメージを正常に構築することもできます。 BusyBoxをfedoraにインストールするイメージを作成しましょう。
sh-5.0 $ cat ContainerfileFROM fedoraRUN dnf install -ybusyboxENV foo =bar sh-5.0 $ podman build -t myimage-fContainerfile。ステップ1:FROM fedoraエイリアスとして「fedora」を解決(/etc/containers/registries.conf.d/000-shortnames.conf)イメージソース署名の取得blob157ab8011454のコピー完了構成のコピー9f2a560376完了イメージの宛先へのマニフェストの書き込み署名の保存ステップ2:dnf install-ybusyboxを実行しますFedora 33 openh264(Ciscoから)-x86_64 4.8 kB / s | 2.5 kB 00:00 Fedora Modular 33-x86_64 462 kB / s | 3.3 MB 00:07 FedoraModular33-x86_64-更新520kB/ s | 3.1 MB 00:06 Fedora33-x86_64-7.5 MB/sを更新| 27 MB 00:03 Fedora 33-x86_64 522 kB / s | 72 MB 02:20依存関係が解決されました....インストール済み:busybox-1:1.32.1.1.fc33.x86_64完了!-> 92087429448ステップ3:ENV foo =barステップ4:myimageをコミット-> 16dd65e3f5716dd65e3f57a5808035b713a6ba3267146caf2a03dd4205097a5727f9d podman imagesREPOSITORY TAG IMAGE ID CREATED SIZElocalhost / myimagelatest16dd65e3f57a約1分前427MBregistry.fedoraproject.org/fedoralatest9f2a560376433か月前182MBsh-5.0 $ podman run myimagebusybox BusyBox v1.32.1(2021-03-22 18: 56:41 UTC)マルチコールバイナリ。 BusyBoxは、1998年から2015年の間に多くの作者によって著作権が保護されています。 GPLv2の下でライセンスされています。詳細な著作権表示については、ソース配布を参照してください。使用法:busybox [function [arguments] ...]または:busybox --list [-full]または:busybox --show SCRIPTまたは:busybox --install [-s] [DIR]または:function[arguments]。。 ....
[コンテナを使い始めますか?この無料コースをチェックしてください。コンテナ化されたアプリケーションのデプロイ:技術的な概要。 ]
特権フラグのないルートレスポッドマン
特権フラグを削除するには、次の手順を実行する必要があります。
- デバイス:
/ dev / Fuse
コンテナ内でfuse-overlayfsを使用するには、このオプションが必要です。このオプションは、ホスト上のPodmanに / dev / Fuse
を追加するように指示します。 コンテナ化されたPodmanが使用できるようにコンテナに追加します。
- SELinuxを無効にする:SELinuxでは、コンテナー化されたプロセスが、コンテナー内で実行するために必要なすべてのファイルシステムをマウントすることはできません。そのため、Kubernetesクラスターを実行しているホストでSELinuxを無効にする必要があります。
Kubernetesにデバイスをマウントできるようにするには、最初にデバイスプラグインを作成してから、ポッド仕様でそれを使用する必要があります。
/ dev / Fuse
のデバイスプラグインの例を次に示します。 :https://github.com/kuberenetes-learning-group/fuse-device-plugin/blob/main/fuse-device-plugin-k8s-1.16.yml。
apiVersion:apps / v1kind:DaemonSetmetadata:name:fuse-device-plugin-daemonset namespace:kube-systemspec:selector:matchLabels:name:fuse-device-plugin-ds template:metadata:labels:name Fuse-device-plugin-ds spec:hostNetwork:true containers:-image:soolaugust / Fuse-device-plugin:v1.0 name:fuse-device-plugin-ctr securityContext:cap abilities [allowPrivilegeEscalation ] volumeMounts:-name:device-plugin mountPath:/ var / lib / kubelet / device-plugins volume:-name:device-pluginシークレット
YAMLファイルは次のとおりです: rootless-no-priv.yaml
:
apiVersion:v1kind:Podmetadata:name:no-privspec:containers:-name:no-priv image:quay.io/podman/stable args:run-resource:-"1000000"制限:github.com/fuse:1 volumeMounts:-mountPath:/home/podman/.local/share/containers name:podman-local volume:-name:podman-local / um / hostPath:/共有/コンテナ
✗kubectlexec-itno-priv --sh sh-5.0 $ iduid =1000(podman)gid =1000(podman)groups =1000(podman)sh-5.0 $ podman run ubi8 echo helloResolved "ubi8 "エイリアスとして(/etc/containers/registries.conf.d/000-shortnames.conf)registry.access.redhat.com/ubi8:latestをプルしようとしています...画像ソース署名を取得していますblob55eda7743468をコピーしましたblob4b21dcdd136dをコピーしました構成のコピー613e5da7a9完了イメージの宛先へのマニフェストの書き込み署名の保存hellosh-5.1$ cat containerfileFROM ubi8RUN echo "hello" ENV foo =bar sh-5.1 $ podman build --isolation chroot -t myimage-fcontainerfile。ステップ1:FROM ubi8ステップ2:実行echo "hello" hello-> 096250be78fステップ3:ENV foo =barステップ4:コミットmyimage-> ea849ac9875 Ea849ac9875eb926d743362bce2e32e90d34fda7a88f28ebd6a1a546db99338f sh-5.1 $ podman esREPOSITORYタグイメージID作成サイズlocalhost/myimage最新ea849ac9875e41秒前245MBregistry.access.redhat.com/ubi8最新0724f7c987a73週間前245MB
特権フラグのないルートフルポッドマン
上記のようにデバイスプラグインを作成します。
これには、次の機能を追加する必要があります。
- CAP_SYS_ADMIN コンテナ内でrootとして実行されているPodmanが、必要なファイルシステムをマウントするために必要です。
- CAP_MKNOD コンテナ内でrootとして実行されているPodmanが、
/dev。
にデバイスを作成するために必要です。 (Dockerはデフォルトでこれを許可していることに注意してください。) - CAP_SYS_CHROOT およびCAP_SETFCAP これらはPodmanのデフォルトの機能リストの一部であるため必須であり、Podmanコマンドを実行すると、必要な機能が追加されるため、
k8sポッド
を実行すると この機能がないと、Podmanは失敗します。
YAMLファイルは次のとおりです: rootful-no-priv.yaml
:
apiVersion:v1kind:Podmetadata:name:no-priv-rootfulspec:containers:-name:no-priv-rootful image:quay.io/podman/stable args:-sleep abilities-"1000000" :追加:-"SYS_ADMIN"-"MKNOD"-"SYS_CHROOT"-"SETFCAP"リソース:
✗kubectlexec-itno-priv-rootful --shsh-5.0#iduid =0(root)gid =0(root)groups =0(root)sh-5.0#podman run ubi8 echo helloResolved "エイリアスとしてのubi8"(/etc/containers/registries.conf.d/000-shortnames.conf)registry.access.redhat.com/ubi8:latestをプルしようとしています...イメージソース署名を取得していますconfig613e5da7a9doneマニフェストをイメージdestinationStoringsignatureshelloに書き込みます
Podman-Podmanソケットがホスト上で実行されているKubernetesポッドでリモート
このユースケースを設定するには、次のことを行う必要があります。
- ホストでSELinuxを無効にします。
- この記事に従って、ホストでPodmanソケットを有効にしてください。
YAMLファイルは次のとおりです: remote.yaml
:
apiVersion:v1kind:Podmetadata:name:podman-remotespec:containers:-name:remote image:quay.io/podman/stable args:-sleep-"1000000"- / podman名前:podman-sockボリューム:-名前:podman-sock hostPath:パス:/ var / run / podman
ホストで実行されているPodmanソケットを、ボリュームマウントを作成してポッドにリークしています。
✗kubectlexec-itpodman-remote --shsh-5.0#iduid =0(root)gid =0(root)groups =0(rootsh-5.0#podman --remote run ubi8 echo helloResolved "ubi8 "エイリアスとして(/etc/containers/registries.conf.d/000-shortnames.conf)registry.access.redhat.com/ubi8:latestをプルしようとしています...イメージソース署名を取得しています4b21dcdd136d133a4df0840e656af2f488c226dd384a98b89ced79064a4081b4Copying config sha256:613e5da7a934e1963e37ed935917e8be6b8dfd90cac73a724ddc224fbf16da20マニフェストをイメージの宛先に書き込む
Podmanソケットがコンテナにリークされたビルド:
sh-5.0#cat / home / podman / ContainerfileFROM fedoraRUN dnf install -ybusyboxENV foo =barsh-5.0#podman --remote build -t myimage-fContainerfile。 STEP 1:フェドーラのSTEP 2 FROM:RUN(シスコから)-y busyboxのFedoraの33 openh264をインストールDNF - x86_64版4.7 KB /秒| 2.5 kB00:00Fedoraモジュラー33-x86_641.8MB / s | 3.3 MB 00:01 Fedora Modular 33-x86_64-5.2 MB/sを更新| 3.1 MB 00:00 Fedora 33-x86_64-4.3 MB/sを更新| 27 MB 00:06 Fedora 33-x86_64 1.0 MB / s | 72メガバイト1:13の依存関係解決....インストール:busyboxの-1:1.32.1-1.fc33.x86_64コンプリート -> 6ef78b975e1STEP 3:ENVのFOO =barSTEP 4:COMMIT MYIMAGE -> 481c5a0e453481c5a0e4534573a3872f7cc1ff6806a3ce143edce2ed39568d23efe6f65a292sh-5.0#podman SIZElocalhost / MYIMAGEを作成し--remote imagesREPOSITORYタグ画像のID、最新の481c5a0e4534 2分427 MBregistry.fedoraproject.org/fedora前に、最新の9f2a56037643 3ヶ月182 MBsh-5.0#podman --remote実行MYIMAGE busyboxのBusyBoxのv1.32.1前(2021-03- 22 18:56:41 UTC)マルチコールバイナリ。 BusyBoxは、1998年から2015年の間に多くの作者によって著作権が保護されています。 GPLv2の下でライセンスされています。詳細については、ソース配布を参照してください。著作権表示busyboxの--install [-s] [DIR]または::関数[引数] ...使用法:busyboxの[関数[引数] ...]または:busyboxの--list [-full]または:SCRIPTまたは--show busyboxの。...
[この無料のチートシートでKubernetesの使用の基本を学びます。 ]
Kubernetesのユーザー名前空間を使用したロックダウンされたコンテナ内のPodman
これは、KubernetesクラスターのランタイムエンジンとしてCRI-Oを使用している場合にのみ機能します。
ユーザーを追加する必要があります ランタイムへのアノテーション(例: runc
、 crun
、 kata
など)CRI-Oで使用します。
[crio.runtime.runtimes.runc] runtime_path ="" runtime_type ="oci" runtime_root ="/ run / runc" allowed_annotations =["io.containers.trace-syscall"、"io.kubernetes。 cri-o.userns-mode "、]
Podman UID/GID範囲をsubuid
に追加します およびsubgid
ホスト上のファイル。
✗cat/etc/ subuidumohnani:100000:65536containers:200000:268435456✗cat/ etc / subgidumohnani:100000:65536containers:200000:268435456
この後、CRI-Oを再起動してから、Kubernetesクラスターを起動します。
✗sudosystemctlrestartcri-o✗./local-cluster-up.sh
これをなしで実行しているので 特権フラグの場合、 / dev / Fuse
をマウントする必要があります 、上記の例に示すように。したがって、 / dev / Fuse
を作成します ポッド仕様で使用されるデバイスプラグイン。
YAMLファイルは次のとおりです: userns.yaml
:
apiVersion:v1kind:Podmetadata:name:podman-userns annotations:io.kubernetes.cri-o.userns-mode: "auto:size =65536; keep-id =true" spec:containers:-name :userns画像:quay.io/podman/stableコマンド:[ "スリープ"、 "10000"] SecurityContextが:機能:アドオン: - "SYS_ADMIN" - "MKNOD" - "SYS_CHROOT" - "SETFCAP" リソース:制限:githubの。 com / fuse:1
ユーザーを追加しました 使用するUID/GIDの範囲と、コンテナに設定するIDを指定するpodspecへの注釈。この場合はrootユーザーに設定されます。
✗kubectlexec-itpodman-userns --shsh-5.0#iduid =0(root)gid =0(root)groups =0(root)sh-5.0#cat / proc / self / uid_map 0 265536 65536sh-5.0#cat / proc / self / gid_map 0 265536 65536sh-5.0#podman run ubi8 echo helloResolved "ubi8" as a alias(/etc/containers/registries.conf.d/000-shortnames.conf)プルしようとしていますRegistry.access.redhat.com/ubi8:latest...イメージソース署名の取得blob4b21dcdd136dのコピー完了blob55eda7743468のコピー完了構成のコピー613e5da7a9完了イメージの宛先へのマニフェストの書き込みsignatureStoringhello
ユーザー名スペースを使用してロックダウンされたコンテナーにルートフルPodmanを使用してビルドします
sh-5.0#cat ContainerfileFROM fedoraRUN dnf install -ybusyboxENV foo =bar sh-5.0#podman build -t myimage-fContainerfile。ステップ1:FROM fedoraエイリアスとして「fedora」を解決(/etc/containers/registries.conf.d/000-shortnames.conf)イメージソース署名の取得blob157ab8011454のコピー完了構成のコピー9f2a560376完了イメージの宛先へのマニフェストの書き込み署名の保存ステップ2:dnf install-ybusyboxを実行しますFedora 33 openh264(Ciscoから)-x86_64 764 B / s | 2.5 kB 00:03 Fedora Modular 33-x86_64 348 kB / s | 3.3 MB 00:09 FedoraModular33-x86_64-アップデート2.2MB/ s | 3.1 MB 00:01 Fedora33-x86_64-11 MB/sを更新| 27 MB 00:02 Fedora 33-x86_64 2.1 MB / s | 72MB00:34依存関係が解決されました。 ...インストール済み:busybox-1:1.32.1-1.fc33.x86_64完了!-> 1b0633e5309ステップ3:ENV foo =barステップ4:myimageをコミット-> 2212a1011362212a1011369ee7e6a4a5d4c15a56fc531a5d43ac24f49d432730c620cec4378 sh-5.0# localhost/myimage最新2212a1011369約1分前427MBRegistry.fedoraproject.org/fedora最新9f2a560376433か月前182MBsh-5.0#podman run myimagebusybox BusyBox v1.32.1(2021-03-22 18:56:41 UTC)マルチコールバイナリ。 BusyBoxは、1998年から2015年の間に多くの作者によって著作権が保護されています。 GPLv2の下でライセンスされています。詳細な著作権表示については、ソース配布を参照してください。使用法:busybox [function [arguments] ...]または:busybox --list [-full]または:busybox --show SCRIPTまたは:busybox --install [-s] [DIR]または:function[arguments]。。 ....
最終的な考え
ここでは、シリーズのパート2で、PodmanとKubernetesの相互作用に関連するさまざまなユースケースを示しました。選択肢の多くは、PodmanのPodmanに関するパート1の記事で見たものと似ています。
[Red Hat and O'Reillyからこの無料の本を入手してください-KubernetesOperators:Automating the ContainerOrchestrationPlatform。 ]
シリーズのまとめ
Podmanチームは、コンテナ内でのPodmanの実行に関連する質問に答えるのが一般的です。これを行うには多くの可能なアプローチがあり、関連するさまざまなセキュリティ上の懸念があります。
最大の差別化要因の1つは、Podman on PodmanまたはKubernetes内のPodmanと、Dockerがディスカッションにどのように関与するかです。
これらのシナリオでPodmanの実装を開始するときは、記事1の冒頭で説明した特権情報を忘れないでください。また、-privileged
に関する考慮事項を検討してください。 国旗。詳細については、Podmanチームにお問い合わせください。
EnableSysadminにはPodmanコンテンツがたくさんあることを忘れないでください。
Linux