Skip to content

Commit c13d891

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request kubernetes#46470 from shyamjvs/configmap-interface
Automatic merge from submit-queue Migrate kubelet to ConfigMapManager interface and use TTL-based caching manager Fixes kubernetes#41379 Sometime ago we moved to a secret manager interface for kubelet to manage secrets. This PR's first commit moves config map management also to a similar interface. The second commit adds TTL-based CachingConfigMapManager (similar to CachingSecretManager) and makes kubelet use it. /cc @kubernetes/sig-node-pr-reviews @kubernetes/sig-scalability-misc @wojtek-t @dchen1107
2 parents 7043372 + 1cf6b33 commit c13d891

30 files changed

+1127
-50
lines changed

pkg/api/v1/pod/util.go

+54
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,60 @@ func visitContainerSecretNames(container *v1.Container, visitor Visitor) bool {
197197
return true
198198
}
199199

200+
// VisitPodConfigmapNames invokes the visitor function with the name of every configmap
201+
// referenced by the pod spec. If visitor returns false, visiting is short-circuited.
202+
// Transitive references (e.g. pod -> pvc -> pv -> secret) are not visited.
203+
// Returns true if visiting completed, false if visiting was short-circuited.
204+
func VisitPodConfigmapNames(pod *v1.Pod, visitor Visitor) bool {
205+
for i := range pod.Spec.InitContainers {
206+
if !visitContainerConfigmapNames(&pod.Spec.InitContainers[i], visitor) {
207+
return false
208+
}
209+
}
210+
for i := range pod.Spec.Containers {
211+
if !visitContainerConfigmapNames(&pod.Spec.Containers[i], visitor) {
212+
return false
213+
}
214+
}
215+
var source *v1.VolumeSource
216+
for i := range pod.Spec.Volumes {
217+
source = &pod.Spec.Volumes[i].VolumeSource
218+
switch {
219+
case source.Projected != nil:
220+
for j := range source.Projected.Sources {
221+
if source.Projected.Sources[j].ConfigMap != nil {
222+
if !visitor(source.Projected.Sources[j].ConfigMap.Name) {
223+
return false
224+
}
225+
}
226+
}
227+
case source.ConfigMap != nil:
228+
if !visitor(source.ConfigMap.Name) {
229+
return false
230+
}
231+
}
232+
}
233+
return true
234+
}
235+
236+
func visitContainerConfigmapNames(container *v1.Container, visitor Visitor) bool {
237+
for _, env := range container.EnvFrom {
238+
if env.ConfigMapRef != nil {
239+
if !visitor(env.ConfigMapRef.Name) {
240+
return false
241+
}
242+
}
243+
}
244+
for _, envVar := range container.Env {
245+
if envVar.ValueFrom != nil && envVar.ValueFrom.ConfigMapKeyRef != nil {
246+
if !visitor(envVar.ValueFrom.ConfigMapKeyRef.Name) {
247+
return false
248+
}
249+
}
250+
}
251+
return true
252+
}
253+
200254
// GetContainerStatus extracts the status of container "name" from "statuses".
201255
// It also returns if "name" exists.
202256
func GetContainerStatus(statuses []v1.ContainerStatus, name string) (v1.ContainerStatus, bool) {

pkg/controller/volume/attachdetach/attach_detach_controller.go

+6
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,12 @@ func (adc *attachDetachController) GetSecretFunc() func(namespace, name string)
552552
}
553553
}
554554

