@@ -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.
229274func (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