From ba6feb27718268e101da41ab2ef572d820003e90 Mon Sep 17 00:00:00 2001 From: Vishnu kannan Date: Wed, 14 Sep 2016 10:34:22 -0700 Subject: [PATCH] fix kubelet ignoring docker daemon in container feature Signed-off-by: Vishnu kannan --- pkg/kubelet/cm/container_manager_linux.go | 37 +++++++++++++---------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/pkg/kubelet/cm/container_manager_linux.go b/pkg/kubelet/cm/container_manager_linux.go index 6bddb6b986f..7abcfdbf46b 100644 --- a/pkg/kubelet/cm/container_manager_linux.go +++ b/pkg/kubelet/cm/container_manager_linux.go @@ -358,6 +358,7 @@ func (cm *containerManagerImpl) setupNode() error { systemContainers = append(systemContainers, cont) } else { cm.periodicTasks = append(cm.periodicTasks, func() { + glog.V(10).Infof("Adding docker daemon periodic tasks") if err := ensureDockerInContainer(dockerVersion, qos.DockerOOMScoreAdj, nil); err != nil { glog.Error(err) return @@ -524,16 +525,18 @@ func (cm *containerManagerImpl) SystemCgroupsLimit() api.ResourceList { } func isProcessRunningInHost(pid int) (bool, error) { - // Get init mount namespace. Mount namespace is unique for all containers. - initMntNs, err := os.Readlink("/proc/1/ns/mnt") + // Get init pid namespace. + initPidNs, err := os.Readlink("/proc/1/ns/pid") if err != nil { - return false, fmt.Errorf("failed to find mount namespace of init process") + return false, fmt.Errorf("failed to find pid namespace of init process") } - processMntNs, err := os.Readlink(fmt.Sprintf("/proc/%d/ns/mnt", pid)) + glog.V(10).Infof("init pid ns is %q", initPidNs) + processPidNs, err := os.Readlink(fmt.Sprintf("/proc/%d/ns/pid", pid)) if err != nil { - return false, fmt.Errorf("failed to find mount namespace of process %q", pid) + return false, fmt.Errorf("failed to find pid namespace of process %q", pid) } - return initMntNs == processMntNs, nil + glog.V(10).Infof("Pid %d pid ns is %q", pid, processPidNs) + return initPidNs == processPidNs, nil } func getPidFromPidFile(pidFile string) (int, error) { @@ -575,7 +578,6 @@ func ensureDockerInContainer(dockerVersion semver.Version, oomScoreAdj int, mana if dockerVersion.GTE(containerdVersion) { dockerProcs = append(dockerProcs, process{containerdProcessName, containerdPidFile}) } - var errs []error for _, proc := range dockerProcs { pids, err := getPidsForProcess(proc.name, proc.file) @@ -600,25 +602,28 @@ func ensureProcessInContainerWithOOMScore(pid int, oomScoreAdj int, manager *fs. return err } else if !runningInHost { // Process is running inside a container. Don't touch that. - glog.V(2).Infof("pid %d is running in the host namespaces", pid) + glog.V(2).Infof("pid %d is not running in the host namespaces", pid) return nil } var errs []error - cont, err := getContainer(pid) - if err != nil { - errs = append(errs, fmt.Errorf("failed to find container of PID %d: %v", pid, err)) - } - - if manager != nil && cont != manager.Cgroups.Name { - err = manager.Apply(pid) + if manager != nil { + cont, err := getContainer(pid) if err != nil { - errs = append(errs, fmt.Errorf("failed to move PID %d (in %q) to %q: %v", pid, cont, manager.Cgroups.Name, err)) + errs = append(errs, fmt.Errorf("failed to find container of PID %d: %v", pid, err)) + } + + if cont != manager.Cgroups.Name { + err = manager.Apply(pid) + if err != nil { + errs = append(errs, fmt.Errorf("failed to move PID %d (in %q) to %q: %v", pid, cont, manager.Cgroups.Name, err)) + } } } // Also apply oom-score-adj to processes oomAdjuster := oom.NewOOMAdjuster() + glog.V(5).Infof("attempting to apply oom_score_adj of %d to pid %d", oomScoreAdj, pid) if err := oomAdjuster.ApplyOOMScoreAdj(pid, oomScoreAdj); err != nil { glog.V(3).Infof("Failed to apply oom_score_adj %d for pid %d: %v", oomScoreAdj, pid, err) errs = append(errs, fmt.Errorf("failed to apply oom score %d to PID %d: %v", oomScoreAdj, pid, err))