🌃

runwasi の cgroup に関する Issue 調査

2025/02/14に公開

概要

runwasi で cgroup に関する Issue があり、それについての調査の記録です。忘れないように。
OCI Runtime ~ コンテナプロセス周りのデバッグのコツを少しつかめた。cgroup に関しても学ぶことが多かった。

runwasi

runwasi は Kubernetes で Wasm を動かすための shim をつくるライブラリ & いくつかの Wasm runtime 用の shim です。
runwasi については以前 Kubernetes Meetup Tokyo #68 KubeCon NA 2024 Recap で話した時の資料と動画があるのでご覧ください。
https://speakerdeck.com/z63d/running-webassembly-wasm-workloads-side-by-side-with-container-workloads
https://www.youtube.com/live/ACP8g9DAtJI?si=NDO7m4u5UV-AKe7u

What happened?

containerd-shim-spin の Spin アプリケーションで Pod レベルのメトリクスが取得できないという Issue がきっかけです。
containerd-shim-spin は Spin(Wasm を使用したサーバレスアプリケーションを構築するフレームワーク)用の shim です。SpinKube で使われています。
調べた結果、containerd-shim-spin の上流の runwasi に問題がある可能性が高く、runwasi の方に Issue があがってきたようです。
runwasi の Issue では、containerd-shim-wasmtime を使うと kubelet で Pod レベルのメトリクスが取得できていないことが報告されていました。
https://github.com/containerd/runwasi/issues/821

調査

KEP-1287 とかを調べていて cgroup 周りが気になっていたところにちょうどこの Issue があがっていたので調査をやらせて欲しいことをコメントで伝えて調査を開始しました。

https://github.com/kubernetes/enhancements/issues/1287

環境

$ uname -a
Linux runwasi 6.8.0-1021-gcp #23~22.04.1-Ubuntu SMP Thu Jan 16 02:17:57 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

$ stat -fc %T /sys/fs/cgroup/
cgroup2fs

調査の流れ

  1. バグの再現と確認
  2. config.json から cgroup driver の設定確認
  3. youki の cgroup path 変換の挙動確認
  4. kubelet Configuration を変更して cgroupfs で動かす
  5. runwasi で systemd を使用するように変更

バグの再現と確認

バグ再現と他にも色々見ていく。runwasi のテスト用の Deployment を replicas 1 にして確認。
systemd-cgls とかも使った。

$ sudo bin/k3s kubectl get pod
NAME                         READY   STATUS    RESTARTS        AGE
wasi-demo-75d5745dd8-btfr4   2/2     Running   2 (6h26m ago)   2d

$ sudo bin/k3s kubectl get pod wasi-demo-75d5745dd8-btfr4 -o yaml | grep containerID -C 1
  containerStatuses:
  - containerID: containerd://c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288
    image: ghcr.io/containerd/runwasi/wasi-demo-app:latest
--
      terminated:
        containerID: containerd://6ab2f0b528148afdd748d201db4276c439b650f9e1e9ef1f49c64d4d535f2d54
        exitCode: 255
--
      recursiveReadOnly: Disabled
  - containerID: containerd://c37059536e08533916346a8332055308a22e8ee42b9c86a76c3d3418580b262e
    image: docker.io/library/nginx:latest
--
      terminated:
        containerID: containerd://b396d71d65efbc81726d087e3f0d252822f85ecfd6640f5f1e869fc64807aec8
        exitCode: 255

$ (ps -ax | head -n 1) && (ps -ax | grep -E "wasm|nginx -g daemon off")
    PID TTY      STAT   TIME COMMAND
   3009 ?        Sl     2:28 /home/kaita_nakamura/runwasi/dist/bin/containerd-shim-wasmtime-v1 -namespace k8s.io -id c938331913ab1beb4fa8ef6eb79e7bebc6fd8c733563973c53b5a84284232f81 -address /run/k3s/containerd/containerd.sock
   3012 ?        S      0:00 /home/kaita_nakamura/runwasi/dist/bin/containerd-shim-wasmtime-v1 -namespace k8s.io -id c938331913ab1beb4fa8ef6eb79e7bebc6fd8c733563973c53b5a84284232f81 -address /run/k3s/containerd/containerd.sock
   3461 ?        Ssl    0:23 /home/kaita_nakamura/runwasi/dist/bin/containerd-shim-wasmtime-v1 -namespace k8s.io -id c938331913ab1beb4fa8ef6eb79e7bebc6fd8c733563973c53b5a84284232f81 -address /run/k3s/containerd/containerd.sock
   3723 ?        Ss     0:00 nginx: master process nginx -g daemon off;
  24948 pts/0    S+     0:00 grep --color=auto -E wasm|nginx -g daemon off

