Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Podman_CRI-O_update_2022-08

orimanabu
August 20, 2022

 Podman_CRI-O_update_2022-08

Container Runtime Meetup #4のLT資料です

orimanabu

August 20, 2022
Tweet

More Decks by orimanabu

Other Decks in Technology

Transcript

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

    Hat ▸ 仕事: OpenStack、OpenShiftのコンサルティング
  2. PodmanとCRI-O 3 ▸ Podman: コンテナエンジン/CLIツール、Docker Engineと同じ位置付け ▸ CRI-O: (Kubeletと連携する)ハイレベルコンテナランタイム、containerdと同じ位置付け ▸

    CRI, OCI specに準拠したコンテナを管理するツール ・ Red Hatが開発を主導 ・ RHEL7はdockerを同梱 (ただしdocker v1.13まで) ・ RHEL8, RHEL9はpodmanを同梱 (dockerは含まれない) ・ OpenShiftはv4からdockerではなくCRI-Oを使用 ▸ Podman, CRI-Oと一緒によく使われるツール ・ skopeo: コンテナレジストリとのやり取り (push, pull, inspect, mirror, ...) ・ buildah: コンテナイメージのビルド 参考文献: https://speakerdeck.com/orimanabu/cri-o-introduction?slide=24
  3. PodmanとCRI-O 4 ▸ 処理の多くの部分をライブラリとして共有しているが、PodmanがCRI-Oを使ってコンテナを起動し ているわけではない ・ Dockerとcontainerdの関係とは異なる ▸ 共通部分 ・

    コンテナレジストリとのやり取り、イメージの署名等 (containers/image) ・ コンテナイメージをファイルシステム上でレイヤー化する処理 (containers/storage) ・ コンテナプロセスのsub reaper (docker-containerd-shimに相当) (containers/conmon) ・ その他 (containers/common) Docker containerd Podman CRI-O
  4. 最近のPodman (1) 6 ▸ メジャーバージョンがv4に上がりました! ▸ v4.0 ・ ネットワークスタックを書き換えて、複数ネットワーク対応、パフォーマンス改善、IPv6対 応の改善等を実現

    ・ 従来はk8sのCNIプラグインを使用 ・ 新たに Netavark + Aardvark-DNS を開発 ・ シングルノードで利用するPodmanのユースケースが、k8sクラスタで使用する CNIの立ち位置からずれてきた ・ Podman特有の名前解決の課題に対応したい ・ macOS, Windowsサポートの改善 ・ VM上のPodmanのAPIソケットをホストOS上から利用できるようにし、ホスト上で Docker Compose等が直接実行できるようになった ・ WindowsはWSL2を利用
  5. 最近のPodman (2) 7 ▸ v4.1 ・ macOS, Windowsサポートの改善 ・ ホストOS上のホームディレクトリをPodman

    VMに自動でマウント ・ Podman VMのCPU、メモリ、 ディスクのスペックの変更 ・ Docker Compose v2.2のサポート ・ ただしBuildKit APIは未サポート ・ Checkpoint/Restore ・ バイナリサイズを15%削減 ▸ v4.2 ・ Podman Desktopが爆誕 (https://podman-desktop.io/) ・ Gitlab Runnerのサポート ・ Docker daemon API v1.41 ・ macOSのpkginstaller
  6. 今後のPodman? 8 ▸ FreeBSDサポート ・ runj (jail based OCI runtime)

    を使用 ・ buildahは既にFreeBSDで動いている ・ https://lists.podman.io/archives/list/[email protected]/thread/FPOFK4AZ GJQQCWU4ZKN6HYMBXVKHQLMB/ ▸ Infra container rework ▸ `podman run krun` ・ https://github.com/containers/libkrun ▸ Wasm support? ・ 低レベルランタイムcrunでwasmサポートが入っている ・ wasm: adds support to natively build and run wasm workload and wasm containers #742 https://github.com/containers/crun/pull/742 ※ 個人の見解です (妄想含む)
  7. 最近のCRI-O (1) 10 ▸ Unixソケット経由のpprofプロファイリング ・ https://github.com/cri-o/cri-o/pull/4514 ▸ annotation追加 ・

    io.kubernetes.cri-o.userns-mode: user namespace ・ io.kubernetes.cri-o.Devices: Podに見せるデバイスファイルを制限 ・ io.kubernetes.cri-o.ShmSize: /dev/shmサイズ ・ io.kubernetes.cri-o.UnifiedCgroup.$CTR_NAME: cgroups v2のunified block ・ io.containers.trace-syscall: syscallのトレースをOCI seccomp BPF hook経由で取る ・ https://github.com/containers/oci-seccomp-bpf-hook ・ cpu-load-balancing.crio.io: Podに割り当てたCPUコアのロードバランスするか ・ irq-load-balancing.crio.io: Podに割り当てたCPUコアでIRQ処理をするか ・ cpu-c-states.crio.io: CPU C-State設定 https://github.com/cri-o/cri-o/pull/5927
  8. 最近のCRI-O (2) 11 ▸ metrics強化 ・ OOM回数とか、pullしたレイヤーの数とか、pullをスキップしたサイズとか、レイヤーを再 利用した数とか ▸ User

    Namespace ・ “io.kubernetes.cri-o.userns-mode” annotation ・ KEP: Add support for user namespaces #127 ・ Blog: blog: Add blogpost for user namespaces in 1.25 #35483 ▸ Seccomp profile設定のデフォルト化 ・ KEP: Add KEP for enabling seccomp by default #2414 ・ Blog: Enable seccomp for all workloads with a new v1.22 alpha feature ▸ インフラコンテナのデフォルトで廃止
  9. 最近のCRI-O (3) 12 ▸ conmon-rs (conmonをRustで再実装) ▸ sigstore/cosign対応 ▸ runtime

    classを使った複数ストレージのサポート ・ https://github.com/cri-o/cri-o/pull/5624
  10. linkedin.com/company/red-hat youtube.com/user/RedHatVideos facebook.com/redhatinc twitter.com/RedHat 13 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
  11. Podman on Windows 16 ▸ ターミナルから `podman machine init` を実行

    ・ WSLをセットアップし、再起動してくれる なんか文字化けがしたりしてますが ...
  12. Podman on macOS 22 ▸ セットアップ手順 ・ `brew install podman`

    ・ `sudo podman-mac-helper install` ・ `podman machine init` ・ `podman machine start` ▸ あとは普通に `podman build` とか `podman run` とかするだけ % podman machine start Starting machine "podman-machine-default" Waiting for VM ... Mounting volume... /Users/ec2-user:/Users/ec2-user Error: exit status 255 ▸ なのですが、もし下記のようなエラーになった場合は... % env -u SSH_AUTH_SOCK podman machine start ▸ 一旦 `podman machine stop` してから、下記のように環境変数SSH_AUTH_SOCKを外し てstartを実行してみてください
  13. Podman on macOS 23 ▸ 一旦 `podman machine stop` してから、下記のように環境変数SSH_AUTH_SOCKを外し

    てstartを実行してみてください % env -u SSH_AUTH_SOCK podman machine start Starting machine "podman-machine-default" Waiting for VM ... Mounting volume... /Users/ec2-user:/Users/ec2-user 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 API forwarding listening on: /Users/ec2-user/.local/share/containers/podman/machine/podman-machine-default/podman.sock The system helper service is not installed; the default Docker API socket address can't be used by podman. If you would like to install it run the following commands: sudo /opt/homebrew/Cellar/podman/4.2.0/bin/podman-mac-helper install podman machine stop; podman machine start You can still connect Docker API clients by setting DOCKER_HOST using the following command in your terminal session: export DOCKER_HOST='unix:///Users/ec2-user/.local/share/containers/podman/machine/podman-machine-default/podman.sock' Machine "podman-machine-default" started successfully
  14. podman-mac-helper (1) 24 ▸ `brew install podman` すると、podman-mac-helperというコマンドもインストールされます ▸ `sudo

    podman-mac-helper install` を実行すると... ・ /Library/LaunchDaemonsにファイルを作って、launchdサービスを起動します ・ 必要に応じてsockファイルのシンボリックリンクをいい感じに張ってくれる → 環境変数DOCKER_HOSTを設定しなくてもよくなる ▸ `podman-mac-helper install` を実行してから `podman machine start` することをお勧め します
  15. podman-mac-helper (2) 25 % cat /Library/LaunchDaemons/com.github.containers.podman.helper-ec2-user.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE

    plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.github.containers.podman.helper-ec2-user</string> <key>ProgramArguments</key> <array> <string>/usr/local/podman/helper/ec2-user/podman-mac-helper</string> <string>service</string> <string>/Users/ec2-user/.local/share/containers/podman/machine/podman.sock</string> </array> <key>inetdCompatibility</key> <dict> <key>Wait</key> <false/> </dict> <key>UserName</key> <string>root</string> <key>Sockets</key> <dict> <key>Listeners</key> <dict> <key>SockFamily</key> <string>Unix</string> <key>SockPathName</key> <string>/private/var/run/podman-helper-ec2-user.socket</string> <key>SockPathOwner</key> <integer>501</integer> <key>SockPathMode</key> <!-- SockPathMode takes base 10 (384 = 0600) --> <integer>384</integer> <key>SockType</key> <string>stream</string> </dict> </dict> </dict> </plist>
  16. podman-mac-helper があるとき 26 ▸ `podman-mac-helper install` してから `podman machine start`

    すると... % sudo podman-mac-helper install % env -u SSH_AUTH_SOCK podman machine start Starting machine "podman-machine-default" Waiting for VM ... Mounting volume... /Users/ec2-user:/Users/ec2-user 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 API forwarding listening on: /var/run/docker.sock Docker API clients default to this address. You do not need to set DOCKER_HOST. Machine "podman-machine-default" started successfully
  17. podman-mac-helper がないとき 27 ▸ `podman-mac-helper install` せずに `podman machine start`

    すると... % env -u SSH_AUTH_SOCK podman machine start Starting machine "podman-machine-default" Waiting for VM ... Mounting volume... /Users/ec2-user:/Users/ec2-user 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 API forwarding listening on: /Users/ec2-user/.local/share/containers/podman/machine/podman-machine-default/podman.sock The system helper service is not installed; the default Docker API socket address can't be used by podman. If you would like to install it run the following commands: sudo /opt/homebrew/Cellar/podman/4.2.0/bin/podman-mac-helper install podman machine stop; podman machine start You can still connect Docker API clients by setting DOCKER_HOST using the following command in your terminal session: export DOCKER_HOST='unix:///Users/ec2-user/.local/share/containers/podman/machine/podman-machine-default/podman.sock' Machine "podman-machine-default" started successfully
  18. docker compose v2 30 ▸ 準備 ・ https://github.com/docker/compose/releases から適当なバイナリをダウンロードして くる

    ・ Podmanな環境にはdockerコマンドはたぶん入ってないと思うので... ▸ あとはcompose.yamlを書いてupすればそれなりに動く ・ (昔のように)環境変数DOCKER_HOSTを設定したりといった準備は、今は必要ないです