From 0eaceb7eb53a5e25273223c1f0e5d0e3974c8e44 Mon Sep 17 00:00:00 2001 From: fighterhit Date: Sat, 21 Nov 2020 21:56:20 +0800 Subject: [PATCH 1/3] Fix: kubelet return error when device plugin sets PreStartRequired true while creating pods with 0 resource --- pkg/kubelet/cm/devicemanager/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/cm/devicemanager/manager.go b/pkg/kubelet/cm/devicemanager/manager.go index 95cf058f1a7..a1adfd37be7 100644 --- a/pkg/kubelet/cm/devicemanager/manager.go +++ b/pkg/kubelet/cm/devicemanager/manager.go @@ -932,9 +932,9 @@ func (m *ManagerImpl) GetDeviceRunContainerOptions(pod *v1.Pod, container *v1.Co podUID := string(pod.UID) contName := container.Name needsReAllocate := false - for k := range container.Resources.Limits { + for k, v := range container.Resources.Limits { resource := string(k) - if !m.isDevicePluginResource(resource) { + if !m.isDevicePluginResource(resource) || v.Value() == 0 { continue } err := m.callPreStartContainerIfNeeded(podUID, contName, resource) From 24dd9b1f0425029654edfd884a698627d6be4713 Mon Sep 17 00:00:00 2001 From: fighterhit Date: Wed, 13 Jan 2021 11:27:30 +0800 Subject: [PATCH 2/3] add a test to demonstrate PR#96781 --- pkg/kubelet/cm/devicemanager/manager_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pkg/kubelet/cm/devicemanager/manager_test.go b/pkg/kubelet/cm/devicemanager/manager_test.go index 9034498c66f..d450fdf9a6c 100644 --- a/pkg/kubelet/cm/devicemanager/manager_test.go +++ b/pkg/kubelet/cm/devicemanager/manager_test.go @@ -976,6 +976,21 @@ func TestDevicePreStartContainer(t *testing.T) { as.Equal(len(runContainerOpts.Devices), len(expectedResp.Devices)) as.Equal(len(runContainerOpts.Mounts), len(expectedResp.Mounts)) as.Equal(len(runContainerOpts.Envs), len(expectedResp.Envs)) + + pod2 := makePod(v1.ResourceList{ + v1.ResourceName(res1.resourceName): *resource.NewQuantity(int64(0), resource.DecimalSI)}) + activePods = append(activePods, pod2) + podsStub.updateActivePods(activePods) + err = testManager.Allocate(pod2, &pod2.Spec.Containers[0]) + as.Nil(err) + runContainerOpts, err = testManager.GetDeviceRunContainerOptions(pod2, &pod2.Spec.Containers[0]) + as.Nil(err) + select { + case <-time.After(time.Millisecond): + t.Log("When pod resourceQuantity is 0, PreStartContainer RPC stub will be skipped") + case initializedDevs = <-ch: + break + } } func TestResetExtendedResource(t *testing.T) { From 16c6b99fcd69e92d71505ce565f24b9a00d1f800 Mon Sep 17 00:00:00 2001 From: fighterhit Date: Wed, 13 Jan 2021 12:43:54 +0800 Subject: [PATCH 3/3] del unused value --- pkg/kubelet/cm/devicemanager/manager_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/cm/devicemanager/manager_test.go b/pkg/kubelet/cm/devicemanager/manager_test.go index d450fdf9a6c..63471dd3dbb 100644 --- a/pkg/kubelet/cm/devicemanager/manager_test.go +++ b/pkg/kubelet/cm/devicemanager/manager_test.go @@ -983,12 +983,12 @@ func TestDevicePreStartContainer(t *testing.T) { podsStub.updateActivePods(activePods) err = testManager.Allocate(pod2, &pod2.Spec.Containers[0]) as.Nil(err) - runContainerOpts, err = testManager.GetDeviceRunContainerOptions(pod2, &pod2.Spec.Containers[0]) + _, err = testManager.GetDeviceRunContainerOptions(pod2, &pod2.Spec.Containers[0]) as.Nil(err) select { case <-time.After(time.Millisecond): t.Log("When pod resourceQuantity is 0, PreStartContainer RPC stub will be skipped") - case initializedDevs = <-ch: + case <-ch: break } }