From 7378b5e6906d6026a24a19a1f9fb210c7a9b8504 Mon Sep 17 00:00:00 2001 From: Tim Allclair Date: Thu, 7 Nov 2024 13:04:10 -0800 Subject: [PATCH 1/4] Graduate InPlacePodVerticalScaling to Beta --- pkg/features/versioned_kube_features.go | 1 + .../featuregates_linter/test_data/versioned_feature_list.yaml | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/pkg/features/versioned_kube_features.go b/pkg/features/versioned_kube_features.go index 9b8bbc6958f..585a77d9fc7 100644 --- a/pkg/features/versioned_kube_features.go +++ b/pkg/features/versioned_kube_features.go @@ -404,6 +404,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate InPlacePodVerticalScaling: { {Version: version.MustParse("1.27"), Default: false, PreRelease: featuregate.Alpha}, + {Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.Beta}, }, InPlacePodVerticalScalingAllocatedStatus: { diff --git a/test/featuregates_linter/test_data/versioned_feature_list.yaml b/test/featuregates_linter/test_data/versioned_feature_list.yaml index 3e355898dd7..eaa73a9a73a 100644 --- a/test/featuregates_linter/test_data/versioned_feature_list.yaml +++ b/test/featuregates_linter/test_data/versioned_feature_list.yaml @@ -540,6 +540,10 @@ lockToDefault: false preRelease: Alpha version: "1.27" + - default: true + lockToDefault: false + preRelease: Beta + version: "1.32" - name: InPlacePodVerticalScalingAllocatedStatus versionedSpecs: - default: false From 479b300227e38e41dd3fcd13e09e04cdeb05e339 Mon Sep 17 00:00:00 2001 From: Tim Allclair Date: Sat, 9 Nov 2024 14:28:40 -0800 Subject: [PATCH 2/4] Fix unit tests --- pkg/kubelet/kuberuntime/kuberuntime_manager_test.go | 5 +++++ pkg/kubelet/status/status_manager.go | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go b/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go index 9baaf1a3608..b536dcea9cf 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go @@ -1260,6 +1260,11 @@ func verifyActions(t *testing.T, expected, actual *podActions, desc string) { actual.ContainersToKill[k] = info } } + + if expected.ContainersToUpdate == nil && actual.ContainersToUpdate != nil { + // No need to distinguish empty and nil maps for the test. + expected.ContainersToUpdate = map[v1.ResourceName][]containerToUpdateInfo{} + } assert.Equal(t, expected, actual, desc) } diff --git a/pkg/kubelet/status/status_manager.go b/pkg/kubelet/status/status_manager.go index 3da131d5392..60e4c0115b6 100644 --- a/pkg/kubelet/status/status_manager.go +++ b/pkg/kubelet/status/status_manager.go @@ -179,6 +179,7 @@ func NewManager(kubeClient clientset.Interface, podManager PodManager, podDeleti podDeletionSafety: podDeletionSafety, podStartupLatencyHelper: podStartupLatencyHelper, stateFileDirectory: stateFileDirectory, + state: state.NewNoopStateCheckpoint(), } } @@ -202,9 +203,6 @@ func isPodStatusByKubeletEqual(oldStatus, status *v1.PodStatus) bool { } func (m *manager) Start() { - // Initialize m.state to no-op state checkpoint manager - m.state = state.NewNoopStateCheckpoint() - // Create pod allocation checkpoint manager even if client is nil so as to allow local get/set of AllocatedResources & Resize if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) { stateImpl, err := state.NewStateCheckpoint(m.stateFileDirectory, podStatusManagerStateFile) From 4bbc6f1c2c60eb26fed8c97da3fe7b6c6196100f Mon Sep 17 00:00:00 2001 From: Tim Allclair Date: Thu, 7 Nov 2024 13:07:50 -0800 Subject: [PATCH 3/4] Move pod_resize tests out of alpha --- test/e2e/common/node/pod_resize.go | 3 +-- test/e2e/feature/feature.go | 3 --- test/e2e/node/pod_resize.go | 5 ++--- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/test/e2e/common/node/pod_resize.go b/test/e2e/common/node/pod_resize.go index 347def6f339..efc48bab50d 100644 --- a/test/e2e/common/node/pod_resize.go +++ b/test/e2e/common/node/pod_resize.go @@ -25,7 +25,6 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/kubernetes/test/e2e/feature" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" @@ -1060,7 +1059,7 @@ func doPodResizeErrorTests(f *framework.Framework) { // Above tests are performed by doSheduletTests() and doPodResizeResourceQuotaTests() // in test/e2e/node/pod_resize.go -var _ = SIGDescribe("Pod InPlace Resize Container", framework.WithSerial(), feature.InPlacePodVerticalScaling, "[NodeAlphaFeature:InPlacePodVerticalScaling]", func() { +var _ = SIGDescribe("Pod InPlace Resize Container", framework.WithSerial(), func() { f := framework.NewDefaultFramework("pod-resize-tests") ginkgo.BeforeEach(func(ctx context.Context) { diff --git a/test/e2e/feature/feature.go b/test/e2e/feature/feature.go index 77a77ad7b91..9448f6590a6 100644 --- a/test/e2e/feature/feature.go +++ b/test/e2e/feature/feature.go @@ -186,9 +186,6 @@ var ( // Ingress.networking.k8s.io to be present. Ingress = framework.WithFeature(framework.ValidFeatures.Add("Ingress")) - // TODO: document the feature (owning SIG, when to use this feature for a test) - InPlacePodVerticalScaling = framework.WithFeature(framework.ValidFeatures.Add("InPlacePodVerticalScaling")) - // Owner: sig-network // Marks tests that require a cluster with dual-stack pod and service networks. IPv6DualStack = framework.WithFeature(framework.ValidFeatures.Add("IPv6DualStack")) diff --git a/test/e2e/node/pod_resize.go b/test/e2e/node/pod_resize.go index bd70ba50955..ff932885636 100644 --- a/test/e2e/node/pod_resize.go +++ b/test/e2e/node/pod_resize.go @@ -27,7 +27,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" resourceapi "k8s.io/kubernetes/pkg/api/v1/resource" - "k8s.io/kubernetes/test/e2e/feature" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" @@ -356,7 +355,7 @@ func doPodResizeSchedulerTests(f *framework.Framework) { }) } -var _ = SIGDescribe(framework.WithSerial(), "Pod InPlace Resize Container (scheduler-focused)", feature.InPlacePodVerticalScaling, func() { +var _ = SIGDescribe(framework.WithSerial(), "Pod InPlace Resize Container (scheduler-focused)", func() { f := framework.NewDefaultFramework("pod-resize-scheduler-tests") ginkgo.BeforeEach(func(ctx context.Context) { node, err := e2enode.GetRandomReadySchedulableNode(ctx, f.ClientSet) @@ -368,7 +367,7 @@ var _ = SIGDescribe(framework.WithSerial(), "Pod InPlace Resize Container (sched doPodResizeSchedulerTests(f) }) -var _ = SIGDescribe("Pod InPlace Resize Container", feature.InPlacePodVerticalScaling, func() { +var _ = SIGDescribe("Pod InPlace Resize Container", func() { f := framework.NewDefaultFramework("pod-resize-tests") ginkgo.BeforeEach(func(ctx context.Context) { From 2935b106dcc5a30bb77b57ac544417979d6cdd0c Mon Sep 17 00:00:00 2001 From: Tim Allclair Date: Mon, 11 Nov 2024 12:44:33 -0800 Subject: [PATCH 4/4] Set default ResizePolicy in fuzzer for roundtrip tests --- pkg/apis/core/fuzzer/fuzzer.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/apis/core/fuzzer/fuzzer.go b/pkg/apis/core/fuzzer/fuzzer.go index a02f4151d78..f50493c8ed8 100644 --- a/pkg/apis/core/fuzzer/fuzzer.go +++ b/pkg/apis/core/fuzzer/fuzzer.go @@ -309,6 +309,23 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { c.FuzzNoCustom(ct) // fuzz self without calling this function again ct.TerminationMessagePath = "/" + ct.TerminationMessagePath // Must be non-empty ct.TerminationMessagePolicy = "File" + // Match defaulting in pkg/apis/core/v1/defaults.go. + _, hasCPUReq := ct.Resources.Requests[core.ResourceCPU] + _, hasCPULim := ct.Resources.Limits[core.ResourceCPU] + _, hasMemReq := ct.Resources.Requests[core.ResourceMemory] + _, hasMemLim := ct.Resources.Limits[core.ResourceMemory] + if hasCPUReq || hasCPULim { + ct.ResizePolicy = append(ct.ResizePolicy, core.ContainerResizePolicy{ + ResourceName: core.ResourceCPU, + RestartPolicy: core.NotRequired, + }) + } + if hasMemReq || hasMemLim { + ct.ResizePolicy = append(ct.ResizePolicy, core.ContainerResizePolicy{ + ResourceName: core.ResourceMemory, + RestartPolicy: core.NotRequired, + }) + } }, func(ep *core.EphemeralContainer, c fuzz.Continue) { c.FuzzNoCustom(ep) // fuzz self without calling this function again