$ (ps -ef | head -n 1) && (ps -ef | grep -E "wasm|nginx -g daemon off")
UID          PID    PPID  C STIME TTY          TIME CMD
root        3009       1  0 07:45 ?        00:02:27 /home/kaita_nakamura/runwasi/dist/bin/containerd-shim-wasmtime-v1 -namespace k8s.io -id c938331913ab1beb4fa8ef6eb79e7bebc6fd8c733563973c53b5a84284232f81 -address /run/k3s/containerd/containerd.sock
root        3012    3009  0 07:45 ?        00:00:00 /home/kaita_nakamura/runwasi/dist/bin/containerd-shim-wasmtime-v1 -namespace k8s.io -id c938331913ab1beb4fa8ef6eb79e7bebc6fd8c733563973c53b5a84284232f81 -address /run/k3s/containerd/containerd.sock
root        3461    3009  0 07:45 ?        00:00:23 /home/kaita_nakamura/runwasi/dist/bin/containerd-shim-wasmtime-v1 -namespace k8s.io -id c938331913ab1beb4fa8ef6eb79e7bebc6fd8c733563973c53b5a84284232f81 -address /run/k3s/containerd/containerd.sock
root        3723    3009  0 07:45 ?        00:00:00 nginx: master process nginx -g daemon off;
kaita_n+   24837   24835  0 15:00 pts/0    00:00:00 grep --color=auto -E wasm|nginx -g daemon off

$ cat /proc/3461/cgroup
0::/kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice:cri-containerd:c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288

$ cat /sys/fs/cgroup/kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice:cri-containerd:c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288/cpu.stat
usage_usec 24497044
user_usec 21870232
system_usec 2626811
core_sched.force_idle_usec 0
nr_periods 0
nr_throttled 0
throttled_usec 0
nr_bursts 0
burst_usec 0

$ cat /sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice/cpu.stat
usage_usec 0
user_usec 0
system_usec 0
core_sched.force_idle_usec 0
nr_periods 0
nr_throttled 0
throttled_usec 0
nr_bursts 0
burst_usec 0

config.json から cgroup driver の設定確認

cgroup driver は2種類

  • systemd
    OCI Runtime が dbus 経由で systemd とやりとりをして cgroup を設定
  • cgroupfs (v1 / v2)
    OCI Runtime が mkdir で /sys/fs/cgroup に path を作成

systemd と cgroupfs では渡される cgroup path の形式が異なる。systemd の cgroup path[slice]:[prefix]:[name] の形式。path 変換されたものが /sys/fs/cgroup 以下の path になる。

crictl で CRI Runtime(containerd)から OCI runtime に渡された config.json 相当の JSON を見て cgroupsPath を確かめる。systemd で動くことが期待されていると分かる。

$ sudo bin/k3s crictl inspect
c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288 | grep cgroupsPath
        "cgroupsPath": "kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice:cri-containerd:c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288",

cgroupfs では以下のような形式で cgroupsPath がそのまま /sys/fs/cgroup 以下の path になる。

$ cat /proc/21607/cgroup 
0::/kubepods/besteffort/pod2853aebd-bb39-4e02-a0bf-bc0effa6e2ad/7e71422eb66aa648bf592c1248a7c2060862c43eab04a3d5657b4d04b8f83c3c

$ sudo bin/k3s crictl inspect 7e71422eb66aa648bf592c1248a7c2060862c43eab04a3d5657b4d04b8f83c3c | grep cgroupsPath
        "cgroupsPath": "/kubepods/besteffort/pod2853aebd-bb39-4e02-a0bf-bc0effa6e2ad/7e71422eb66aa648bf592c1248a7c2060862c43eab04a3d5657b4d04b8f83c3c",

youki の cgroup path 変換の挙動確認

