Skip to content

Commit 484c27d

Browse files
authored
Merge pull request #14115 from kadern0/issue-12842
Fix: "Your cgroup does not allow setting memory"
2 parents 97ddebb + f31a1d5 commit 484c27d

File tree

5 files changed

+76
-33
lines changed

5 files changed

+76
-33
lines changed

go.mod

+5-1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ require (
9999
require (
100100
github.com/Xuanwo/go-locale v1.1.0
101101
github.com/docker/go-connections v0.4.0
102+
github.com/opencontainers/runc v1.0.2
102103
github.com/santhosh-tekuri/jsonschema/v5 v5.0.0
103104
)
104105

@@ -124,7 +125,9 @@ require (
124125
github.com/containerd/cgroups v1.0.1 // indirect
125126
github.com/containerd/containerd v1.5.2 // indirect
126127
github.com/containerd/stargz-snapshotter/estargz v0.7.0 // indirect
128+
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
127129
github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
130+
github.com/cyphar/filepath-securejoin v0.2.2 // indirect
128131
github.com/davecgh/go-spew v1.1.1 // indirect
129132
github.com/docker/cli v20.10.7+incompatible // indirect
130133
github.com/docker/distribution v2.8.1+incompatible // indirect
@@ -142,6 +145,7 @@ require (
142145
github.com/go-openapi/jsonreference v0.19.5 // indirect
143146
github.com/go-openapi/swag v0.19.14 // indirect
144147
github.com/go-pdf/fpdf v0.6.0 // indirect
148+
github.com/godbus/dbus/v5 v5.0.4 // indirect
145149
github.com/gogo/protobuf v1.3.2 // indirect
146150
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
147151
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
@@ -181,7 +185,7 @@ require (
181185
github.com/modern-go/reflect2 v1.0.2 // indirect
182186
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
183187
github.com/opencontainers/image-spec v1.0.1 // indirect
184-
github.com/opencontainers/runc v1.0.2 // indirect
188+
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect
185189
github.com/pelletier/go-toml v1.9.4 // indirect
186190
github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect
187191
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7
337337
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
338338
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
339339
github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
340+
github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
340341
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
341342
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
342343
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
@@ -348,6 +349,7 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
348349
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
349350
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
350351
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
352+
github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg=
351353
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
352354
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
353355
github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
@@ -491,6 +493,7 @@ github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblf
491493
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
492494
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
493495
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
496+
github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
494497
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
495498
github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU=
496499
github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
@@ -918,6 +921,7 @@ github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/
918921
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
919922
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
920923
github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
924+
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc=
921925
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
922926
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
923927
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=

pkg/drivers/kic/oci/cgroups_linux.go

+59
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,15 @@ limitations under the License.
1919
package oci
2020

2121
import (
22+
"fmt"
23+
"os"
24+
"path"
2225
"syscall"
2326

27+
"github.com/opencontainers/runc/libcontainer/cgroups"
2428
"golang.org/x/sys/unix"
29+
30+
"k8s.io/klog/v2"
2531
)
2632

2733
// IsCgroup2UnifiedMode returns whether we are running in cgroup 2 cgroup2 mode.
@@ -32,3 +38,56 @@ func IsCgroup2UnifiedMode() (bool, error) {
3238
}
3339
return st.Type == unix.CGROUP2_SUPER_MAGIC, nil
3440
}
41+
42+
// findCgroupMountpoints returns the cgroups mount point
43+
// defined in docker engine engine/pkg/sysinfo/sysinfo_linux.go
44+
func findCgroupMountpoints() (map[string]string, error) {
45+
cgMounts, err := cgroups.GetCgroupMounts(false)
46+
if err != nil {
47+
return nil, fmt.Errorf("Failed to parse cgroup information: %v", err)
48+
}
49+
mps := make(map[string]string)
50+
for _, m := range cgMounts {
51+
for _, ss := range m.Subsystems {
52+
mps[ss] = m.Mountpoint
53+
}
54+
}
55+
return mps, nil
56+
}
57+
58+
// HasMemoryCgroup checks whether it is possible to set memory limit for cgroup.
59+
func HasMemoryCgroup() bool {
60+
cgMounts, err := findCgroupMountpoints()
61+
if err != nil {
62+
klog.Warning("Your kernel does not support memory limit capabilities or the cgroup is not mounted.")
63+
return false
64+
}
65+
_, ok := cgMounts["memory"]
66+
if !ok {
67+
klog.Warning("Your kernel does not support memory limit capabilities or the cgroup is not mounted.")
68+
return false
69+
}
70+
return true
71+
}
72+
73+
// hasMemorySwapCgroup checks whether it is possible to set swap limit for cgroup
74+
func hasMemorySwapCgroup() bool {
75+
cgMounts, err := findCgroupMountpoints()
76+
if err != nil {
77+
klog.Warning("Your kernel does not support swap limit capabilities or the cgroup is not mounted.")
78+
return false
79+
}
80+
mountPoint, ok := cgMounts["memory"]
81+
if !ok {
82+
klog.Warning("Your kernel does not support swap limit capabilities or the cgroup is not mounted.")
83+
return false
84+
}
85+
86+
_, err = os.Stat(path.Join(mountPoint, "memory.memsw.limit_in_bytesw"))
87+
if err != nil {
88+
klog.Warning("Your kernel does not support swap limit capabilities or the cgroup is not mounted.")
89+
return false
90+
91+
}
92+
return true
93+
}

pkg/drivers/kic/oci/cgroups_other.go

+8
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,11 @@ import (
2828
func IsCgroup2UnifiedMode() (bool, error) {
2929
return false, errors.Errorf("Not supported on %s", runtime.GOOS)
3030
}
31+
32+
func HasMemoryCgroup() bool {
33+
return true
34+
}
35+
36+
func hasMemorySwapCgroup() bool {
37+
return true
38+
}

pkg/drivers/kic/oci/oci.go

-32
Original file line numberDiff line numberDiff line change
@@ -108,38 +108,6 @@ func PrepareContainerNode(p CreateParams) error {
108108
return nil
109109
}
110110

111-
// HasMemoryCgroup checks whether it is possible to set memory limit for cgroup.
112-
func HasMemoryCgroup() bool {
113-
memcg := true
114-
if runtime.GOOS == "linux" {
115-
var memory string
116-
if cgroup2, err := IsCgroup2UnifiedMode(); err == nil && cgroup2 {
117-
memory = "/sys/fs/cgroup/memory/memsw.limit_in_bytes"
118-
}
119-
if _, err := os.Stat(memory); os.IsNotExist(err) {
120-
klog.Warning("Your kernel does not support memory limit capabilities or the cgroup is not mounted.")
121-
memcg = false
122-
}
123-
}
124-
return memcg
125-
}
126-
127-
func hasMemorySwapCgroup() bool {
128-
memcgSwap := true
129-
if runtime.GOOS == "linux" {
130-
var memoryswap string
131-
if cgroup2, err := IsCgroup2UnifiedMode(); err == nil && cgroup2 {
132-
memoryswap = "/sys/fs/cgroup/memory/memory.swap.max"
133-
}
134-
if _, err := os.Stat(memoryswap); os.IsNotExist(err) {
135-
// requires CONFIG_MEMCG_SWAP_ENABLED or cgroup_enable=memory in grub
136-
klog.Warning("Your kernel does not support swap limit capabilities or the cgroup is not mounted.")
137-
memcgSwap = false
138-
}
139-
}
140-
return memcgSwap
141-
}
142-
143111
// CreateContainerNode creates a new container node
144112
func CreateContainerNode(p CreateParams) error {
145113
// on windows os, if docker desktop is using Windows Containers. Exit early with error

0 commit comments

Comments
 (0)