Merge pull request #101524 from rphillips/add_sync_to_killpod_2

kubelet: do not cleanup volumes if pod is being killed
This commit is contained in:
Kubernetes Prow Robot 2021-04-29 18:10:36 -07:00 committed by GitHub
commit 2b8a7809b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 8 deletions

View File

@ -119,7 +119,9 @@ type TestKubelet struct {
func (tk *TestKubelet) Cleanup() {
if tk.kubelet != nil {
tk.kubelet.podKiller.Close()
os.RemoveAll(tk.kubelet.rootDirectory)
tk.kubelet = nil
}
}
@ -292,6 +294,7 @@ func newTestKubeletWithImageList(
kubelet.backOff = flowcontrol.NewBackOff(time.Second, time.Minute)
kubelet.backOff.Clock = fakeClock
kubelet.podKiller = NewPodKiller(kubelet)
go kubelet.podKiller.PerformPodKillingWork()
kubelet.resyncInterval = 10 * time.Second
kubelet.workQueue = queue.NewBasicWorkQueue(fakeClock)
// Relist period does not affect the tests.
@ -420,9 +423,7 @@ func TestSyncPodsStartPod(t *testing.T) {
func TestHandlePodCleanupsPerQOS(t *testing.T) {
testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */)
go testKubelet.kubelet.podKiller.PerformPodKillingWork()
defer testKubelet.Cleanup()
defer testKubelet.kubelet.podKiller.Close()
pod := &kubecontainer.Pod{
ID: "12345678",
@ -612,9 +613,7 @@ func TestDispatchWorkOfActivePod(t *testing.T) {
func TestHandlePodCleanups(t *testing.T) {
testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */)
go testKubelet.kubelet.podKiller.PerformPodKillingWork()
defer testKubelet.Cleanup()
defer testKubelet.kubelet.podKiller.Close()
pod := &kubecontainer.Pod{
ID: "12345678",
@ -643,8 +642,6 @@ func TestHandlePodRemovesWhenSourcesAreReady(t *testing.T) {
testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */)
defer testKubelet.Cleanup()
go testKubelet.kubelet.podKiller.PerformPodKillingWork()
defer testKubelet.kubelet.podKiller.Close()
fakePod := &kubecontainer.Pod{
ID: "1",
@ -683,8 +680,6 @@ func TestHandlePodRemovesWhenSourcesAreReady(t *testing.T) {
func TestKillPodFollwedByIsPodPendingTermination(t *testing.T) {
testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */)
defer testKubelet.Cleanup()
defer testKubelet.kubelet.podKiller.Close()
go testKubelet.kubelet.podKiller.PerformPodKillingWork()
pod := &kubecontainer.Pod{
ID: "12345678",
@ -1596,6 +1591,12 @@ func syncAndVerifyPodDir(t *testing.T, testKubelet *TestKubelet, pods []*v1.Pod,
kl.podManager.SetPods(pods)
kl.HandlePodSyncs(pods)
kl.HandlePodCleanups()
// The first time HandlePodCleanups() is run the pod is placed into the
// podKiller, and bypasses the pod directory cleanup. The pod is
// already killed in the second run to HandlePodCleanups() and will
// cleanup the directories.
time.Sleep(2 * time.Second)
kl.HandlePodCleanups()
for i, pod := range podsToCheck {
exist := dirExists(kl.getPodDir(pod.UID))
assert.Equal(t, shouldExist, exist, "directory of pod %d", i)

View File

@ -133,6 +133,11 @@ func (kl *Kubelet) cleanupOrphanedPodDirs(pods []*v1.Pod, runningPods []*kubecon
if allPods.Has(string(uid)) {
continue
}
// if the pod is within termination grace period, we shouldn't cleanup the underlying volumes
if kl.podKiller.IsPodPendingTerminationByUID(uid) {
klog.V(3).InfoS("Pod is pending termination", "podUID", uid)
continue
}
// If volumes have not been unmounted/detached, do not delete directory.
// Doing so may result in corruption of data.
// TODO: getMountedVolumePathListFromDisk() call may be redundant with