youki、runc それぞれに cgroup path を渡して挙動に違いがないか調査する。ここでは youki の cgroup path 変換のバグがないかを確認する。
runc が正となるので、runc 以外の OCI Runtime の挙動が問題ない(OCI Runtime Specification が正しく実装されている)かを確認するときは runc と比較すると良さそう。

runc systemd
$ sudo runc --systemd-cgroup create mycontainerid

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-33.scope 
│   │ ├─16864 sshd: kaita_nakamura [priv]
│   │ ├─16910 sshd: kaita_nakamura@pts/1
│   │ ├─16911 -bash
│   │ ├─17377 systemd-cgls
│   │ └─17378 pager
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─16756 /lib/systemd/systemd --user
│   │   └─16757 (sd-pam)
│   └─session-31.scope 
│     ├─16753 sshd: kaita_nakamura [priv]
│     ├─16843 sshd: kaita_nakamura@pts/0
│     └─16844 -bash
├─init.scope 
│ └─1 /sbin/init
├─system.slice 
│ ├─packagekit.service 
│ │ └─2095 /usr/libexec/packagekitd
│ ├─systemd-networkd.service 
│ │ └─368 /lib/systemd/systemd-networkd
│ ├─systemd-udevd.service 
│ │ └─174 /lib/systemd/systemd-udevd
│ ├─google-osconfig-agent.service 
│ │ └─497 /usr/bin/google_osconfig_agent
│ ├─cron.service 
│ │ └─965 /usr/sbin/cron -f -P
│ ├─system-serial\x2dgetty.slice 
│ │ └─serial-getty@ttyS0.service 
│ │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
│ ├─polkit.service 
│ │ └─861 /usr/libexec/polkitd --no-debug
│ ├─networkd-dispatcher.service 
│ │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
│ ├─multipathd.service 
│ │ └─170 /sbin/multipathd -d -s
│ ├─systemd-journald.service 
│ │ └─128 /lib/systemd/systemd-journald
│ ├─unattended-upgrades.service 
│ │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
│ ├─ssh.service 
│ │ ├─  882 sshd: /usr/sbin/sshd -D [listener] 1 of 10-100 startups
│ │ ├─17331 sshd: root [priv]
│ │ └─17332 sshd: root [net]
│ ├─snapd.service 
│ │ └─517 /usr/lib/snapd/snapd
│ ├─rsyslog.service 
│ │ └─512 /usr/sbin/rsyslogd -n -iNONE
│ ├─chrony.service 
│ │ ├─1437 /usr/sbin/chronyd -F 1
│ │ └─1438 /usr/sbin/chronyd -F 1
│ ├─google-guest-agent.service 
│ │ └─735 /usr/bin/google_guest_agent
│ ├─systemd-resolved.service 
│ │ └─370 /lib/systemd/systemd-resolved
│ ├─snap.docker.dockerd.service 
│ │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-dock>
│ │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
│ ├─dbus.service 
│ │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ ├─system-getty.slice 
│ │ └─getty@tty1.service 
│ │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
│ └─systemd-logind.service 
│   └─928 /lib/systemd/systemd-logind
└─kubepods.slice 
  └─kubepods-besteffort.slice 
    └─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice 
      └─cri-containerd-c37059536e08533916346a8332055308a22e8ee42b9c86a76c3d3418580b262e.scope 
        └─17372 runc init

$ sudo runc --systemd-cgroup start mycontainerid

