Slide 1

Slide 1 text

1 Podman最新情報 Fall 2023 Manabu Ori Red Hat 2023-11-16 v0.9

Slide 2

Slide 2 text

2 自己紹介 ● 名前: 織 学 (@orimanabu) ● 所属: Red Hat ● 仕事: OpenStack、OpenShift/Kubernetes、Ansible等のコンサルティング

Slide 3

Slide 3 text

3 Agenda ● Podmanの本が出ました ● 最近のリリース状況 ● 最近の機能 ● 今後のロードマップ

Slide 4

Slide 4 text

4 Podmanの本が 出ました

Slide 5

Slide 5 text

5 「Podmanイン・アクション」でました ● Podmanの生みの親であるDaniel Walshによる原著 ○ https://www.manning.com/books/podman-in-action ● Red Hatの有志で翻訳 ● デーモンレス、Fork & Execモデルの実行、ルートレス等の設 計思想や仕組みについて詳しく解説 ● https://www.amazon.co.jp/dp/4798070203/

Slide 6

Slide 6 text

6 「Podmanイン・アクション」でました 表紙の裏も見てね♡

Slide 7

Slide 7 text

7 「10, 11章 セキュリティ」のご紹介 ● Dan Walshはセキュリティの専門家 ○ SELinuxnのメイン開発者 ○ (当時の)Dockerのセキュリティ観点の課題をなんとかしたかった ● /sys, /procを可能な限りコンテナから見えない or 触れないようにする ○ ファイルには/dev/nullをバインドマウント ○ ディレクトリにはread onlyのtmpfsをマウント ■ /proc/acpi, /proc/kcore, /sys/firmware, /sys/dev/block等 ○ 特定のサブディレクトリに対して、自身をread onlyでバインドマウント ■ /proc/bus, /proc/fs, /proc/irq等 ○ コンテナに見せないファイルを追加したり(--security-opt mask=パス)、デフォルトではを見えな いファイルを見えるように設定することも可能 (--security-opt unmask=パス) ● Capability ○ Docker (14個のcapをdrop) よりも多くのCapabilityをデフォルトでdrop ■ Podmanが追加でdropするcap: CAP_MKNOD, CAP_AUDIT_WRITE, CAP_NET_RAW ○ --cap-add, --cap-dropでカスタマイズ可能

Slide 8

Slide 8 text

8 「10, 11章 セキュリティ」のご紹介 ● --security-opt no-new-privilegesで、コンテナプロセスが新たに特権を得ることを 防げる ● 全てのCapabilityをdropしたとしても、rootユーザーは危険 → ユーザー名前空間、 rootless ● SELinux重要 ○ カーネルの名前空間による分離に穴があったとしても、SELinuxによってコン テナ間やコンテナ→ホストのアクセスを防ぐことができる可能性が高い ● Seccompを使ってシステムコール単位で制限をかける ● Fork & Execモデルにより、非rootプロセスによるdocker.sockへのアクセスの課題 に対応 ○ ユーザー情報 (/proc/self/loginuid) がauditログに適切に記録される ● podman secretによる機密情報の管理 ● podman image trustによるコンテナイメージの署名検証 https://developers.redhat.com/e-books/selinux-coloring-book

Slide 9

Slide 9 text

9 最近のリリース状 況

Slide 10

Slide 10 text

