diff --git a/pkg/kubelet/container/runtime.go b/pkg/kubelet/container/runtime.go index ba11209fc47..d48f4a7024a 100644 --- a/pkg/kubelet/container/runtime.go +++ b/pkg/kubelet/container/runtime.go @@ -108,6 +108,11 @@ type Runtime interface { // TODO: Change ContainerID to a Pod ID since the namespace is shared // by all containers in the pod. GetNetNS(containerID ContainerID) (string, error) + // Returns the container ID that represents the Pod, as passed to network + // plugins. For example if the runtime uses an infra container, returns + // the infra container's ContainerID. + // TODO: Change ContainerID to a Pod ID, see GetNetNS() + GetPodContainerID(*Pod) (ContainerID, error) // TODO(vmarmol): Unify pod and containerID args. // GetContainerLogs returns logs of a specific container. By // default, it returns a snapshot of the container log. Set 'follow' to true to diff --git a/pkg/kubelet/container/testing/fake_runtime.go b/pkg/kubelet/container/testing/fake_runtime.go index 9431d61b900..3bd5c699743 100644 --- a/pkg/kubelet/container/testing/fake_runtime.go +++ b/pkg/kubelet/container/testing/fake_runtime.go @@ -368,6 +368,14 @@ func (f *FakeRuntime) GetNetNS(containerID ContainerID) (string, error) { return "", f.Err } +func (f *FakeRuntime) GetPodContainerID(pod *Pod) (ContainerID, error) { + f.Lock() + defer f.Unlock() + + f.CalledFunctions = append(f.CalledFunctions, "GetPodContainerID") + return ContainerID{}, f.Err +} + func (f *FakeRuntime) GarbageCollect(gcPolicy ContainerGCPolicy, ready bool) error { f.Lock() defer f.Unlock() diff --git a/pkg/kubelet/container/testing/runtime_mock.go b/pkg/kubelet/container/testing/runtime_mock.go index 17003b8e1e7..939054b0f08 100644 --- a/pkg/kubelet/container/testing/runtime_mock.go +++ b/pkg/kubelet/container/testing/runtime_mock.go @@ -133,6 +133,11 @@ func (r *Mock) GetNetNS(containerID ContainerID) (string, error) { return "", args.Error(0) } +func (r *Mock) GetPodContainerID(pod *Pod) (ContainerID, error) { + args := r.Called(pod) + return ContainerID{}, args.Error(0) +} + func (r *Mock) GarbageCollect(gcPolicy ContainerGCPolicy, ready bool) error { args := r.Called(gcPolicy, ready) return args.Error(0) diff --git a/pkg/kubelet/dockertools/docker_manager.go b/pkg/kubelet/dockertools/docker_manager.go index 7712bf37df3..627fc4d3898 100644 --- a/pkg/kubelet/dockertools/docker_manager.go +++ b/pkg/kubelet/dockertools/docker_manager.go @@ -2318,6 +2318,16 @@ func (dm *DockerManager) GetNetNS(containerID kubecontainer.ContainerID) (string return netnsPath, nil } +func (dm *DockerManager) GetPodContainerID(pod *kubecontainer.Pod) (kubecontainer.ContainerID, error) { + for _, c := range pod.Containers { + if c.Name == PodInfraContainerName { + return c.ID, nil + } + } + + return kubecontainer.ContainerID{}, fmt.Errorf("Pod %s unknown to docker.", kubecontainer.BuildPodFullName(pod.Name, pod.Namespace)) +} + // Garbage collection of dead containers func (dm *DockerManager) GarbageCollect(gcPolicy kubecontainer.ContainerGCPolicy, allSourcesReady bool) error { return dm.containerGC.GarbageCollect(gcPolicy, allSourcesReady) diff --git a/pkg/kubelet/network/kubenet/kubenet_linux.go b/pkg/kubelet/network/kubenet/kubenet_linux.go index 4685529ca4c..927bab804c5 100644 --- a/pkg/kubelet/network/kubenet/kubenet_linux.go +++ b/pkg/kubelet/network/kubenet/kubenet_linux.go @@ -34,7 +34,6 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/componentconfig" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/dockertools" "k8s.io/kubernetes/pkg/kubelet/network" "k8s.io/kubernetes/pkg/util/bandwidth" utildbus "k8s.io/kubernetes/pkg/util/dbus" @@ -495,24 +494,23 @@ func (plugin *kubenetNetworkPlugin) getRunningPods() ([]*hostport.RunningPod, er } runningPods := make([]*hostport.RunningPod, 0) for _, p := range pods { - for _, c := range p.Containers { - if c.Name != dockertools.PodInfraContainerName { - continue - } - ipString, ok := plugin.podIPs[c.ID] - if !ok { - continue - } - podIP := net.ParseIP(ipString) - if podIP == nil { - continue - } - if pod, ok := plugin.host.GetPodByName(p.Namespace, p.Name); ok { - runningPods = append(runningPods, &hostport.RunningPod{ - Pod: pod, - IP: podIP, - }) - } + containerID, err := plugin.host.GetRuntime().GetPodContainerID(p) + if err != nil { + continue + } + ipString, ok := plugin.podIPs[containerID] + if !ok { + continue + } + podIP := net.ParseIP(ipString) + if podIP == nil { + continue + } + if pod, ok := plugin.host.GetPodByName(p.Namespace, p.Name); ok { + runningPods = append(runningPods, &hostport.RunningPod{ + Pod: pod, + IP: podIP, + }) } } return runningPods, nil diff --git a/pkg/kubelet/rkt/rkt.go b/pkg/kubelet/rkt/rkt.go index 84e7c5412a9..da140d63312 100644 --- a/pkg/kubelet/rkt/rkt.go +++ b/pkg/kubelet/rkt/rkt.go @@ -1785,6 +1785,10 @@ func (r *Runtime) GetNetNS(containerID kubecontainer.ContainerID) (string, error return netnsPathFromName(makePodNetnsName(kubetypes.UID(containerID.ID))), nil } +func (r *Runtime) GetPodContainerID(pod *kubecontainer.Pod) (kubecontainer.ContainerID, error) { + return kubecontainer.ContainerID{ID: string(pod.ID)}, nil +} + func podDetailsFromServiceFile(serviceFilePath string) (string, string, string, bool, error) { f, err := os.Open(serviceFilePath) if err != nil {