$ sudo runc list
ID              PID         STATUS      BUNDLE         CREATED                          OWNER
mycontainerid   17483       running     /mycontainer   2025-02-02T08:06:49.121017221Z   root

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-33.scope 
│   │ ├─16864 sshd: kaita_nakamura [priv]
│   │ ├─16910 sshd: kaita_nakamura@pts/1
│   │ ├─16911 -bash
│   │ ├─17413 systemd-cgls
│   │ └─17414 pager
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─16756 /lib/systemd/systemd --user
│   │   └─16757 (sd-pam)
│   └─session-31.scope 
│     ├─16753 sshd: kaita_nakamura [priv]
│     ├─16843 sshd: kaita_nakamura@pts/0
│     └─16844 -bash
├─init.scope 
│ └─1 /sbin/init
├─system.slice 
│ ├─packagekit.service 
│ │ └─2095 /usr/libexec/packagekitd
│ ├─systemd-networkd.service 
│ │ └─368 /lib/systemd/systemd-networkd
│ ├─systemd-udevd.service 
│ │ └─174 /lib/systemd/systemd-udevd
│ ├─google-osconfig-agent.service 
│ │ └─497 /usr/bin/google_osconfig_agent
│ ├─cron.service 
│ │ └─965 /usr/sbin/cron -f -P
│ ├─system-serial\x2dgetty.slice 
│ │ └─serial-getty@ttyS0.service 
│ │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
│ ├─polkit.service 
│ │ └─861 /usr/libexec/polkitd --no-debug
│ ├─networkd-dispatcher.service 
│ │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
│ ├─multipathd.service 
│ │ └─170 /sbin/multipathd -d -s
│ ├─systemd-journald.service 
│ │ └─128 /lib/systemd/systemd-journald
│ ├─unattended-upgrades.service 
│ │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
│ ├─ssh.service 
│ │ └─882 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
│ ├─snapd.service 
│ │ └─517 /usr/lib/snapd/snapd
│ ├─rsyslog.service 
│ │ └─512 /usr/sbin/rsyslogd -n -iNONE
│ ├─chrony.service 
│ │ ├─1437 /usr/sbin/chronyd -F 1
│ │ └─1438 /usr/sbin/chronyd -F 1
│ ├─google-guest-agent.service 
│ │ └─735 /usr/bin/google_guest_agent
│ ├─systemd-resolved.service 
│ │ └─370 /lib/systemd/systemd-resolved
│ ├─snap.docker.dockerd.service 
│ │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-dock>
│ │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
│ ├─dbus.service 
│ │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ ├─system-getty.slice 
│ │ └─getty@tty1.service 
│ │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
│ └─systemd-logind.service 
│   └─928 /lib/systemd/systemd-logind
└─kubepods.slice 
  └─kubepods-besteffort.slice 
    └─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice 
      └─cri-containerd-c37059536e08533916346a8332055308a22e8ee42b9c86a76c3d3418580b262e.scope 
        └─17372 sleep 30
youki systemd
$ sudo ./youki --systemd-cgroup create -b tutorial tutorial_container

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-33.scope 
│   │ ├─16864 sshd: kaita_nakamura [priv]
│   │ ├─16910 sshd: kaita_nakamura@pts/1
│   │ └─16911 -bash
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─16756 /lib/systemd/systemd --user
│   │   └─16757 (sd-pam)
│   └─session-31.scope 
│     ├─16753 sshd: kaita_nakamura [priv]
│     ├─16843 sshd: kaita_nakamura@pts/0
│     ├─16844 -bash
│     ├─17766 systemd-cgls
│     └─17767 pager
├─init.scope 
│ └─1 /sbin/init
├─system.slice 
│ ├─packagekit.service 
│ │ └─2095 /usr/libexec/packagekitd
│ ├─systemd-networkd.service 
│ │ └─368 /lib/systemd/systemd-networkd
│ ├─systemd-udevd.service 
│ │ └─174 /lib/systemd/systemd-udevd
│ ├─google-osconfig-agent.service 
│ │ └─497 /usr/bin/google_osconfig_agent
│ ├─cron.service 
│ │ └─965 /usr/sbin/cron -f -P
│ ├─system-serial\x2dgetty.slice 
│ │ └─serial-getty@ttyS0.service 
│ │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
│ ├─polkit.service 
│ │ └─861 /usr/libexec/polkitd --no-debug
│ ├─networkd-dispatcher.service 
│ │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
│ ├─multipathd.service 
│ │ └─170 /sbin/multipathd -d -s
│ ├─systemd-journald.service 
│ │ └─128 /lib/systemd/systemd-journald
│ ├─unattended-upgrades.service 
│ │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
│ ├─ssh.service 
│ │ └─882 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
│ ├─snapd.service 
│ │ └─517 /usr/lib/snapd/snapd
│ ├─rsyslog.service 
│ │ └─512 /usr/sbin/rsyslogd -n -iNONE
│ ├─chrony.service 
│ │ ├─1437 /usr/sbin/chronyd -F 1
│ │ └─1438 /usr/sbin/chronyd -F 1
│ ├─google-guest-agent.service 
│ │ └─735 /usr/bin/google_guest_agent
│ ├─systemd-resolved.service 
│ │ └─370 /lib/systemd/systemd-resolved
│ ├─snap.docker.dockerd.service 
│ │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-dock>
│ │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
│ ├─dbus.service 
│ │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ ├─system-getty.slice 
│ │ └─getty@tty1.service 
│ │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
│ └─systemd-logind.service 
│   └─928 /lib/systemd/systemd-logind
└─kubepods.slice 
  └─kubepods-besteffort.slice 
    └─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice 
      └─cri-containerd-c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288.scope 
        └─17760 ./youki --systemd-cgroup create -b tutorial tutorial_container