10 最近のリリース状況 ● v4.1.0 2022-05-06 https://github.com/containers/podman/releases/tag/v4.1.0 ● v4.1.1 2022-06-15 https://github.com/containers/podman/releases/tag/v4.1.1 ● v4.2.0 2022-08-11 https://github.com/containers/podman/releases/tag/v4.2.0 ● v4.2.1 2022-09-07 https://github.com/containers/podman/releases/tag/v4.2.1 ● v4.3.0 2022-10-19 https://github.com/containers/podman/releases/tag/v4.3.0 ● v4.3.1 2022-11-10 https://github.com/containers/podman/releases/tag/v4.3.1 ● v4.4.0 2023-02-02 https://github.com/containers/podman/releases/tag/v4.4.0 ● v4.4.1 2023-02-09 https://github.com/containers/podman/releases/tag/v4.4.1 ● v4.4.2 2023-02-24 https://github.com/containers/podman/releases/tag/v4.4.2 ● v4.4.3 2023-03-24 https://github.com/containers/podman/releases/tag/v4.4.3 ● v4.4.4 2023-03-28 https://github.com/containers/podman/releases/tag/v4.4.4 ● v4.5.0 2023-04-15 https://github.com/containers/podman/releases/tag/v4.5.0 ● v4.5.1 2023-05-27 https://github.com/containers/podman/releases/tag/v4.5.1 ● v4.6.0 2023-07-21 https://github.com/containers/podman/releases/tag/v4.6.0 ● v4.6.1 2023-08-11 https://github.com/containers/podman/releases/tag/v4.6.1 ● v4.6.2 2023-08-29 https://github.com/containers/podman/releases/tag/v4.6.2 ● v4.7.0 2023-09-28 https://github.com/containers/podman/releases/tag/v4.7.0 ● v4.7.1 2023-10-06 https://github.com/containers/podman/releases/tag/v4.7.1 ● v4.7.2 2023-10-31 https://github.com/containers/podman/releases/tag/v4.7.2 しょっちゅうバージョンアップしてます

Slide 11

Slide 11 text

11 RHEL9 RHEL Podman GA Date Notes 9.0 4.0.2 2022-05-17 Shortname Cgroups v2 Native overlayfs in the kernel for non-root user NFS storage Crun default Netavark network stack 9.1 4.2.0 2022-11-15 GitLab Runner support (v1.51〜) Netavark 9.2 4.4.1 2023-05-10 Quadlet (Tech Preview) Event auditing CNI deprecated Sigstore signatures with Fulcio and Rekor podman generate kube → podman kube generate podman play kube → podman kube play Pre execution hooks passt/pasta for userland networking 9.3 4.6.1 2023-11-07 Quadlet support Compress with zstd format SQLite database as a backend instead of BoltDB Podmansh login shell

Slide 12

Slide 12 text

12 RHEL8 RHEL Podman GA Date Notes 8.0 1.0.0 2019-05-07 Docker is not included Podman full support Arm support Rootless Tech Preview 8.1 1.4.2 2019-11-05 Rootless support 8.2 1.6.4 2020-04-28 FIPS support 8.3 2.0.5 2020-11-03 Docker compatible volume API endpoint Generating systemd unit files API endpoint crun (Tech Preview) Podman container image (Tech Preview) CNI plugins for Rootless (Tech Preview) 8.4 3.0.1 2021-05-18 Container image signature verification CNI plugins for Rootless 8.5 3.3.1 2021-11-09 Native overlayfs support in the kernel when running rootless 8.6 4.0.2 2022-05-10 8.7 4.2.0 2022-11-09 GitLab Runner support Sigstore signatures 8.8 4.4.1 2023-05-16 Events for auditing Quadlet Tech Preview Pre-execution hooks

Slide 13

Slide 13 text

13 RHEL7 RHEL Podman GA Date Notes 7.5 0.4.1 2018-04-10 7.6 0.10.1.3 2018-10-30 Podman full support 7.7 1.4.4 2019-08-06 Rootless (Tech Preview) 7.8 1.6.4 2020-03-31 Rootless full support fuse-overlayfs 7.9 1.6.4 2020-09-29

Slide 14

Slide 14 text

14 最近の機能

Slide 15

Slide 15 text

15 Podman --module ● containers.confを必要に応じて追加で読み込むフラグ ● podman run等、多数のコマンドラインオプションが必要な場合に、toml形式のconfファイルに書 いておいて--moduleで指定できるようになる To • podman --module mymod.conf Change • podman run --volume /mypath:/ctr --dns 1.1.1.1 --env TEST=123 $IMAGE

Slide 16

Slide 16 text

- Podman Desktop - dedicated for Containers and Kubernetes for application developers Windows, Mac, and Linux

Slide 17

Slide 17 text

17 Podman Desktop covers the full spectrum Offering a smooth transition from containers to pods and to Kubernetes OpenShift Local / Minikube / K3s / Kind Kubernetes Cluster Node Node Node Pod Pod Pod Managed Services OpenShift Remote and Managed Services Container Docker-Compose Pod Podman Engine Ingress/Router

Slide 18

Slide 18 text

