runwasi の cgroup に関する Issue 調査
概要
runwasi で cgroup に関する Issue があり、それについての調査の記録です。忘れないように。
OCI Runtime ~ コンテナプロセス周りのデバッグのコツを少しつかめた。cgroup に関しても学ぶことが多かった。
runwasi
runwasi は Kubernetes で Wasm を動かすための shim をつくるライブラリ & いくつかの Wasm runtime 用の shim です。
runwasi については以前 Kubernetes Meetup Tokyo #68 KubeCon NA 2024 Recap で話した時の資料と動画があるのでご覧ください。
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 レベルのメトリクスが取得できていないことが報告されていました。
調査
KEP-1287 とかを調べていて cgroup 周りが気になっていたところにちょうどこの Issue があがっていたので調査をやらせて欲しいことをコメントで伝えて調査を開始しました。
環境
$ 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
調査の流れ
- バグの再現と確認
- config.json から cgroup driver の設定確認
- youki の cgroup path 変換の挙動確認
- kubelet Configuration を変更して cgroupfs で動かす
- 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
また別で記事を書く予定です。その他
色々調べてたらこういう KEP があった。なるほど。
Discussion