$ sudo ./youki --systemd-cgroup start tutorial_container

$ sudo ./youki list
DEBUG youki: started by user 0 with ArgsOs { inner: ["./youki", "list"] }
ID                  PID    STATUS   BUNDLE                               CREATED                    CREATOR
tutorial_container  17760  Running  /home/kaita_nakamura/youki/tutorial  2025-02-02T08:21:13+00:00  root

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-33.scope 
│   │ ├─16864 sshd: kaita_nakamura [priv]
│   │ ├─16910 sshd: kaita_nakamura@pts/1
│   │ └─16911 -bash
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─16756 /lib/systemd/systemd --user
│   │   └─16757 (sd-pam)
│   └─session-31.scope 
│     ├─16753 sshd: kaita_nakamura [priv]
│     ├─16843 sshd: kaita_nakamura@pts/0
│     ├─16844 -bash
│     ├─17776 systemd-cgls
│     └─17777 pager
├─init.scope 
│ └─1 /sbin/init
├─system.slice 
│ ├─packagekit.service 
│ │ └─2095 /usr/libexec/packagekitd
│ ├─systemd-networkd.service 
│ │ └─368 /lib/systemd/systemd-networkd
│ ├─systemd-udevd.service 
│ │ └─174 /lib/systemd/systemd-udevd
│ ├─google-osconfig-agent.service 
│ │ └─497 /usr/bin/google_osconfig_agent
│ ├─cron.service 
│ │ └─965 /usr/sbin/cron -f -P
│ ├─system-serial\x2dgetty.slice 
│ │ └─serial-getty@ttyS0.service 
│ │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
│ ├─polkit.service 
│ │ └─861 /usr/libexec/polkitd --no-debug
│ ├─networkd-dispatcher.service 
│ │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
│ ├─multipathd.service 
│ │ └─170 /sbin/multipathd -d -s
│ ├─systemd-journald.service 
│ │ └─128 /lib/systemd/systemd-journald
│ ├─unattended-upgrades.service 
│ │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
│ ├─ssh.service 
│ │ └─882 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
│ ├─snapd.service 
│ │ └─517 /usr/lib/snapd/snapd
│ ├─rsyslog.service 
│ │ └─512 /usr/sbin/rsyslogd -n -iNONE
│ ├─chrony.service 
│ │ ├─1437 /usr/sbin/chronyd -F 1
│ │ └─1438 /usr/sbin/chronyd -F 1
│ ├─google-guest-agent.service 
│ │ └─735 /usr/bin/google_guest_agent
│ ├─systemd-resolved.service 
│ │ └─370 /lib/systemd/systemd-resolved
│ ├─snap.docker.dockerd.service 
│ │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-dock>
│ │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
│ ├─dbus.service 
│ │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ ├─system-getty.slice 
│ │ └─getty@tty1.service 
│ │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
│ └─systemd-logind.service 
│   └─928 /lib/systemd/systemd-logind
└─kubepods.slice 
  └─kubepods-besteffort.slice 
    └─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice 
      └─cri-containerd-c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288.scope 
        └─17760 sleep 30
