Skip to content

Commit 53645b2

Browse files
committed
Set containerd LimitNOFILE at runtime to ensure ulimit consistency
1 parent f341d89 commit 53645b2

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

pkg/minikube/cruntime/containerd.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,51 @@ func generateContainerdConfig(cr CommandRunner, imageRepository string, kv semve
224224
return nil
225225
}
226226

227+
// setContainerdUlimit sets LimitNOFILE in containerd systemd service to match docker's default ulimit
228+
func setContainerdUlimit(cr CommandRunner) error {
229+
// Check common locations for containerd.service file
230+
servicePaths := []string{
231+
"/lib/systemd/system/containerd.service",
232+
"/usr/lib/systemd/system/containerd.service",
233+
"/etc/systemd/system/containerd.service",
234+
}
235+
236+
var serviceFile string
237+
for _, path := range servicePaths {
238+
if _, err := cr.RunCmd(exec.Command("sudo", "test", "-f", path)); err == nil {
239+
serviceFile = path
240+
break
241+
}
242+
}
243+
244+
if serviceFile == "" {
245+
return errors.New("containerd.service file not found")
246+
}
247+
248+
// Check if LimitNOFILE is already set
249+
checkCmd := exec.Command("sh", "-c", fmt.Sprintf(`sudo grep -q "^LimitNOFILE=" %s`, serviceFile))
250+
if _, err := cr.RunCmd(checkCmd); err == nil {
251+
// LimitNOFILE already exists, update it
252+
updateCmd := exec.Command("sh", "-c", fmt.Sprintf(`sudo sed -i 's/^LimitNOFILE=.*/LimitNOFILE=1048576/' %s`, serviceFile))
253+
if _, err := cr.RunCmd(updateCmd); err != nil {
254+
return errors.Wrap(err, "updating LimitNOFILE in containerd.service")
255+
}
256+
} else {
257+
// LimitNOFILE doesn't exist, add it after [Service]
258+
addCmd := exec.Command("sh", "-c", fmt.Sprintf(`sudo sed -i '/^\[Service\]/a LimitNOFILE=1048576' %s`, serviceFile))
259+
if _, err := cr.RunCmd(addCmd); err != nil {
260+
return errors.Wrap(err, "adding LimitNOFILE to containerd.service")
261+
}
262+
}
263+
264+
// Reload systemd to pick up the changes
265+
if _, err := cr.RunCmd(exec.Command("sudo", "systemctl", "daemon-reload")); err != nil {
266+
return errors.Wrap(err, "reloading systemd after containerd.service modification")
267+
}
268+
269+
return nil
270+
}
271+
227272
// Enable idempotently enables containerd on a host
228273
// It is also called by docker.Enable() - if bound to containerd, to enforce proper containerd configuration completed by service restart.
229274
func (r *Containerd) Enable(disOthers bool, cgroupDriver string, inUserNamespace bool) error {
@@ -249,6 +294,13 @@ func (r *Containerd) Enable(disOthers bool, cgroupDriver string, inUserNamespace
249294
if err := generateContainerdConfig(r.Runner, r.ImageRepository, r.KubernetesVersion, cgroupDriver, r.InsecureRegistry, inUserNamespace); err != nil {
250295
return err
251296
}
297+
298+
// Set LimitNOFILE for containerd to match docker's default ulimit (1048576)
299+
// This ensures consistent file descriptor limits across container runtimes
300+
if err := setContainerdUlimit(r.Runner); err != nil {
301+
klog.Warningf("failed to set containerd ulimit: %v", err)
302+
}
303+
252304
if err := enableIPForwarding(r.Runner); err != nil {
253305
return err
254306
}

0 commit comments

Comments
 (0)