From 7ada99181cdcf6bcbde72ddffe7d975c00444090 Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Fri, 16 Sep 2016 15:16:08 -0700 Subject: [PATCH] Limit the number of names per image reported in the node status --- pkg/kubelet/kubelet.go | 3 --- pkg/kubelet/kubelet_node_status.go | 16 +++++++++++++++- pkg/kubelet/kubelet_node_status_test.go | 10 ++++++++-- pkg/kubelet/kubelet_test.go | 2 -- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 6bb73a86512..8d94e61f0b2 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -157,9 +157,6 @@ const ( // Period for performing image garbage collection. ImageGCPeriod = 5 * time.Minute - // maxImagesInStatus is the number of max images we store in image status. - maxImagesInNodeStatus = 50 - // Minimum number of dead containers to keep in a pod minDeadContainerInPod = 1 ) diff --git a/pkg/kubelet/kubelet_node_status.go b/pkg/kubelet/kubelet_node_status.go index 2c9a850257e..b155de781d7 100644 --- a/pkg/kubelet/kubelet_node_status.go +++ b/pkg/kubelet/kubelet_node_status.go @@ -39,6 +39,15 @@ import ( "k8s.io/kubernetes/pkg/volume/util/volumehelper" ) +const ( + // maxImagesInNodeStatus is the number of max images we store in image status. + maxImagesInNodeStatus = 50 + + // maxNamesPerImageInNodeStatus is max number of names per image stored in + // the node status. + maxNamesPerImageInNodeStatus = 5 +) + // registerWithApiServer registers the node with the cluster master. It is safe // to call multiple times, but not concurrently (kl.registrationCompleted is // not locked). @@ -501,8 +510,13 @@ func (kl *Kubelet) setNodeStatusImages(node *api.Node) { } for _, image := range containerImages { + names := append(image.RepoDigests, image.RepoTags...) + // Report up to maxNamesPerImageInNodeStatus names per image. + if len(names) > maxNamesPerImageInNodeStatus { + names = names[0:maxNamesPerImageInNodeStatus] + } imagesOnNode = append(imagesOnNode, api.ContainerImage{ - Names: append(image.RepoTags, image.RepoDigests...), + Names: names, SizeBytes: image.Size, }) } diff --git a/pkg/kubelet/kubelet_node_status_test.go b/pkg/kubelet/kubelet_node_status_test.go index fae21e4a026..d387fbcd6c9 100644 --- a/pkg/kubelet/kubelet_node_status_test.go +++ b/pkg/kubelet/kubelet_node_status_test.go @@ -44,6 +44,10 @@ import ( "k8s.io/kubernetes/pkg/volume/util/volumehelper" ) +const ( + maxImageTagsForTest = 20 +) + // generateTestingImageList generate randomly generated image list and corresponding expectedImageList. func generateTestingImageList(count int) ([]kubecontainer.Image, []api.ContainerImage) { // imageList is randomly generated image list @@ -64,7 +68,7 @@ func generateTestingImageList(count int) ([]kubecontainer.Image, []api.Container var expectedImageList []api.ContainerImage for _, kubeImage := range imageList { apiImage := api.ContainerImage{ - Names: kubeImage.RepoTags, + Names: kubeImage.RepoTags[0:maxNamesPerImageInNodeStatus], SizeBytes: kubeImage.Size, } @@ -76,7 +80,9 @@ func generateTestingImageList(count int) ([]kubecontainer.Image, []api.Container func generateImageTags() []string { var tagList []string - count := rand.IntnRange(1, maxImageTagsForTest+1) + // Generate > maxNamesPerImageInNodeStatus tags so that the test can verify + // that kubelet report up to maxNamesPerImageInNodeStatus tags. + count := rand.IntnRange(maxNamesPerImageInNodeStatus+1, maxImageTagsForTest+1) for ; count > 0; count-- { tagList = append(tagList, "gcr.io/google_containers:v"+strconv.Itoa(count)) } diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 9aa210daf0f..92def577369 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -86,8 +86,6 @@ const ( testReservationCPU = "200m" testReservationMemory = "100M" - maxImageTagsForTest = 3 - // TODO(harry) any global place for these two? // Reasonable size range of all container images. 90%ile of images on dockerhub drops into this range. minImgSize int64 = 23 * 1024 * 1024