runc cgroupfs
$ sudo runc create mycontainerid

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-37.scope 
│   │ ├─18007 sshd: kaita_nakamura [priv]
│   │ ├─18053 sshd: kaita_nakamura@pts/1
│   │ └─18054 -bash
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─17897 /lib/systemd/systemd --user
│   │   └─17898 (sd-pam)
│   ├─session-35.scope 
│   │ ├─17894 sshd: kaita_nakamura [priv]
│   │ ├─17980 sshd: kaita_nakamura@pts/0
│   │ ├─17981 -bash
│   │ ├─18166 systemd-cgls
│   │ └─18167 pager
│   └─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice:cri-containerd:c37059536e08533916346a8332055308a22e8ee42b9c86a76c3d3418580b262e 
│     └─18085 runc init
├─init.scope 
│ └─1 /sbin/init
└─system.slice 
  ├─packagekit.service 
  │ └─2095 /usr/libexec/packagekitd
  ├─systemd-networkd.service 
  │ └─368 /lib/systemd/systemd-networkd
  ├─systemd-udevd.service 
  │ └─174 /lib/systemd/systemd-udevd
  ├─google-osconfig-agent.service 
  │ └─497 /usr/bin/google_osconfig_agent
  ├─cron.service 
  │ └─965 /usr/sbin/cron -f -P
  ├─system-serial\x2dgetty.slice 
  │ └─serial-getty@ttyS0.service 
  │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
  ├─polkit.service 
  │ └─861 /usr/libexec/polkitd --no-debug
  ├─networkd-dispatcher.service 
  │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
  ├─multipathd.service 
  │ └─170 /sbin/multipathd -d -s
  ├─systemd-journald.service 
  │ └─128 /lib/systemd/systemd-journald
  ├─unattended-upgrades.service 
  │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
  ├─ssh.service 
  │ └─882 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
  ├─snapd.service 
  │ └─517 /usr/lib/snapd/snapd
  ├─rsyslog.service 
  │ └─512 /usr/sbin/rsyslogd -n -iNONE
  ├─chrony.service 
  │ ├─1437 /usr/sbin/chronyd -F 1
  │ └─1438 /usr/sbin/chronyd -F 1
  ├─google-guest-agent.service 
  │ └─735 /usr/bin/google_guest_agent
  ├─systemd-resolved.service 
  │ └─370 /lib/systemd/systemd-resolved
  ├─snap.docker.dockerd.service 
  │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/>
  │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
  ├─dbus.service 
  │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
  ├─system-getty.slice 
  │ └─getty@tty1.service 
  │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
  └─systemd-logind.service 
    └─928 /lib/systemd/systemd-logind

$ sudo runc start mycontainerid

$ sudo runc list
ID              PID         STATUS      BUNDLE         CREATED                          OWNER
mycontainerid   18085       running     /mycontainer   2025-02-02T08:45:01.828100591Z   root

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-37.scope 
│   │ ├─18007 sshd: kaita_nakamura [priv]
│   │ ├─18053 sshd: kaita_nakamura@pts/1
│   │ └─18054 -bash
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─17897 /lib/systemd/systemd --user
│   │   └─17898 (sd-pam)
│   ├─session-35.scope 
│   │ ├─17894 sshd: kaita_nakamura [priv]
│   │ ├─17980 sshd: kaita_nakamura@pts/0
│   │ ├─17981 -bash
│   │ ├─18197 systemd-cgls
│   │ └─18198 pager
│   └─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice:cri-containerd:c37059536e08533916346a8332055308a22e8ee42b9c86a76c3d3418580b262e 
│     └─18085 sleep 30
├─init.scope 
│ └─1 /sbin/init
└─system.slice 
  ├─packagekit.service 
  │ └─2095 /usr/libexec/packagekitd
  ├─systemd-networkd.service 
  │ └─368 /lib/systemd/systemd-networkd
  ├─systemd-udevd.service 
  │ └─174 /lib/systemd/systemd-udevd
  ├─google-osconfig-agent.service 
  │ └─497 /usr/bin/google_osconfig_agent
  ├─cron.service 
  │ └─965 /usr/sbin/cron -f -P
  ├─system-serial\x2dgetty.slice 
  │ └─serial-getty@ttyS0.service 
  │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
  ├─polkit.service 
  │ └─861 /usr/libexec/polkitd --no-debug
  ├─networkd-dispatcher.service 
  │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
  ├─multipathd.service 
  │ └─170 /sbin/multipathd -d -s
  ├─systemd-journald.service 
  │ └─128 /lib/systemd/systemd-journald
  ├─unattended-upgrades.service 
  │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
  ├─ssh.service 
  │ └─882 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
  ├─snapd.service 
  │ └─517 /usr/lib/snapd/snapd
  ├─rsyslog.service 
  │ └─512 /usr/sbin/rsyslogd -n -iNONE
  ├─chrony.service 
  │ ├─1437 /usr/sbin/chronyd -F 1
  │ └─1438 /usr/sbin/chronyd -F 1
  ├─google-guest-agent.service 
  │ └─735 /usr/bin/google_guest_agent
  ├─systemd-resolved.service 
  │ └─370 /lib/systemd/systemd-resolved
  ├─snap.docker.dockerd.service 
  │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/>
  │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
  ├─dbus.service 
  │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
  ├─system-getty.slice 
  │ └─getty@tty1.service 
  │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
  └─systemd-logind.service 
    └─928 /lib/systemd/systemd-logind