555+
func (adc *attachDetachController) GetConfigMapFunc() func(namespace, name string) (*v1.ConfigMap, error) {
556+
return func(_, _ string) (*v1.ConfigMap, error) {
557+
return nil, fmt.Errorf("GetConfigMap unsupported in attachDetachController")
558+
}
559+
}
560+
555561
func (adc *attachDetachController) addNodeToDswp(node *v1.Node, nodeName types.NodeName) {
556562
if _, exists := node.Annotations[volumehelper.ControllerManagedAttachAnnotation]; exists {
557563
keepTerminatedPodVolumes := false

pkg/controller/volume/persistentvolume/volume_host.go

+6
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ func (adc *PersistentVolumeController) GetSecretFunc() func(namespace, name stri
8787
}
8888
}
8989

90+
func (adc *PersistentVolumeController) GetConfigMapFunc() func(namespace, name string) (*v1.ConfigMap, error) {
91+
return func(_, _ string) (*v1.ConfigMap, error) {
92+
return nil, fmt.Errorf("GetConfigMap unsupported in PersistentVolumeController")
93+
}
94+
}
95+
9096
func (ctrl *PersistentVolumeController) GetNodeLabels() (map[string]string, error) {
9197
return nil, fmt.Errorf("GetNodeLabels() unsupported in PersistentVolumeController")
9298
}

pkg/kubelet/BUILD

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ go_library(
5757
"//pkg/kubelet/certificate:go_default_library",
5858
"//pkg/kubelet/cm:go_default_library",
5959
"//pkg/kubelet/config:go_default_library",
60+
"//pkg/kubelet/configmap:go_default_library",
6061
"//pkg/kubelet/container:go_default_library",
6162
"//pkg/kubelet/dockershim:go_default_library",
6263
"//pkg/kubelet/dockershim/libdocker:go_default_library",
@@ -174,6 +175,7 @@ go_test(
174175
"//pkg/kubelet/cadvisor/testing:go_default_library",
175176
"//pkg/kubelet/cm:go_default_library",
176177
"//pkg/kubelet/config:go_default_library",
178+
"//pkg/kubelet/configmap:go_default_library",
177179
"//pkg/kubelet/container:go_default_library",
178180
"//pkg/kubelet/container/testing:go_default_library",
179181
"//pkg/kubelet/eviction:go_default_library",
@@ -249,6 +251,7 @@ filegroup(
249251
"//pkg/kubelet/client:all-srcs",
250252
"//pkg/kubelet/cm:all-srcs",
251253
"//pkg/kubelet/config:all-srcs",
254+
"//pkg/kubelet/configmap:all-srcs",
252255
"//pkg/kubelet/container:all-srcs",
253256
"//pkg/kubelet/custommetrics:all-srcs",
254257
"//pkg/kubelet/dockershim:all-srcs",

pkg/kubelet/configmap/BUILD

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package(default_visibility = ["//visibility:public"])
2+
3+
licenses(["notice"])
4+
5+
load(
6+
"@io_bazel_rules_go//go:def.bzl",
7+
"go_library",
8+
"go_test",
9+
)
10+
11+
go_library(
12+
name = "go_default_library",
13+
srcs = [
14+
"configmap_manager.go",
15+
"fake_manager.go",
16+
],
17+
tags = ["automanaged"],
18+
deps = [
19+
"//pkg/api/v1:go_default_library",
20+
"//pkg/api/v1/pod:go_default_library",
21+
"//pkg/client/clientset_generated/clientset:go_default_library",
22+
"//pkg/kubelet/util:go_default_library",
23+
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
24+
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
25+
"//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library",
26+
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
27+
"//vendor/k8s.io/apiserver/pkg/storage/etcd:go_default_library",
28+
],
29+
)
30+
31+
filegroup(
32+
name = "package-srcs",
33+
srcs = glob(["**"]),
34+
tags = ["automanaged"],
35+
visibility = ["//visibility:private"],
36+
)
37+
38+
filegroup(
39+
name = "all-srcs",
40+
srcs = [":package-srcs"],
41+
tags = ["automanaged"],
42+
)
43+
44+
go_test(
45+
name = "go_default_test",
46+
srcs = ["configmap_manager_test.go"],
47+
library = ":go_default_library",
48+
tags = ["automanaged"],
49+
deps = [
50+
"//pkg/api/v1:go_default_library",
51+
"//pkg/client/clientset_generated/clientset/fake:go_default_library",
52+
"//vendor/github.com/stretchr/testify/assert:go_default_library",
53+
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
54+
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
55+
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
56+
"//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library",
57+
"//vendor/k8s.io/client-go/testing:go_default_library",
58+
],
59+
)

0 commit comments

Comments
 (0)