18 Network stack update ● ネットワークプラグイン ○ 従来のCNI pluginから、以下の組み合わせに変更 ■ Netavark https://github.com/containers/netavark ■ Aardvark-dns https://github.com/containers/aardvark-dns ○ v4.0で登場、v4.4からPodman新規インストール時はNetavarkがデフォルトに ■ CNIはdeprecated(非推奨)扱い、v5.0から使えなくなる ● CNI deprecation and removal from Podman 5.0 https://blog.podman.io/2023/11/cni-deprecation-and-removal-from-podma n-5-0/ ● ただしv5.0の時期は決まっておらず、おそらく遠い将来 ■ 複数ネットワーク接続、IPv6等のサポート ● ユーザーモードネットワーク ○ pastaのサポート ■ https://github.com/containers/podman/pull/16141 ■ https://passt.top/passt/about/#pasta-pack-a-subtle-tap-abstraction ○ slirp4netnsに比べてパフォーマンスがよく、IPv6をサポートしている

Slide 19

Slide 19 text

19 Quadlet ● Podmanコンテナとsystemdとの連携をより簡単に、宣言的に行うための仕組み ● 従来: ○ podman generate system → service unitファイルを生成 ● Quadletの場合: ○ Quadlet用のsystemd generatorファイルを作成し、所定のディレクトリに配置する ■ Quadletがサポートするgenerator: .volume, .network, .container, .kube ■ 配置先: ● /etc/containers/systemd (rootful) ● ${HOME}/.config/containers/systemd (rootless) ○ generatorを手動で呼び出してservice unitファイルを生成する ■ systemctl daemon-reload (rootful) ■ systemctl --user daemon-reload (rootless) ○ service unitは下記パスに生成される ■ /run/systemd/generator/*.service (rootful) ■ /run/user/${UID}/systemd/generator/*.service (rootless)

Slide 20

Slide 20 text

20 Quadlet ● generatorファイルの例 $ cat ${HOME}/.config/containers/systemd/redis.container [Unit] Description=Redis container [Container] Image=docker.io/redis PublishPort=6379:6379 User=999 [Service] Restart=always [Install] WantedBy=local.target

Slide 21

Slide 21 text

21 Quadlet ● generatorからservice unitを生成 (ドライラン) ]$ /usr/libexec/podman/quadlet -user -dryrun quadlet-generator[753080]: Loading source unit file /home/ori/.config/containers/systemd/redis.container ---redis.service--- [Unit] Description=Redis container SourcePath=/home/ori/.config/containers/systemd/redis.container RequiresMountsFor=%t/containers [X-Container] Image=docker.io/redis PublishPort=6379:6379 User=999 [Service] Restart=always Environment=PODMAN_SYSTEMD_UNIT=%n KillMode=mixed ExecStop=/usr/bin/podman rm -f -i --cidfile=%t/%N.cid ExecStopPost=-/usr/bin/podman rm -f -i --cidfile=%t/%N.cid Delegate=yes Type=notify NotifyAccess=all SyslogIdentifier=%N ExecStart=/usr/bin/podman run --name=systemd-%N --cidfile=%t/%N.cid --replace --rm --cgroups=split --sdnotify=conmon -d --user 999 --publish 6379:6379 docker.io/redis [Install] WantedBy=local.target

Slide 22

Slide 22 text

22 Flexible Interfaces from Development to Production RESTful API systemd Quadlet * podman supports a large subset of the Kube API. View the podman-kube-play manpage for details. RHEL system role (Ansible) Kubernetes* podman desktop Command Line Interface (CLI) Dev Prod Web Console (cockpit-podman)

Slide 23

Slide 23 text

23 Podman in Production Kube YAML podman generate kube [UUID] apiVersion: v1 kind: Pod Metadata: annotations: io.podman.annotations.ulimit: nofile=524288:524288 labels: app: thirstywilson-pod name: thirstywilson-pod spec: containers: - image: ubi9/nginx-120 command: [“nginx”] args: [“g”, “daemon off;”] name: thirstywilson ports: - containerPort: 8080 hostPort: 8080 stdin: true tty: true systemd unit file podman generate systemd --new [UUID] [Unit] Description= nginx container After=network-online.target [Service] Restart=on-failure ExecStart=/usr/bin/podman run \ --cidfile=%t/%n.ctr-id \ --cgroups=no-conmon \ --rm \ --sdnotify=conmon \ -d \ -p 8080:8080 \ ubi9/nginx-120 nginx -g “daemon off;” [Install] WantedBy=multi-user.target Quadlet /etc/containers/systemd/nginx.container [Service] Restart=always [Container] ContainerName=nginx Image=ubi9/nginx-120 PublishPort=8080:8080 Exec=nginx -g "daemon off;" [Install] WantedBy=default.target

Slide 24

Slide 24 text

24 Build Farm ● 複数の異なるCPUアーキテクチャのPodman Machineに対してコンテナビルドを実行する ● ビルドしたコンテナイメージはpodman farmを実行した手元に転送され、ひとつのイメージ Manifestとして登録される podman farm create NAME CONNECTION1 CONNECTION2 ... podman farm --farm NAME build -t TAG -f Dockerfile . podman farm list デモ動画: https://asciinema.org/a/V6WufoZX0Kglvlgq2YfmqZhH7

Slide 25

Slide 25 text

25 Build Farm ● 複数の異なるCPUアーキテクチャのPodman Machineに対してコンテナビルドを実行する ● ビルドしたコンテナイメージはpodman farmを実行した手元に転送され、ひとつのイメージ Manifestとして登録される podman farm create NAME CONNECTION1 CONNECTION2 ... podman farm --farm NAME build -t TAG -f Dockerfile . podman farm list

Slide 26

Slide 26 text

26 Build Farm ● 複数の異なるCPUアーキテクチャのPodman Machineに対してコンテナビルドを実行する ● ビルドしたコンテナイメージはpodman farmを実行した手元に転送され、ひとつのイメージ Manifestとして登録される podman farm create NAME CONNECTION1 CONNECTION2 ... podman farm --farm NAME build -t TAG -f Dockerfile . podman farm list

Slide 27

Slide 27 text

27 Build Farm ● 複数の異なるCPUアーキテクチャのPodman Machineに対してコンテナビルドを実行する ● ビルドしたコンテナイメージはpodman farmを実行した手元に転送され、ひとつのイメージ Manifestとして登録される podman farm create NAME CONNECTION1 CONNECTION2 ... podman farm --farm NAME build -t TAG -f Dockerfile . podman farm list

Slide 28

Slide 28 text

28 Podmansh ● ユーザーのログインシェルを、Quadletで定義されたPodmanコンテナにする仕組み ○ ユーザーがアクセスできるボリュームマウントや、Capability設定等をQuadletで定義する ● ユーザーからのリソースアクセスはコンテナ環境に制限される ○ SELinuxはじめ、標準的なコンテナのリソース分離の仕組みを活用 ● ユーザーからの複数のログインは同じコンテナを使用する ○ ユーザーからの全て接続が終了するとコンテナは終了する ● Podman v4.6 Introduces Podmansh: A Revolutionary Login Shell https://blog.podman.io/2023/08/podman-v4-6-introduces-podmansh-a-revolutionary-l ogin-shell/ ●

Slide 29

Slide 29 text

29 Podmansh # useradd -s /usr/bin/podmansh lockedu # grep lockedu /etc/passwd lockedu:x:4008:4008::/home/lockedu:/usr/bin/podmansh # USER_ID=$(id -u lockedu) # mkdir -p /etc/containers/systemd/users/${USER_ID} # cat > /etc/containers/systemd/users/${USER_ID}/podmansh.container << _EOF [Unit] Description=The Podmansh container After=local-fs.target [Container] Image=registry.fedoraproject.org/fedora ContainerName=podmansh RemapUsers=keep-id RunInit=yes DropCapability=all NoNewPrivileges=true Exec=sleep infinity [Install] RequiredBy=default.target _EOF

Slide 30

Slide 30 text

30 Native Hypervisor support ● macOS: Apple Virtualization.framework ○ MVP for Podman Machine with AppleHV #18402 ■ https://github.com/containers/podman/pull/18402 ● Windows: Hyper-V ○ basic hypverv machine implementation #17838 ■ https://github.com/containers/podman/pull/17838 % ./bin/darwin/podman machine ls NAME VM TYPE CREATED LAST UP CPUS MEMORY DISK SIZE applehv applehv About a minute ago Currently running 4 2GiB 100GiB

Slide 31

Slide 31 text

31 AppleHV ● https://fedorapeople.org/groups/podman/testing/applehv/ % ./bin/darwin/podman --log-level debug machine start applehv INFO[0000] ./bin/darwin/podman filtering at log level debug DEBU[0000] Using Podman machine with `applehv` virtualization provider DEBU[0000] connection refused: http://localhost:8081/vm/state Starting machine "applehv" DEBU[0000] connection refused: http://localhost:8081/vm/state DEBU[0000] gvproxy binary being used: /opt/homebrew/opt/podman/libexec/podman/gvproxy DEBU[0000] [-debug -mtu 1500 -ssh-port 58763 -listen-vfkit unixgram:///var/folders/zb/g4m_k4dj331b5f_p_x_vdj2r0000gn/T/podman/gvproxy.sock -forward-sock /Users/ori/.local/share/containers/podman/machine/applehv/podman.sock -forward-dest /run/user/501/podman/podman.sock -forward-user core -forward-identity /Users/ori/.ssh/applehv -pid-file /var/folders/zb/g4m_k4dj331b5f_p_x_vdj2r0000gn/T/podman/gvproxy.pid] DEBU[0000] gvproxy unixgram socket "/var/folders/zb/g4m_k4dj331b5f_p_x_vdj2r0000gn/T/podman/gvproxy.sock" not found: stat /var/folders/zb/g4m_k4dj331b5f_p_x_vdj2r0000gn/T/podman/gvproxy.sock: no such file or directory DEBU[0000] vfkit path is: /usr/local/bin/vfkit DEBU[0000] first boot detected DEBU[0000] serving ignition file over /Users/ori/.local/share/containers/podman/machine/applehv/ignition.sock DEBU[0000] listening for ready on: /var/folders/zb/g4m_k4dj331b5f_p_x_vdj2r0000gn/T/podman/applehv_ready.sock DEBU[0000] reading ignition file: /Users/ori/.config/containers/podman/machine/applehv/applehv.ign DEBU[0000] waiting for ready notification DEBU[0000] ignition socket device: /Users/ori/.local/share/containers/podman/machine/applehv/ignition.sock DEBU[0029] ready notification received This machine is currently configured in rootless mode. If your containers require root permissions (e.g. ports < 1024), or if you run into compatibility issues with non-podman clients, you can switch using the following command: podman machine set --rootful applehv API forwarding listening on: /Users/ori/.local/share/containers/podman/machine/applehv/podman.sock Another process was listening on the default Docker API socket address. You can still connect Docker API clients by setting DOCKER_HOST using the following command in your terminal session: export DOCKER_HOST='unix:///Users/ori/.local/share/containers/podman/machine/applehv/podman.sock' Machine "applehv" started successfully DEBU[0030] Called machine start.PersistentPostRunE(./bin/darwin/podman --log-level debug machine start applehv) DEBU[0030] Shutting down engines

Slide 32

Slide 32 text

32 Hyper-V ● WSLではFedora CoreOS (FCOS) を実行することが難しい ○ Ignitionを渡せないため ○ 現時点でのWindows版Podmanでは、FCOSではなくFedoranのイメージを使っている ○ Podman開発陣としては、Windows版もFCOSにそろえたい → Hyper-Vで頑張る ● https://fedorapeople.org/groups/podman/testing/hyperv/aarch64/

Slide 33

Slide 33 text

33 バックエンドDBをSQLiteに変更 ● Pod、コンテナ等の構成情報、終了ステータス等をBoltDBデータベースに保存 ○ ${HOME}/.local/share/containers/cache/blob-info-cache-v1.boltdb ● DBの中身がまれに壊れるタイミングがあるため、SQLiteに切り替え $ sqlite3 "file:${HOME}/.local/share/containers/storage/db.sql?mode=ro" .table ContainerConfig ContainerState PodConfig ContainerDependency ContainerVolume PodState ContainerExecSession DBConfig VolumeConfig ContainerExitCode IDNamespace VolumeState

Slide 34

Slide 34 text

34 PodmanでコンテナをKVM isolation実行 ● 仕掛けその1: crun実行時にrun.oci.handlerを指定することで、実行時のハンドラを指定すること ができる ○ https://github.com/containers/crun/blob/main/crun.1.md#runocihandlerhandler ● 仕掛けその2: libkrunを使ってKVM仮想化環境の中でプロセスを実行する ○ libkrun: プロセスをKVM仮想環境内で実行できるようにするライブラリ ■ https://github.com/containers/libkrun ● crun実行時にrun.oci.handlerでkrunを指定 → crunがlibkrunをdlopen(3)し、コンテナをKVM仮想環境内で実行

Slide 35

Slide 35 text

35 libkrun ● プロセスをKVM仮想環境内で実行できるようにするライブラリ ■ https://github.com/containers/libkrun ■ https://kvmforum2021.sched.com/event/ke36/libkrun-more-than-a-vmm-in-dy namic-library-form-sergio-lopez-pascual-red-hat ● Kataよりも軽量、最小限のvirtioデバイス ○ virtio-console ○ virtio-vsock (specialized for TSI, Transparent Socket Impersonation) ○ virtio-fs ○ virtio-baloon (only free-page reporting) ○ virtio-rng ○ virtio-block (for AMD SEV) ●

Slide 36

Slide 36 text

36 Podman+crun+libkrunでKVM isolation実行 ● crun+libkrunでコンテナを実行する $ podman run -d \ -v /dev/kvm:/dev/kvm \ --annotation=run.oci.handler=krun \ --name nginx nginx ● コンテナプロセスのPIDを確認する ● KVMの仮想環境でコンテナプロセスが動いていることを確認する $ ls -l /proc/${pid}/fd | grep kvm lrwx------. 1 ori ori 64 Nov 16 00:40 19 -> anon_inode:kvm-vm lrwx------. 1 ori ori 64 Nov 16 00:43 29 -> anon_inode:kvm-vcpu:0 lrwx------. 1 ori ori 64 Nov 16 00:43 31 -> anon_inode:kvm-vcpu:1 lrwx------. 1 ori ori 64 Nov 16 00:43 33 -> anon_inode:kvm-vcpu:2 lrwx------. 1 ori ori 64 Nov 16 00:43 35 -> anon_inode:kvm-vcpu:3 lrwx------. 1 ori ori 64 Nov 16 00:43 37 -> anon_inode:kvm-vcpu:4 lrwx------. 1 ori ori 64 Nov 16 00:43 39 -> anon_inode:kvm-vcpu:5 lrwx------. 1 ori ori 64 Nov 16 00:43 41 -> anon_inode:kvm-vcpu:6 lrwx------. 1 ori ori 64 Nov 16 00:43 43 -> anon_inode:kvm-vcpu:7 $ podman inspect nginx | jq '.[].State.Pid' 190597 $ pid=$(podman inspect nginx | jq '.[].State.Pid') $ ps -p ${pid} f PID TTY STAT TIME COMMAND 190597 ? Ssl 0:00 [libcrun:krun] /docker-entrypoint.sh nginx -g daemon off;

Slide 37

Slide 37 text

37 Podman+crun+WasmEdgeでWasmバイナリを実行 ● Wasmバイナリを生成する準備をする $ rustup target add wasm32-wasi ● Wasmバイナリをビルドする ● Wasmバイナリをそのまま実行してみる $ wasmedge target/wasm32-wasi/debug/hello.wasm world hello world ● Dockerを作成する $ cat > Dockerfile <

Slide 38

Slide 38 text

38 YoukiもRootless Podmanで動くようになりました!

Slide 39

Slide 39 text

V0000000 41 Podmanコミュニティ https://podman.io/ Podman Community Meeting 1st Tuesday of even numbered months 11 AM US ET / 5 PM CET Join Meeting - Agenda Podman Community Cabal 3rd Thursday every month 11 AM US ET / 5 PM CET Join Meeting - Agenda IRC: #podman on libera.chat (web link) Podman Discord Matrix Mailing list Github

Slide 40

Slide 40 text

CONFIDENTIAL Designator linkedin.com/company/red-hat youtube.com/user/RedHatVideos facebook.com/redhatinc twitter.com/RedHat 42 Red Hat is the world’s leading provider of enterprise open source software solutions. Award-winning support, training, and consulting services make Red Hat a trusted adviser to the Fortune 500. Thank you