youki cgroupfs
$ sudo ./youki create -b tutorial tutorial_container

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-37.scope 
│   │ ├─18007 sshd: kaita_nakamura [priv]
│   │ ├─18053 sshd: kaita_nakamura@pts/1
│   │ ├─18054 -bash
│   │ ├─18382 systemd-cgls
│   │ └─18383 pager
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─17897 /lib/systemd/systemd --user
│   │   └─17898 (sd-pam)
│   └─session-35.scope 
│     ├─17894 sshd: kaita_nakamura [priv]
│     ├─17980 sshd: kaita_nakamura@pts/0
│     └─17981 -bash
├─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice:cri-containerd:c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288 
│ └─18354 ./youki create -b tutorial tutorial_container
├─init.scope 
│ └─1 /sbin/init
└─system.slice 
  ├─packagekit.service 
  │ └─2095 /usr/libexec/packagekitd
  ├─systemd-networkd.service 
  │ └─368 /lib/systemd/systemd-networkd
  ├─systemd-udevd.service 
  │ └─174 /lib/systemd/systemd-udevd
  ├─google-osconfig-agent.service 
  │ └─497 /usr/bin/google_osconfig_agent
  ├─cron.service 
  │ └─965 /usr/sbin/cron -f -P
  ├─system-serial\x2dgetty.slice 
  │ └─serial-getty@ttyS0.service 
  │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
  ├─polkit.service 
  │ └─861 /usr/libexec/polkitd --no-debug
  ├─networkd-dispatcher.service 
  │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
  ├─multipathd.service 
  │ └─170 /sbin/multipathd -d -s
  ├─systemd-journald.service 
  │ └─128 /lib/systemd/systemd-journald
  ├─unattended-upgrades.service 
  │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
  ├─ssh.service 
  │ ├─  882 sshd: /usr/sbin/sshd -D [listener] 1 of 10-100 startups
  │ ├─18380 sshd: [accepted]
  │ └─18381 sshd: [net]
  ├─snapd.service 
  │ └─517 /usr/lib/snapd/snapd
  ├─rsyslog.service 
  │ └─512 /usr/sbin/rsyslogd -n -iNONE
  ├─chrony.service 
  │ ├─1437 /usr/sbin/chronyd -F 1
  │ └─1438 /usr/sbin/chronyd -F 1
  ├─google-guest-agent.service 
  │ └─735 /usr/bin/google_guest_agent
  ├─systemd-resolved.service 
  │ └─370 /lib/systemd/systemd-resolved
  ├─snap.docker.dockerd.service 
  │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/2976/config/daemon.json
  │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
  ├─dbus.service 
  │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
  ├─system-getty.slice 
  │ └─getty@tty1.service 
  │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
  └─systemd-logind.service 
    └─928 /lib/systemd/systemd-logind

$ sudo ./youki start tutorial_container

$ sudo ./youki list
DEBUG youki: started by user 0 with ArgsOs { inner: ["./youki", "list"] }
ID                  PID    STATUS   BUNDLE                               CREATED                    CREATOR
tutorial_container  18354  Running  /home/kaita_nakamura/youki/tutorial  2025-02-02T08:53:26+00:00  root

