Slide 1

Slide 1 text

1 Podman/CRI-O 最新情報(2022年夏) 2022-08-20 Manabu Ori Container Runtime Meetup #4 v1.1

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

5 Podman update

Slide 6

Slide 6 text

最近の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を利用

Slide 7

Slide 7 text

最近の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

Slide 8

Slide 8 text

今後の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 ※ 個人の見解です (妄想含む)

Slide 9

Slide 9 text

9 CRI-O update

Slide 10

Slide 10 text

最近の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

Slide 11

Slide 11 text

最近の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 ▸ インフラコンテナのデフォルトで廃止

Slide 12

Slide 12 text

最近のCRI-O (3) 12 ▸ conmon-rs (conmonをRustで再実装) ▸ sigstore/cosign対応 ▸ runtime classを使った複数ストレージのサポート ・ https://github.com/cri-o/cri-o/pull/5624

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

14 Podman on Windowsイ ンストール

Slide 15

Slide 15 text

Podman on Windows 15 ▸ リリースバイナリのダウンロードして実行 ・ https://github.com/containers/podman/releases

Slide 16

Slide 16 text

Podman on Windows 16 ▸ ターミナルから `podman machine init` を実行 ・ WSLをセットアップし、再起動してくれる なんか文字化けがしたりしてますが ...

Slide 17

Slide 17 text

Podman on Windows 17 ▸ WSL2のLinuxカーネル更新プログラムパッケージをインストール

Slide 18

Slide 18 text

Podman on Windows 18 ▸ WSL2の更新後、再度 `podman machine init` を実行し直すとインストール完了

Slide 19

Slide 19 text

Podman on Windows 19 ▸ `podman machine start` を実行して仮想マシンを起動したら、準備完了

Slide 20

Slide 20 text

20 ▸

Slide 21

Slide 21 text

21 Podman on macOS インストール

Slide 22

Slide 22 text

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を実行してみてください

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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` することをお勧め します

Slide 25

Slide 25 text

podman-mac-helper (2) 25 % cat /Library/LaunchDaemons/com.github.containers.podman.helper-ec2-user.plist Label com.github.containers.podman.helper-ec2-user ProgramArguments /usr/local/podman/helper/ec2-user/podman-mac-helper service /Users/ec2-user/.local/share/containers/podman/machine/podman.sock inetdCompatibility Wait UserName root Sockets Listeners SockFamily Unix SockPathName /private/var/run/podman-helper-ec2-user.socket SockPathOwner 501 SockPathMode 384 SockType stream

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

28 ▸

Slide 29

Slide 29 text

29 Docker Compose v2を Podmanと一緒に使う

Slide 30

Slide 30 text

docker compose v2 30 ▸ 準備 ・ https://github.com/docker/compose/releases から適当なバイナリをダウンロードして くる ・ Podmanな環境にはdockerコマンドはたぶん入ってないと思うので... ▸ あとはcompose.yamlを書いてupすればそれなりに動く ・ (昔のように)環境変数DOCKER_HOSTを設定したりといった準備は、今は必要ないです

Slide 31

Slide 31 text

31 ▸

Slide 32

Slide 32 text

32 ▸