From de60340e51d0a72a2efed7bc864c1fe746cc1055 Mon Sep 17 00:00:00 2001 From: b10s Date: Sun, 15 Nov 2020 23:08:25 +0900 Subject: [PATCH] Improve the getCgroupSubsystemsV1() which uses random record per subsystem returned by libcontainercgroups.GetCgroupMounts(). Example array from GetCgroupMounts(): ``` [ { Mountpoint: "/sys/fs/cgroup/systemd", Root: "/", Subsystems: []string len: 1, cap: 1, ["systemd"],}, { Mountpoint: "/sys/fs/cgroup/cpu,cpuacct", Root: "/", Subsystems: []string len: 2, cap: 2, ["cpu","cpuacct"],}, { Mountpoint: "/sys/fs/cgroup/systemd/some/path", Root: "/some/path", Subsystems: []string len: 1, cap: 1, ["systemd"],}, ] ``` becames a map: ``` [ "memory": "/sys/fs/cgroup/memory/kubepods", "systemd": "/sys/fs/cgroup/systemd/some/path", ] ``` which seems to be wrong. Using shortest path of mountpoint per subsystem would be more reliable. reference issue: https://github.com/kubernetes/kubernetes/issues/95488 --- pkg/kubelet/cm/helpers_linux.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/cm/helpers_linux.go b/pkg/kubelet/cm/helpers_linux.go index 9b115ab5380..aa5c37639dc 100644 --- a/pkg/kubelet/cm/helpers_linux.go +++ b/pkg/kubelet/cm/helpers_linux.go @@ -202,8 +202,16 @@ func getCgroupSubsystemsV1() (*CgroupSubsystems, error) { } mountPoints := make(map[string]string, len(allCgroups)) for _, mount := range allCgroups { + // BEFORE kubelet used a random mount point per cgroups subsystem; + // NOW more deterministic: kubelet use mount point with shortest path; + // FUTURE is bright with clear expectation determined in doc. + // ref. issue: https://github.com/kubernetes/kubernetes/issues/95488 + for _, subsystem := range mount.Subsystems { - mountPoints[subsystem] = mount.Mountpoint + previous := mountPoints[subsystem] + if previous == "" || len(mount.Mountpoint) < len(previous) { + mountPoints[subsystem] = mount.Mountpoint + } } } return &CgroupSubsystems{