From 1279a02b7dc3ec2c412b8711b01d3184ce058381 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sun, 22 Jul 2018 21:59:50 +0000 Subject: [PATCH] Stop tagging pods with host ID So they can be reported centrally, find the pod host ID from the child containers. --- probe/host/tagger.go | 3 ++- render/pod.go | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/probe/host/tagger.go b/probe/host/tagger.go index 29e541324..f466c96e7 100644 --- a/probe/host/tagger.go +++ b/probe/host/tagger.go @@ -30,7 +30,8 @@ func (t Tagger) Tag(r report.Report) (report.Report, error) { // Explicitly don't tag Endpoints, Addresses and Overlay nodes - These topologies include pseudo nodes, // and as such do their own host tagging. - for _, topology := range []report.Topology{r.Process, r.Container, r.ContainerImage, r.Host, r.Pod} { + // Don't tag Pods so they can be reported centrally. + for _, topology := range []report.Topology{r.Process, r.Container, r.ContainerImage, r.Host} { for _, node := range topology.Nodes { topology.ReplaceNode(node.WithLatests(metadata).WithParent(report.Host, t.hostNodeID)) } diff --git a/render/pod.go b/render/pod.go index c08ab0e51..d03b71b13 100644 --- a/render/pod.go +++ b/render/pod.go @@ -53,14 +53,16 @@ var PodRenderer = Memoise(ConditionalRenderer(renderKubernetesTopologies, }, MakeReduce( PropagateSingleMetrics(report.Container, - Map2Parent{topologies: []string{report.Pod}, noParentsPseudoID: UnmanagedID, - chainRenderer: MakeFilter( - ComposeFilterFuncs( - IsRunning, - Complement(isPauseContainer), - ), - ContainerWithImageNameRenderer, - )}, + MakeMap(propagateHostID, + Map2Parent{topologies: []string{report.Pod}, noParentsPseudoID: UnmanagedID, + chainRenderer: MakeFilter( + ComposeFilterFuncs( + IsRunning, + Complement(isPauseContainer), + ), + ContainerWithImageNameRenderer, + )}, + ), ), ConnectionJoin(MapPod2IP, report.Pod), KubernetesVolumesRenderer, @@ -68,6 +70,24 @@ var PodRenderer = Memoise(ConditionalRenderer(renderKubernetesTopologies, ), )) +// Pods are not tagged with a Host ID, but their container children are. +// If n doesn't already have a host ID, copy it from one of the children +func propagateHostID(n report.Node) report.Node { + if _, found := n.Latest.Lookup(report.HostNodeID); found { + return n + } + var first *report.Node + n.Children.ForEach(func(child report.Node) { + if first == nil { + first = &child + } + }) + if first != nil { + n.Latest = n.Latest.Propagate(first.Latest, report.HostNodeID) + } + return n +} + // PodServiceRenderer is a Renderer which produces a renderable kubernetes services // graph by merging the pods graph and the services topology. //