diff --git a/pkg/kubelet/container_manager_linux.go b/pkg/kubelet/container_manager_linux.go index 292d2a8351..330e4bf43f 100644 --- a/pkg/kubelet/container_manager_linux.go +++ b/pkg/kubelet/container_manager_linux.go @@ -39,7 +39,8 @@ type containerManagerImpl struct { dockerContainerName string // The manager of the resource-only container Docker should be in. - manager fs.Manager + manager fs.Manager + dockerOomScoreAdj int } var _ containerManager = &containerManagerImpl{} @@ -55,6 +56,7 @@ func newContainerManager(dockerDaemonContainer string) (containerManager, error) AllowAllDevices: true, }, }, + dockerOomScoreAdj: -900, }, nil } @@ -103,6 +105,11 @@ func (cm *containerManagerImpl) ensureDockerInContainer() error { errs = append(errs, fmt.Errorf("failed to move PID %q (in %q) to %q", pid, cont, cm.dockerContainerName)) } } + + // Also apply oom_score_adj to processes + if err := util.ApplyOomScoreAdj(pid, cm.dockerOomScoreAdj); err != nil { + errs = append(errs, fmt.Errorf("failed to apply oom score %q to PID %q", cm.dockerOomScoreAdj, pid)) + } } return errors.NewAggregate(errs) diff --git a/pkg/kubelet/dockertools/manager.go b/pkg/kubelet/dockertools/manager.go index 270b3c2359..1b0bf404f6 100644 --- a/pkg/kubelet/dockertools/manager.go +++ b/pkg/kubelet/dockertools/manager.go @@ -1293,7 +1293,8 @@ func (dm *DockerManager) createPodInfraContainer(pod *api.Pod) (kubeletTypes.Doc if containerInfo.State.Pid == 0 { return "", fmt.Errorf("failed to get init PID for Docker pod infra container %q", string(id)) } - return id, util.ApplyOomScoreAdj(containerInfo.State.Pid, podOomScoreAdj) + util.ApplyOomScoreAdj(containerInfo.State.Pid, podOomScoreAdj) + return id, nil } // TODO(vmarmol): This will soon be made non-public when its only use is internal. diff --git a/pkg/util/util.go b/pkg/util/util.go index 098b70d345..f85a8d15f4 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -214,8 +214,13 @@ func ApplyOomScoreAdj(pid int, value int) error { pidStr = strconv.Itoa(pid) } - if err := ioutil.WriteFile(path.Join("/proc", pidStr, "oom_score_adj"), []byte(strconv.Itoa(value)), 0700); err != nil { - fmt.Errorf("failed to set oom_score_adj to %d: %v", value, err) + oom_value, err := ioutil.ReadFile(path.Join("/proc", pidStr, "oom_score_adj")) + if err != nil { + return fmt.Errorf("failed to read oom_score_adj: %v", err) + } else if string(oom_value) != strconv.Itoa(value) { + if err := ioutil.WriteFile(path.Join("/proc", pidStr, "oom_score_adj"), []byte(strconv.Itoa(value)), 0700); err != nil { + return fmt.Errorf("failed to set oom_score_adj to %d: %v", value, err) + } } return nil