$ systemd-cgls
Control group /:
-.slice
├─user.slice 
│ └─user-1002.slice 
│   ├─session-37.scope 
│   │ ├─18007 sshd: kaita_nakamura [priv]
│   │ ├─18053 sshd: kaita_nakamura@pts/1
│   │ ├─18054 -bash
│   │ ├─18636 systemd-cgls
│   │ └─18637 pager
│   ├─user@1002.service 
│   │ └─init.scope 
│   │   ├─17897 /lib/systemd/systemd --user
│   │   └─17898 (sd-pam)
│   └─session-35.scope 
│     ├─17894 sshd: kaita_nakamura [priv]
│     ├─17980 sshd: kaita_nakamura@pts/0
│     └─17981 -bash
├─kubepods-besteffort-pod03c0a655_652f_42b2_bf23_f8965c3bd977.slice:cri-containerd:c572970e10d6c32fbb6af0a904804535afaf943b2e12c8a34eb56041278aa288 
│ └─18354 sleep 30
├─init.scope 
│ └─1 /sbin/init
└─system.slice 
  ├─packagekit.service 
  │ └─2095 /usr/libexec/packagekitd
  ├─systemd-networkd.service 
  │ └─368 /lib/systemd/systemd-networkd
  ├─systemd-udevd.service 
  │ └─174 /lib/systemd/systemd-udevd
  ├─google-osconfig-agent.service 
  │ └─497 /usr/bin/google_osconfig_agent
  ├─cron.service 
  │ └─965 /usr/sbin/cron -f -P
  ├─system-serial\x2dgetty.slice 
  │ └─serial-getty@ttyS0.service 
  │   └─862 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
  ├─polkit.service 
  │ └─861 /usr/libexec/polkitd --no-debug
  ├─networkd-dispatcher.service 
  │ └─508 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
  ├─multipathd.service 
  │ └─170 /sbin/multipathd -d -s
  ├─systemd-journald.service 
  │ └─128 /lib/systemd/systemd-journald
  ├─unattended-upgrades.service 
  │ └─741 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
  ├─ssh.service 
  │ ├─  882 sshd: /usr/sbin/sshd -D [listener] 1 of 10-100 startups
  │ ├─18634 sshd: ubuntu [priv]
  │ └─18635 sshd: ubuntu [net]
  ├─snapd.service 
  │ └─517 /usr/lib/snapd/snapd
  ├─rsyslog.service 
  │ └─512 /usr/sbin/rsyslogd -n -iNONE
  ├─chrony.service 
  │ ├─1437 /usr/sbin/chronyd -F 1
  │ └─1438 /usr/sbin/chronyd -F 1
  ├─google-guest-agent.service 
  │ └─735 /usr/bin/google_guest_agent
  ├─systemd-resolved.service 
  │ └─370 /lib/systemd/systemd-resolved
  ├─snap.docker.dockerd.service 
  │ ├─4284 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/2976/config/daemon.json
  │ └─4463 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
  ├─dbus.service 
  │ └─493 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
  ├─system-getty.slice 
  │ └─getty@tty1.service 
  │   └─866 /sbin/agetty -o -p -- \u --noclear tty1 linux
  └─systemd-logind.service 
    └─928 /lib/systemd/systemd-logind

youki に問題はなかった。
youki に systemd 用の cgroup path を渡して cgroupfs で処理した時の挙動が runwasi の時と同様であることが確認できる。
containerd は cgroup driver が systemd であることを期待して、systemd 用の cgroup path を渡している。しかし runwasi が cgroupfs で処理しているためバグになっていることが予想できる。

youki は create、run 時の --systemd-cgroup 引数により with_systemd(systemd_cgroup) が設定され、cgroup driver が決定する。

runwasi では with_systemd(false) によって cgroup driver が cgroupfs になっているように見える。ここが疑わしい。

kubelet Configuration を変更して cgroupfs で動かす

kubelet レベルで cgroupfs を使うように設定変更をする。(デフォルト systemd)これにより cgroupfs を利用するようになっている runwasi が正常な動作をして Pod レベルのメトリクスを取得できる考えられる。
結果、メトリクスが取得できていることが確認できた。
コメント参照

runwasi で systemd を使用するように変更

runwasi で with_systemd(true) にして containerd-shim-wasmtime をビルドする。kubelet の設定は systemd に戻す。
メトリクスが取れていることが確認できたため原因が cgroup driver であることがほぼ確定。
コメント参照

Issue への修正対応

Done
https://github.com/containerd/runwasi/pull/864
また別で記事を書く予定です。

その他

色々調べてたらこういう KEP があった。なるほど。
https://github.com/kubernetes/enhancements/issues/4033

Discussion