diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index 7e87dc944bc..c5cafc0abf8 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -131,9 +131,6 @@ type KubeletFlags struct { // schedulable. Won't have any effect if register-node is false. // DEPRECATED: use registerWithTaints instead RegisterSchedulable bool - // This flag, if set, instructs the kubelet to keep volumes from terminated pods mounted to the node. - // This can be useful for debugging volume related issues. - KeepTerminatedPodVolumes bool // SeccompDefault enables the use of `RuntimeDefault` as the default seccomp profile for all workloads on the node. SeccompDefault bool } @@ -321,8 +318,6 @@ func (f *KubeletFlags) AddFlags(mainfs *pflag.FlagSet) { fs.MarkDeprecated("maximum-dead-containers", "Use --eviction-hard or --eviction-soft instead. Will be removed in a future version.") fs.BoolVar(&f.RegisterSchedulable, "register-schedulable", f.RegisterSchedulable, "Register the node as schedulable. Won't have any effect if register-node is false.") fs.MarkDeprecated("register-schedulable", "will be removed in a future version") - fs.BoolVar(&f.KeepTerminatedPodVolumes, "keep-terminated-pod-volumes", f.KeepTerminatedPodVolumes, "Keep terminated pod volumes mounted to the node after the pod terminates. Can be useful for debugging volume related issues.") - fs.MarkDeprecated("keep-terminated-pod-volumes", "will be removed in a future version") fs.StringVar(&f.ExperimentalMounterPath, "experimental-mounter-path", f.ExperimentalMounterPath, "[Experimental] Path of mounter binary. Leave empty to use the default mount.") fs.MarkDeprecated("experimental-mounter-path", "will be removed in 1.25 or later. in favor of using CSI.") fs.StringVar(&f.CloudConfigFile, "cloud-config", f.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index e3aaf264f6c..d8d15144d85 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -1313,7 +1313,6 @@ func createAndInitKubelet(kubeServer *options.KubeletServer, kubeServer.MaxPerPodContainerCount, kubeServer.MaxContainerCount, kubeServer.RegisterSchedulable, - kubeServer.KeepTerminatedPodVolumes, kubeServer.NodeLabels, kubeServer.NodeStatusMaxImages, kubeServer.KubeletFlags.SeccompDefault || kubeServer.KubeletConfiguration.SeccompDefault) diff --git a/pkg/controller/volume/attachdetach/attach_detach_controller.go b/pkg/controller/volume/attachdetach/attach_detach_controller.go index 3daab2d6e87..78a01ab6a53 100644 --- a/pkg/controller/volume/attachdetach/attach_detach_controller.go +++ b/pkg/controller/volume/attachdetach/attach_detach_controller.go @@ -887,15 +887,9 @@ func (adc *attachDetachController) GetExec(pluginName string) utilexec.Interface func (adc *attachDetachController) addNodeToDswp(node *v1.Node, nodeName types.NodeName) { if _, exists := node.Annotations[volumeutil.ControllerManagedAttachAnnotation]; exists { - keepTerminatedPodVolumes := false - - if t, ok := node.Annotations[volumeutil.KeepTerminatedPodVolumesAnnotation]; ok { - keepTerminatedPodVolumes = t == "true" - } - // Node specifies annotation indicating it should be managed by attach // detach controller. Add it to desired state of world. - adc.desiredStateOfWorld.AddNode(nodeName, keepTerminatedPodVolumes) + adc.desiredStateOfWorld.AddNode(nodeName) } } diff --git a/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go b/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go index 32f60694f7b..6239f47ef69 100644 --- a/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go +++ b/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go @@ -25,7 +25,7 @@ import ( "fmt" "sync" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" k8stypes "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" @@ -46,9 +46,7 @@ type DesiredStateOfWorld interface { // AddNode adds the given node to the list of nodes managed by the attach/ // detach controller. // If the node already exists this is a no-op. - // keepTerminatedPodVolumes is a property of the node that determines - // if volumes should be mounted and attached for terminated pods. - AddNode(nodeName k8stypes.NodeName, keepTerminatedPodVolumes bool) + AddNode(nodeName k8stypes.NodeName) // AddPod adds the given pod to the list of pods that reference the // specified volume and is scheduled to the specified node. @@ -98,10 +96,6 @@ type DesiredStateOfWorld interface { // state of world GetPodToAdd() map[types.UniquePodName]PodToAdd - // GetKeepTerminatedPodVolumesForNode determines if node wants volumes to be - // mounted and attached for terminated pods - GetKeepTerminatedPodVolumesForNode(k8stypes.NodeName) bool - // Mark multi-attach error as reported to prevent spamming multiple // events for same error SetMultiAttachError(v1.UniqueVolumeName, k8stypes.NodeName) @@ -158,10 +152,6 @@ type nodeManaged struct { // attached to this node. The key in the map is the name of the volume and // the value is a volumeToAttach object containing more information about the volume. volumesToAttach map[v1.UniqueVolumeName]volumeToAttach - - // keepTerminatedPodVolumes determines if for terminated pods(on this node) - volumes - // should be kept mounted and attached. - keepTerminatedPodVolumes bool } // The volumeToAttach object represents a volume that should be attached to a node. @@ -195,15 +185,14 @@ type pod struct { podObj *v1.Pod } -func (dsw *desiredStateOfWorld) AddNode(nodeName k8stypes.NodeName, keepTerminatedPodVolumes bool) { +func (dsw *desiredStateOfWorld) AddNode(nodeName k8stypes.NodeName) { dsw.Lock() defer dsw.Unlock() if _, nodeExists := dsw.nodesManaged[nodeName]; !nodeExists { dsw.nodesManaged[nodeName] = nodeManaged{ - nodeName: nodeName, - volumesToAttach: make(map[v1.UniqueVolumeName]volumeToAttach), - keepTerminatedPodVolumes: keepTerminatedPodVolumes, + nodeName: nodeName, + volumesToAttach: make(map[v1.UniqueVolumeName]volumeToAttach), } } } @@ -356,21 +345,6 @@ func (dsw *desiredStateOfWorld) SetMultiAttachError( } } -// GetKeepTerminatedPodVolumesForNode determines if node wants volumes to be -// mounted and attached for terminated pods -func (dsw *desiredStateOfWorld) GetKeepTerminatedPodVolumesForNode(nodeName k8stypes.NodeName) bool { - dsw.RLock() - defer dsw.RUnlock() - - if nodeName == "" { - return false - } - if node, ok := dsw.nodesManaged[nodeName]; ok { - return node.keepTerminatedPodVolumes - } - return false -} - func (dsw *desiredStateOfWorld) GetVolumesToAttach() []VolumeToAttach { dsw.RLock() defer dsw.RUnlock() diff --git a/pkg/controller/volume/attachdetach/cache/desired_state_of_world_test.go b/pkg/controller/volume/attachdetach/cache/desired_state_of_world_test.go index c4a974acad9..927b410ae95 100644 --- a/pkg/controller/volume/attachdetach/cache/desired_state_of_world_test.go +++ b/pkg/controller/volume/attachdetach/cache/desired_state_of_world_test.go @@ -19,7 +19,7 @@ package cache import ( "testing" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" k8stypes "k8s.io/apimachinery/pkg/types" controllervolumetesting "k8s.io/kubernetes/pkg/controller/volume/attachdetach/testing" volumetesting "k8s.io/kubernetes/pkg/volume/testing" @@ -35,7 +35,7 @@ func Test_AddNode_Positive_NewNode(t *testing.T) { nodeName := k8stypes.NodeName("node-name") // Act - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) // Assert nodeExists := dsw.NodeExists(nodeName) @@ -60,7 +60,7 @@ func Test_AddNode_Positive_ExistingNode(t *testing.T) { nodeName := k8stypes.NodeName("node-name") // Act - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) // Assert nodeExists := dsw.NodeExists(nodeName) @@ -69,7 +69,7 @@ func Test_AddNode_Positive_ExistingNode(t *testing.T) { } // Act - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) // Assert nodeExists = dsw.NodeExists(nodeName) @@ -94,7 +94,7 @@ func Test_AddPod_Positive_NewPodNodeExistsVolumeDoesntExist(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) volumeExists := dsw.VolumeExists(volumeName, nodeName) if volumeExists { t.Fatalf( @@ -142,7 +142,7 @@ func Test_AddPod_Positive_NewPodNodeExistsVolumeExists(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) volumeExists := dsw.VolumeExists(volumeName, nodeName) if volumeExists { t.Fatalf( @@ -215,7 +215,7 @@ func Test_AddPod_Positive_PodExistsNodeExistsVolumeExists(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) volumeExists := dsw.VolumeExists(volumeName, nodeName) if volumeExists { t.Fatalf( @@ -319,7 +319,7 @@ func Test_DeleteNode_Positive_NodeExists(t *testing.T) { volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) dsw := NewDesiredStateOfWorld(volumePluginMgr) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) // Act err := dsw.DeleteNode(nodeName) @@ -375,7 +375,7 @@ func Test_DeleteNode_Negative_NodeExistsHasChildVolumes(t *testing.T) { volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) dsw := NewDesiredStateOfWorld(volumePluginMgr) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) podName := "pod-uid" volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) @@ -419,7 +419,7 @@ func Test_DeletePod_Positive_PodExistsNodeExistsVolumeExists(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) generatedVolumeName, podAddErr := dsw.AddPod(types.UniquePodName(podName), controllervolumetesting.NewPod(podName, podName), volumeSpec, nodeName) if podAddErr != nil { t.Fatalf( @@ -467,7 +467,7 @@ func Test_DeletePod_Positive_2PodsExistNodeExistsVolumesExist(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) generatedVolumeName1, pod1AddErr := dsw.AddPod(types.UniquePodName(pod1Name), controllervolumetesting.NewPod(pod1Name, pod1Name), volumeSpec, nodeName) if pod1AddErr != nil { t.Fatalf( @@ -528,7 +528,7 @@ func Test_DeletePod_Positive_PodDoesNotExist(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) generatedVolumeName, pod1AddErr := dsw.AddPod(types.UniquePodName(pod1Name), controllervolumetesting.NewPod(pod1Name, pod1Name), volumeSpec, nodeName) if pod1AddErr != nil { t.Fatalf( @@ -576,7 +576,7 @@ func Test_DeletePod_Positive_NodeDoesNotExist(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) node1Name := k8stypes.NodeName("node1-name") - dsw.AddNode(node1Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node1Name) generatedVolumeName, podAddErr := dsw.AddPod(types.UniquePodName(podName), controllervolumetesting.NewPod(podName, podName), volumeSpec, node1Name) if podAddErr != nil { t.Fatalf( @@ -631,7 +631,7 @@ func Test_DeletePod_Positive_VolumeDoesNotExist(t *testing.T) { volume1Name := v1.UniqueVolumeName("volume1-name") volume1Spec := controllervolumetesting.GetTestVolumeSpec(string(volume1Name), volume1Name) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) generatedVolume1Name, podAddErr := dsw.AddPod(types.UniquePodName(podName), controllervolumetesting.NewPod(podName, podName), volume1Spec, nodeName) if podAddErr != nil { t.Fatalf( @@ -705,7 +705,7 @@ func Test_NodeExists_Positive_NodeDoesntExist(t *testing.T) { volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) dsw := NewDesiredStateOfWorld(volumePluginMgr) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) // Act nodeExists := dsw.NodeExists(nodeName) @@ -729,7 +729,7 @@ func Test_VolumeExists_Positive_VolumeExistsNodeExists(t *testing.T) { volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) dsw := NewDesiredStateOfWorld(volumePluginMgr) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) podName := "pod-uid" volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) @@ -759,7 +759,7 @@ func Test_VolumeExists_Positive_VolumeDoesntExistNodeExists(t *testing.T) { volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) dsw := NewDesiredStateOfWorld(volumePluginMgr) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) podName := "pod-uid" volume1Name := v1.UniqueVolumeName("volume1-name") volume1Spec := controllervolumetesting.GetTestVolumeSpec(string(volume1Name), volume1Name) @@ -836,8 +836,8 @@ func Test_GetVolumesToAttach_Positive_TwoNodes(t *testing.T) { dsw := NewDesiredStateOfWorld(volumePluginMgr) node1Name := k8stypes.NodeName("node1-name") node2Name := k8stypes.NodeName("node2-name") - dsw.AddNode(node1Name, false /*keepTerminatedPodVolumes*/) - dsw.AddNode(node2Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node1Name) + dsw.AddNode(node2Name) // Act volumesToAttach := dsw.GetVolumesToAttach() @@ -859,7 +859,7 @@ func Test_GetVolumesToAttach_Positive_TwoNodesOneVolumeEach(t *testing.T) { pod1Name := "pod1-uid" volume1Name := v1.UniqueVolumeName("volume1-name") volume1Spec := controllervolumetesting.GetTestVolumeSpec(string(volume1Name), volume1Name) - dsw.AddNode(node1Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node1Name) generatedVolume1Name, podAddErr := dsw.AddPod(types.UniquePodName(pod1Name), controllervolumetesting.NewPod(pod1Name, pod1Name), volume1Spec, node1Name) if podAddErr != nil { t.Fatalf( @@ -871,7 +871,7 @@ func Test_GetVolumesToAttach_Positive_TwoNodesOneVolumeEach(t *testing.T) { pod2Name := "pod2-uid" volume2Name := v1.UniqueVolumeName("volume2-name") volume2Spec := controllervolumetesting.GetTestVolumeSpec(string(volume2Name), volume2Name) - dsw.AddNode(node2Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node2Name) generatedVolume2Name, podAddErr := dsw.AddPod(types.UniquePodName(pod2Name), controllervolumetesting.NewPod(pod2Name, pod2Name), volume2Spec, node2Name) if podAddErr != nil { t.Fatalf( @@ -904,7 +904,7 @@ func Test_GetVolumesToAttach_Positive_TwoNodesOneVolumeEachExtraPod(t *testing.T pod1Name := "pod1-uid" volume1Name := v1.UniqueVolumeName("volume1-name") volume1Spec := controllervolumetesting.GetTestVolumeSpec(string(volume1Name), volume1Name) - dsw.AddNode(node1Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node1Name) generatedVolume1Name, podAddErr := dsw.AddPod(types.UniquePodName(pod1Name), controllervolumetesting.NewPod(pod1Name, pod1Name), volume1Spec, node1Name) if podAddErr != nil { t.Fatalf( @@ -916,7 +916,7 @@ func Test_GetVolumesToAttach_Positive_TwoNodesOneVolumeEachExtraPod(t *testing.T pod2Name := "pod2-uid" volume2Name := v1.UniqueVolumeName("volume2-name") volume2Spec := controllervolumetesting.GetTestVolumeSpec(string(volume2Name), volume2Name) - dsw.AddNode(node2Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node2Name) generatedVolume2Name, podAddErr := dsw.AddPod(types.UniquePodName(pod2Name), controllervolumetesting.NewPod(pod2Name, pod2Name), volume2Spec, node2Name) if podAddErr != nil { t.Fatalf( @@ -958,7 +958,7 @@ func Test_GetVolumesToAttach_Positive_TwoNodesThreeVolumes(t *testing.T) { pod1Name := "pod1-uid" volume1Name := v1.UniqueVolumeName("volume1-name") volume1Spec := controllervolumetesting.GetTestVolumeSpec(string(volume1Name), volume1Name) - dsw.AddNode(node1Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node1Name) generatedVolume1Name, podAddErr := dsw.AddPod(types.UniquePodName(pod1Name), controllervolumetesting.NewPod(pod1Name, pod1Name), volume1Spec, node1Name) if podAddErr != nil { t.Fatalf( @@ -970,7 +970,7 @@ func Test_GetVolumesToAttach_Positive_TwoNodesThreeVolumes(t *testing.T) { pod2aName := "pod2a-name" volume2Name := v1.UniqueVolumeName("volume2-name") volume2Spec := controllervolumetesting.GetTestVolumeSpec(string(volume2Name), volume2Name) - dsw.AddNode(node2Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node2Name) generatedVolume2Name1, podAddErr := dsw.AddPod(types.UniquePodName(pod2aName), controllervolumetesting.NewPod(pod2aName, pod2aName), volume2Spec, node2Name) if podAddErr != nil { t.Fatalf( @@ -1042,7 +1042,7 @@ func Test_GetPodsOnNodes(t *testing.T) { pod1Name := "pod1-uid" volume1Name := v1.UniqueVolumeName("volume1-name") volume1Spec := controllervolumetesting.GetTestVolumeSpec(string(volume1Name), volume1Name) - dsw.AddNode(node1Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node1Name) generatedVolume1Name, podAddErr := dsw.AddPod(types.UniquePodName(pod1Name), controllervolumetesting.NewPod(pod1Name, pod1Name), volume1Spec, node1Name) if podAddErr != nil { t.Fatalf( @@ -1054,7 +1054,7 @@ func Test_GetPodsOnNodes(t *testing.T) { pod2Name := "pod2-uid" volume2Name := v1.UniqueVolumeName("volume2-name") volume2Spec := controllervolumetesting.GetTestVolumeSpec(string(volume2Name), volume2Name) - dsw.AddNode(node2Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node2Name) _, podAddErr = dsw.AddPod(types.UniquePodName(pod2Name), controllervolumetesting.NewPod(pod2Name, pod2Name), volume2Spec, node2Name) if podAddErr != nil { t.Fatalf( @@ -1065,7 +1065,7 @@ func Test_GetPodsOnNodes(t *testing.T) { // Third node without any pod node3Name := k8stypes.NodeName("node3-name") - dsw.AddNode(node3Name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(node3Name) // Act pods := dsw.GetVolumePodsOnNodes([]k8stypes.NodeName{node1Name, node2Name, node3Name, "non-existing-node"}, generatedVolume1Name) diff --git a/pkg/controller/volume/attachdetach/metrics/metrics_test.go b/pkg/controller/volume/attachdetach/metrics/metrics_test.go index c0beae37810..a8c649f4e2e 100644 --- a/pkg/controller/volume/attachdetach/metrics/metrics_test.go +++ b/pkg/controller/volume/attachdetach/metrics/metrics_test.go @@ -147,7 +147,7 @@ func TestTotalVolumesMetricCollection(t *testing.T) { volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false) + dsw.AddNode(nodeName) _, err := dsw.AddPod(types.UniquePodName(podName), controllervolumetesting.NewPod(podName, podName), volumeSpec, nodeName) if err != nil { t.Fatalf("Expected no error, got %v", err) diff --git a/pkg/controller/volume/attachdetach/populator/desired_state_of_world_populator_test.go b/pkg/controller/volume/attachdetach/populator/desired_state_of_world_populator_test.go index c8f419eda3e..788091681c1 100644 --- a/pkg/controller/volume/attachdetach/populator/desired_state_of_world_populator_test.go +++ b/pkg/controller/volume/attachdetach/populator/desired_state_of_world_populator_test.go @@ -91,7 +91,7 @@ func TestFindAndAddActivePods_FindAndRemoveDeletedPods(t *testing.T) { } //add the given node to the list of nodes managed by dsw - dswp.desiredStateOfWorld.AddNode(k8stypes.NodeName(pod.Spec.NodeName), false /*keepTerminatedPodVolumes*/) + dswp.desiredStateOfWorld.AddNode(k8stypes.NodeName(pod.Spec.NodeName)) logger, _ := ktesting.NewTestContext(t) dswp.findAndAddActivePods(logger) @@ -196,7 +196,7 @@ func TestFindAndRemoveNonattachableVolumes(t *testing.T) { } //add the given node to the list of nodes managed by dsw - dswp.desiredStateOfWorld.AddNode(k8stypes.NodeName(pod.Spec.NodeName), false /*keepTerminatedPodVolumes*/) + dswp.desiredStateOfWorld.AddNode(k8stypes.NodeName(pod.Spec.NodeName)) logger, _ := ktesting.NewTestContext(t) dswp.findAndAddActivePods(logger) diff --git a/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go b/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go index dee055613fa..a3f572acc7f 100644 --- a/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go +++ b/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go @@ -116,7 +116,7 @@ func Test_Run_Positive_OneDesiredVolumeAttach(t *testing.T) { volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) volumeExists := dsw.VolumeExists(volumeName, nodeName) if volumeExists { t.Fatalf( @@ -170,7 +170,7 @@ func Test_Run_Positive_OneDesiredVolumeAttachThenDetachWithUnmountedVolume(t *te volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) volumeExists := dsw.VolumeExists(volumeName, nodeName) if volumeExists { t.Fatalf( @@ -248,7 +248,7 @@ func Test_Run_Positive_OneDesiredVolumeAttachThenDetachWithMountedVolume(t *test volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) volumeExists := dsw.VolumeExists(volumeName, nodeName) if volumeExists { @@ -327,7 +327,7 @@ func Test_Run_Negative_OneDesiredVolumeAttachThenDetachWithUnmountedVolumeUpdate volumeName := v1.UniqueVolumeName("volume-name") volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) nodeName := k8stypes.NodeName("node-name") - dsw.AddNode(nodeName, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName) volumeExists := dsw.VolumeExists(volumeName, nodeName) if volumeExists { t.Fatalf( @@ -408,8 +408,8 @@ func Test_Run_OneVolumeAttachAndDetachMultipleNodesWithReadWriteMany(t *testing. volumeSpec.PersistentVolume.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteMany} nodeName1 := k8stypes.NodeName("node-name1") nodeName2 := k8stypes.NodeName(volumetesting.MultiAttachNode) - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) - dsw.AddNode(nodeName2, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) + dsw.AddNode(nodeName2) generatedVolumeName, podAddErr := dsw.AddPod(types.UniquePodName(podName1), controllervolumetesting.NewPod(podName1, podName1), volumeSpec, nodeName1) if podAddErr != nil { @@ -503,8 +503,8 @@ func Test_Run_OneVolumeAttachAndDetachMultipleNodesWithReadWriteOnce(t *testing. volumeSpec.PersistentVolume.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} nodeName1 := k8stypes.NodeName("node-name1") nodeName2 := k8stypes.NodeName("node-name2") - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) - dsw.AddNode(nodeName2, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) + dsw.AddNode(nodeName2) // Add both pods at the same time to provoke a potential race condition in the reconciler generatedVolumeName, podAddErr := dsw.AddPod(types.UniquePodName(podName1), controllervolumetesting.NewPod(podName1, podName1), volumeSpec, nodeName1) @@ -596,8 +596,8 @@ func Test_Run_OneVolumeAttachAndDetachUncertainNodesWithReadWriteOnce(t *testing volumeSpec.PersistentVolume.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} nodeName1 := k8stypes.NodeName(volumetesting.UncertainAttachNode) nodeName2 := k8stypes.NodeName("node-name2") - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) - dsw.AddNode(nodeName2, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) + dsw.AddNode(nodeName2) // Act logger, ctx := ktesting.NewTestContext(t) @@ -660,7 +660,7 @@ func Test_Run_UpdateNodeStatusFailBeforeOneVolumeDetachNodeWithReadWriteOnce(t * volumeSpec := controllervolumetesting.GetTestVolumeSpec(string(volumeName), volumeName) volumeSpec.PersistentVolume.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} nodeName1 := k8stypes.NodeName("node-name1") - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) // Add the pod in which the volume is attached to the FailDetachNode generatedVolumeName, podAddErr := dsw.AddPod(types.UniquePodName(podName1), controllervolumetesting.NewPod(podName1, podName1), volumeSpec, nodeName1) @@ -722,8 +722,8 @@ func Test_Run_OneVolumeDetachFailNodeWithReadWriteOnce(t *testing.T) { volumeSpec.PersistentVolume.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} nodeName1 := k8stypes.NodeName(volumetesting.FailDetachNode) nodeName2 := k8stypes.NodeName("node-name2") - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) - dsw.AddNode(nodeName2, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) + dsw.AddNode(nodeName2) // Act logger, ctx := ktesting.NewTestContext(t) @@ -802,8 +802,8 @@ func Test_Run_OneVolumeAttachAndDetachTimeoutNodesWithReadWriteOnce(t *testing.T volumeSpec.PersistentVolume.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} nodeName1 := k8stypes.NodeName(volumetesting.TimeoutAttachNode) nodeName2 := k8stypes.NodeName("node-name2") - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) - dsw.AddNode(nodeName2, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) + dsw.AddNode(nodeName2) // Act logger, ctx := ktesting.NewTestContext(t) @@ -881,7 +881,7 @@ func Test_Run_OneVolumeDetachOnOutOfServiceTaintedNode(t *testing.T) { }, } informerFactory.Core().V1().Nodes().Informer().GetStore().Add(node1) - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) volumeExists := dsw.VolumeExists(volumeName1, nodeName1) if volumeExists { t.Fatalf( @@ -962,7 +962,7 @@ func Test_Run_OneVolumeDetachOnNoOutOfServiceTaintedNode(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: string(nodeName1)}, } informerFactory.Core().V1().Nodes().Informer().GetStore().Add(node1) - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) volumeExists := dsw.VolumeExists(volumeName1, nodeName1) if volumeExists { t.Fatalf( @@ -1047,7 +1047,7 @@ func Test_Run_OneVolumeDetachOnUnhealthyNode(t *testing.T) { }, } informerFactory.Core().V1().Nodes().Informer().GetStore().Add(node1) - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) volumeExists := dsw.VolumeExists(volumeName1, nodeName1) if volumeExists { t.Fatalf( @@ -1162,7 +1162,7 @@ func Test_Run_OneVolumeDetachOnUnhealthyNodeWithForceDetachOnUnmountDisabled(t * if addErr != nil { t.Fatalf("Add node failed. Expected: Actual: <%v>", addErr) } - dsw.AddNode(nodeName1, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(nodeName1) volumeExists := dsw.VolumeExists(volumeName1, nodeName1) if volumeExists { t.Fatalf( @@ -1307,7 +1307,7 @@ func Test_ReportMultiAttachError(t *testing.T) { nodes := []k8stypes.NodeName{} for _, n := range test.nodes { - dsw.AddNode(n.name, false /*keepTerminatedPodVolumes*/) + dsw.AddNode(n.name) nodes = append(nodes, n.name) for _, podName := range n.podNames { volumeName := v1.UniqueVolumeName("volume-name") diff --git a/pkg/controller/volume/attachdetach/util/util.go b/pkg/controller/volume/attachdetach/util/util.go index 32fdb1e8238..c7c9a62cd64 100644 --- a/pkg/controller/volume/attachdetach/util/util.go +++ b/pkg/controller/volume/attachdetach/util/util.go @@ -174,11 +174,7 @@ func DetermineVolumeAction(pod *v1.Pod, desiredStateOfWorld cache.DesiredStateOf } if util.IsPodTerminated(pod, pod.Status) { - nodeName := types.NodeName(pod.Spec.NodeName) - keepTerminatedPodVolume := desiredStateOfWorld.GetKeepTerminatedPodVolumesForNode(nodeName) - // if pod is terminate we let kubelet policy dictate if volume - // should be detached or not - return keepTerminatedPodVolume + return false } return defaultAction } diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 687c74511ec..7c6d614e959 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -360,7 +360,6 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, maxPerPodContainerCount int32, maxContainerCount int32, registerSchedulable bool, - keepTerminatedPodVolumes bool, nodeLabels map[string]string, nodeStatusMaxImages int32, seccompDefault bool, @@ -561,7 +560,6 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, clock: clock.RealClock{}, enableControllerAttachDetach: kubeCfg.EnableControllerAttachDetach, makeIPTablesUtilChains: kubeCfg.MakeIPTablesUtilChains, - keepTerminatedPodVolumes: keepTerminatedPodVolumes, nodeStatusMaxImages: nodeStatusMaxImages, tracer: tracer, nodeStartupLatencyTracker: kubeDeps.NodeStartupLatencyTracker, @@ -849,7 +847,6 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, kubeDeps.HostUtil, klet.getPodsDir(), kubeDeps.Recorder, - keepTerminatedPodVolumes, volumepathhandler.NewBlockVolumePathHandler()) klet.backOff = flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff) @@ -1304,10 +1301,6 @@ type Kubelet struct { // StatsProvider provides the node and the container stats. StatsProvider *stats.Provider - // This flag, if set, instructs the kubelet to keep volumes from terminated pods mounted to the node. - // This can be useful for debugging volume related issues. - keepTerminatedPodVolumes bool // DEPRECATED - // pluginmanager runs a set of asynchronous loops that figure out which // plugins need to be registered/unregistered based on this node and makes it so. pluginManager pluginmanager.PluginManager @@ -2167,20 +2160,18 @@ func (kl *Kubelet) SyncTerminatedPod(ctx context.Context, pod *v1.Pod, podStatus } klog.V(4).InfoS("Pod termination unmounted volumes", "pod", klog.KObj(pod), "podUID", pod.UID) - if !kl.keepTerminatedPodVolumes { - // This waiting loop relies on the background cleanup which starts after pod workers respond - // true for ShouldPodRuntimeBeRemoved, which happens after `SyncTerminatingPod` is completed. - if err := wait.PollUntilContextCancel(ctx, 100*time.Millisecond, true, func(ctx context.Context) (bool, error) { - volumesExist := kl.podVolumesExist(pod.UID) - if volumesExist { - klog.V(3).InfoS("Pod is terminated, but some volumes have not been cleaned up", "pod", klog.KObj(pod), "podUID", pod.UID) - } - return !volumesExist, nil - }); err != nil { - return err + // This waiting loop relies on the background cleanup which starts after pod workers respond + // true for ShouldPodRuntimeBeRemoved, which happens after `SyncTerminatingPod` is completed. + if err := wait.PollUntilContextCancel(ctx, 100*time.Millisecond, true, func(ctx context.Context) (bool, error) { + volumesExist := kl.podVolumesExist(pod.UID) + if volumesExist { + klog.V(3).InfoS("Pod is terminated, but some volumes have not been cleaned up", "pod", klog.KObj(pod), "podUID", pod.UID) } - klog.V(3).InfoS("Pod termination cleaned up volume paths", "pod", klog.KObj(pod), "podUID", pod.UID) + return !volumesExist, nil + }); err != nil { + return err } + klog.V(3).InfoS("Pod termination cleaned up volume paths", "pod", klog.KObj(pod), "podUID", pod.UID) // After volume unmount is complete, let the secret and configmap managers know we're done with this pod if kl.secretManager != nil { diff --git a/pkg/kubelet/kubelet_node_status.go b/pkg/kubelet/kubelet_node_status.go index 496217d03d0..eb2fa170c5d 100644 --- a/pkg/kubelet/kubelet_node_status.go +++ b/pkg/kubelet/kubelet_node_status.go @@ -359,14 +359,6 @@ func (kl *Kubelet) initialNode(ctx context.Context) (*v1.Node, error) { klog.V(2).InfoS("Controller attach/detach is disabled for this node; Kubelet will attach and detach volumes") } - if kl.keepTerminatedPodVolumes { - if node.Annotations == nil { - node.Annotations = make(map[string]string) - } - klog.V(2).InfoS("Setting node annotation to keep pod volumes of terminated pods attached to the node") - node.Annotations[volutil.KeepTerminatedPodVolumesAnnotation] = "true" - } - // @question: should this be place after the call to the cloud provider? which also applies labels for k, v := range kl.nodeLabels { if cv, found := node.ObjectMeta.Labels[k]; found { diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index b93c8a3bd18..58b28eb77e2 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -2427,9 +2427,8 @@ func (kl *Kubelet) cleanupOrphanedPodCgroups(pcm cm.PodContainerManager, cgroupP // If volumes have not been unmounted/detached, do not delete the cgroup // so any memory backed volumes don't have their charges propagated to the // parent croup. If the volumes still exist, reduce the cpu shares for any - // process in the cgroup to the minimum value while we wait. if the kubelet - // is configured to keep terminated volumes, we will delete the cgroup and not block. - if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist && !kl.keepTerminatedPodVolumes { + // process in the cgroup to the minimum value while we wait. + if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist { klog.V(3).InfoS("Orphaned pod found, but volumes not yet removed. Reducing cpu to minimum", "podUID", uid) if err := pcm.ReduceCPULimits(val); err != nil { klog.InfoS("Failed to reduce cpu time for pod pending volume cleanup", "podUID", uid, "err", err) diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 2bbeaaf8db5..66deda10b43 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -392,7 +392,6 @@ func newTestKubeletWithImageList( kubelet.hostutil, kubelet.getPodsDir(), kubelet.recorder, - false, /* keepTerminatedPodVolumes */ volumetest.NewBlockVolumePathHandler()) kubelet.pluginManager = pluginmanager.NewPluginManager( @@ -3119,7 +3118,6 @@ func TestNewMainKubeletStandAlone(t *testing.T) { 1024, 110, true, - true, map[string]string{}, 1024, false, diff --git a/pkg/kubelet/runonce_test.go b/pkg/kubelet/runonce_test.go index 0a04bd95f78..8693b8d4a1e 100644 --- a/pkg/kubelet/runonce_test.go +++ b/pkg/kubelet/runonce_test.go @@ -122,7 +122,6 @@ func TestRunOnce(t *testing.T) { kb.hostutil, kb.getPodsDir(), kb.recorder, - false, /* keepTerminatedPodVolumes */ volumetest.NewBlockVolumePathHandler()) // TODO: Factor out "stats.Provider" from Kubelet so we don't have a cyclic dependency diff --git a/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go b/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go index fe1ce5ac715..1987c032722 100644 --- a/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go +++ b/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go @@ -99,7 +99,6 @@ func NewDesiredStateOfWorldPopulator( desiredStateOfWorld cache.DesiredStateOfWorld, actualStateOfWorld cache.ActualStateOfWorld, kubeContainerRuntime kubecontainer.Runtime, - keepTerminatedPodVolumes bool, csiMigratedPluginManager csimigration.PluginManager, intreeToCSITranslator csimigration.InTreeToCSITranslator, volumePluginMgr *volume.VolumePluginMgr) DesiredStateOfWorldPopulator { @@ -113,7 +112,6 @@ func NewDesiredStateOfWorldPopulator( pods: processedPods{ processedPods: make(map[volumetypes.UniquePodName]bool)}, kubeContainerRuntime: kubeContainerRuntime, - keepTerminatedPodVolumes: keepTerminatedPodVolumes, hasAddedPods: false, hasAddedPodsLock: sync.RWMutex{}, csiMigratedPluginManager: csiMigratedPluginManager, @@ -131,7 +129,6 @@ type desiredStateOfWorldPopulator struct { actualStateOfWorld cache.ActualStateOfWorld pods processedPods kubeContainerRuntime kubecontainer.Runtime - keepTerminatedPodVolumes bool hasAddedPods bool hasAddedPodsLock sync.RWMutex csiMigratedPluginManager csimigration.PluginManager @@ -234,9 +231,6 @@ func (dswp *desiredStateOfWorldPopulator) findAndRemoveDeletedPods() { if !dswp.podStateProvider.ShouldPodRuntimeBeRemoved(pod.UID) { continue } - if dswp.keepTerminatedPodVolumes { - continue - } } // Once a pod has been deleted from kubelet pod manager, do not delete diff --git a/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator_test.go b/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator_test.go index b2a35c1d50f..771703ca24b 100644 --- a/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator_test.go +++ b/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator_test.go @@ -1596,7 +1596,6 @@ func createDswpWithVolumeWithCustomPluginMgr(t *testing.T, pv *v1.PersistentVolu pods: processedPods{ processedPods: make(map[types.UniquePodName]bool)}, kubeContainerRuntime: fakeRuntime, - keepTerminatedPodVolumes: false, csiMigratedPluginManager: csimigration.NewPluginManager(csiTranslator, utilfeature.DefaultFeatureGate), intreeToCSITranslator: csiTranslator, volumePluginMgr: fakeVolumePluginMgr, diff --git a/pkg/kubelet/volumemanager/volume_manager.go b/pkg/kubelet/volumemanager/volume_manager.go index b34f21b62f6..f8b831665dd 100644 --- a/pkg/kubelet/volumemanager/volume_manager.go +++ b/pkg/kubelet/volumemanager/volume_manager.go @@ -182,7 +182,6 @@ func NewVolumeManager( hostutil hostutil.HostUtils, kubeletPodsDir string, recorder record.EventRecorder, - keepTerminatedPodVolumes bool, blockVolumePathHandler volumepathhandler.BlockVolumePathHandler) VolumeManager { seLinuxTranslator := util.NewSELinuxLabelTranslator() @@ -211,7 +210,6 @@ func NewVolumeManager( vm.desiredStateOfWorld, vm.actualStateOfWorld, kubeContainerRuntime, - keepTerminatedPodVolumes, csiMigratedPluginManager, intreeToCSITranslator, volumePluginMgr) diff --git a/pkg/kubelet/volumemanager/volume_manager_test.go b/pkg/kubelet/volumemanager/volume_manager_test.go index a17a780e431..b6736f3a268 100644 --- a/pkg/kubelet/volumemanager/volume_manager_test.go +++ b/pkg/kubelet/volumemanager/volume_manager_test.go @@ -415,7 +415,6 @@ func newTestVolumeManager(t *testing.T, tmpDir string, podManager kubepod.Manage hostutil.NewFakeHostUtil(nil), "", fakeRecorder, - false, /* keepTerminatedPodVolumes */ fakePathHandler) return vm diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go index 601dc646013..88ca7b83dfa 100644 --- a/pkg/volume/util/util.go +++ b/pkg/volume/util/util.go @@ -59,10 +59,6 @@ const ( // managed by the attach/detach controller ControllerManagedAttachAnnotation string = "volumes.kubernetes.io/controller-managed-attach-detach" - // KeepTerminatedPodVolumesAnnotation is the key of the annotation on Node - // that decides if pod volumes are unmounted when pod is terminated - KeepTerminatedPodVolumesAnnotation string = "volumes.kubernetes.io/keep-terminated-pod-volumes" - // MountsInGlobalPDPath is name of the directory appended to a volume plugin // name to create the place for volume mounts in the global PD path. MountsInGlobalPDPath = "mounts" diff --git a/test/integration/volume/attach_detach_test.go b/test/integration/volume/attach_detach_test.go index bb73e2a2fd9..da6f2f42302 100644 --- a/test/integration/volume/attach_detach_test.go +++ b/test/integration/volume/attach_detach_test.go @@ -286,78 +286,6 @@ func TestPodUpdateWithWithADC(t *testing.T) { waitForPodFuncInDSWP(t, ctrl.GetDesiredStateOfWorld(), 20*time.Second, "expected 0 pods in dsw after pod completion", 0) } -func TestPodUpdateWithKeepTerminatedPodVolumes(t *testing.T) { - // Disable ServiceAccount admission plugin as we don't have serviceaccount controller running. - server := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins=ServiceAccount"}, framework.SharedEtcd()) - defer server.TearDownFn() - namespaceName := "test-pod-update" - - node := &v1.Node{ - ObjectMeta: metav1.ObjectMeta{ - Name: "node-sandbox", - Annotations: map[string]string{ - util.ControllerManagedAttachAnnotation: "true", - util.KeepTerminatedPodVolumesAnnotation: "true", - }, - }, - } - - tCtx := ktesting.Init(t) - defer tCtx.Cancel("test has completed") - testClient, ctrl, pvCtrl, informers := createAdClients(tCtx, t, server, defaultSyncPeriod, defaultTimerConfig) - - ns := framework.CreateNamespaceOrDie(testClient, namespaceName, t) - defer framework.DeleteNamespaceOrDie(testClient, ns, t) - - pod := fakePodWithVol(namespaceName) - podStopCh := make(chan struct{}) - defer close(podStopCh) - - if _, err := testClient.CoreV1().Nodes().Create(context.TODO(), node, metav1.CreateOptions{}); err != nil { - t.Fatalf("Failed to created node : %v", err) - } - - go informers.Core().V1().Nodes().Informer().Run(podStopCh) - - if _, err := testClient.CoreV1().Pods(ns.Name).Create(context.TODO(), pod, metav1.CreateOptions{}); err != nil { - t.Errorf("Failed to create pod : %v", err) - } - - podInformer := informers.Core().V1().Pods().Informer() - go podInformer.Run(podStopCh) - - // start controller loop - go informers.Core().V1().PersistentVolumeClaims().Informer().Run(tCtx.Done()) - go informers.Core().V1().PersistentVolumes().Informer().Run(tCtx.Done()) - go informers.Storage().V1().VolumeAttachments().Informer().Run(tCtx.Done()) - initCSIObjects(tCtx.Done(), informers) - go ctrl.Run(tCtx) - // Run pvCtrl to avoid leaking goroutines started during its creation. - go pvCtrl.Run(tCtx) - - waitToObservePods(t, podInformer, 1) - podKey, err := cache.MetaNamespaceKeyFunc(pod) - if err != nil { - t.Fatalf("MetaNamespaceKeyFunc failed with : %v", err) - } - - _, _, err = podInformer.GetStore().GetByKey(podKey) - - if err != nil { - t.Fatalf("Pod not found in Pod Informer cache : %v", err) - } - - waitForPodsInDSWP(t, ctrl.GetDesiredStateOfWorld()) - - pod.Status.Phase = v1.PodSucceeded - - if _, err := testClient.CoreV1().Pods(ns.Name).UpdateStatus(context.TODO(), pod, metav1.UpdateOptions{}); err != nil { - t.Errorf("Failed to update pod : %v", err) - } - - waitForPodFuncInDSWP(t, ctrl.GetDesiredStateOfWorld(), 20*time.Second, "expected non-zero pods in dsw if KeepTerminatedPodVolumesAnnotation is set", 1) -} - // wait for the podInformer to observe the pods. Call this function before // running the RC manager to prevent the rc manager from creating new pods // rather than adopting the existing ones.