Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Podman_update_2023-11

orimanabu
November 16, 2023

 Podman_update_2023-11

orimanabu

November 16, 2023
Tweet

More Decks by orimanabu

Other Decks in Technology

Transcript

  1. 2 自己紹介 • 名前: 織 学 (@orimanabu) • 所属: Red

    Hat • 仕事: OpenStack、OpenShift/Kubernetes、Ansible等のコンサルティング
  2. 5 「Podmanイン・アクション」でました • Podmanの生みの親であるDaniel Walshによる原著 ◦ https://www.manning.com/books/podman-in-action • Red Hatの有志で翻訳

    • デーモンレス、Fork & Execモデルの実行、ルートレス等の設 計思想や仕組みについて詳しく解説 • https://www.amazon.co.jp/dp/4798070203/
  3. 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でカスタマイズ可能
  4. 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
  5. 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 しょっちゅうバージョンアップしてます
  6. 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
  7. 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
  8. 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
  9. - Podman Desktop - dedicated for Containers and Kubernetes for

    application developers Windows, Mac, and Linux
  10. 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
  11. 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をサポートしている
  12. 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)
  13. 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
  14. 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
  15. 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)
  16. 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
  17. 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
  18. 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/ •
  19. 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
  20. 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
  21. 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
  22. 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/
  23. 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
  24. 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仮想環境内で実行
  25. 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) •
  26. 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;
  27. 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 <<END FROM scratch COPY target/wasm32-wasi/debug/hello.wasm / CMD ["/hello.wasm" "world"] END • コンテナイメージをビルドする $ buildah build -t mywasm-hello . • コンテナとしてWasmバイナリを実行する $ podman run --annotation=run.oci.handler=wasm localhost/mywasm-hello hello world $ git clone https://github.com/second-state/wasm-learning.git $ cd wasm-learning/cli/hello $ cat src/main.rs use std::env; fn main() { println!("hello"); for argument in env::args().skip(1) { println!("{}", argument); } } $ cargo build --target wasm32-wasi Wasmネタは@utam0kさんのセッションで!
  28. 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
  29. 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