From 964d79dd6e028be723d28d784ccc1ec7dd9c833e Mon Sep 17 00:00:00 2001 From: HirazawaUi <695097494plus@gmail.com> Date: Sun, 15 Mar 2026 22:47:19 +0800 Subject: [PATCH] Remove SidecarContainers feature gate --- pkg/api/pod/util.go | 25 ---- pkg/api/pod/util_test.go | 107 ------------------ pkg/apis/core/validation/validation.go | 54 +++++---- pkg/controller/job/backoff_utils.go | 25 ++-- pkg/features/kube_features.go | 16 --- pkg/registry/core/pod/strategy.go | 4 +- pkg/registry/core/pod/strategy_test.go | 1 - .../framework/plugins/feature/feature.go | 2 - .../framework/plugins/noderesources/fit.go | 19 ---- .../plugins/noderesources/fit_test.go | 34 ++---- .../reference/feature_list.md | 1 - .../reference/versioned_feature_list.yaml | 14 --- test/e2e/common/node/container_probe.go | 3 +- test/e2e/common/node/lifecycle_hook.go | 2 +- 14 files changed, 50 insertions(+), 257 deletions(-) diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index dbda812aad1..071e7430e91 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -772,14 +772,6 @@ func dropDisabledFields( } } - if !utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) && !restartableInitContainersInUse(oldPodSpec) { - // Drop the RestartPolicy field of init containers. - for i := range podSpec.InitContainers { - podSpec.InitContainers[i].RestartPolicy = nil - } - // For other types of containers, validateContainers will handle them. - } - if !utilfeature.DefaultFeatureGate.Enabled(features.ContainerRestartRules) && !containerRestartRulesInUse(oldPodSpec) { dropContainerRestartRules(podSpec) } @@ -1477,23 +1469,6 @@ func procMountInUse(podSpec *api.PodSpec) bool { return inUse } -// restartableInitContainersInUse returns true if the pod spec is non-nil and -// it has any init container with ContainerRestartPolicyAlways. -func restartableInitContainersInUse(podSpec *api.PodSpec) bool { - if podSpec == nil { - return false - } - var inUse bool - VisitContainers(podSpec, InitContainers, func(c *api.Container, containerType ContainerType) bool { - if c.RestartPolicy != nil && *c.RestartPolicy == api.ContainerRestartPolicyAlways { - inUse = true - return false - } - return true - }) - return inUse -} - func clusterTrustBundleProjectionInUse(podSpec *api.PodSpec) bool { if podSpec == nil { return false diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index 510b59c3a23..c48a26a489b 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -3276,113 +3276,6 @@ func TestDropPodLevelResources(t *testing.T) { } } -func TestDropSidecarContainers(t *testing.T) { - containerRestartPolicyAlways := api.ContainerRestartPolicyAlways - - podWithSidecarContainers := func() *api.Pod { - return &api.Pod{ - Spec: api.PodSpec{ - InitContainers: []api.Container{ - { - Name: "c1", - Image: "image", - RestartPolicy: &containerRestartPolicyAlways, - }, - }, - }, - } - } - - podWithoutSidecarContainers := func() *api.Pod { - return &api.Pod{ - Spec: api.PodSpec{ - InitContainers: []api.Container{ - { - Name: "c1", - Image: "image", - }, - }, - }, - } - } - - podInfo := []struct { - description string - hasSidecarContainer bool - pod func() *api.Pod - }{ - { - description: "has a sidecar container", - hasSidecarContainer: true, - pod: podWithSidecarContainers, - }, - { - description: "does not have a sidecar container", - hasSidecarContainer: false, - pod: podWithoutSidecarContainers, - }, - { - description: "is nil", - hasSidecarContainer: false, - pod: func() *api.Pod { return nil }, - }, - } - - for _, enabled := range []bool{true, false} { - for _, oldPodInfo := range podInfo { - for _, newPodInfo := range podInfo { - oldPodHasSidecarContainer, oldPod := oldPodInfo.hasSidecarContainer, oldPodInfo.pod() - newPodHasSidecarContainer, newPod := newPodInfo.hasSidecarContainer, newPodInfo.pod() - if newPod == nil { - continue - } - - t.Run(fmt.Sprintf("feature enabled=%v, old pod %v, new pod %v", enabled, oldPodInfo.description, newPodInfo.description), func(t *testing.T) { - if !enabled { - // TODO: Remove this in v1.36 - featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.32")) - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.SidecarContainers, false) - } - - var oldPodSpec *api.PodSpec - if oldPod != nil { - oldPodSpec = &oldPod.Spec - } - dropDisabledFields(&newPod.Spec, nil, oldPodSpec, nil) - - // old pod should never be changed - if !reflect.DeepEqual(oldPod, oldPodInfo.pod()) { - t.Errorf("old pod changed: %v", cmp.Diff(oldPod, oldPodInfo.pod())) - } - - switch { - case enabled || oldPodHasSidecarContainer: - // new pod shouldn't change if feature enabled or if old pod has - // any sidecar container - if !reflect.DeepEqual(newPod, newPodInfo.pod()) { - t.Errorf("new pod changed: %v", cmp.Diff(newPod, newPodInfo.pod())) - } - case newPodHasSidecarContainer: - // new pod should be changed - if reflect.DeepEqual(newPod, newPodInfo.pod()) { - t.Errorf("new pod was not changed") - } - // new pod should not have any sidecar container - if !reflect.DeepEqual(newPod, podWithoutSidecarContainers()) { - t.Errorf("new pod has a sidecar container: %v", cmp.Diff(newPod, podWithoutSidecarContainers())) - } - default: - // new pod should not need to be changed - if !reflect.DeepEqual(newPod, newPodInfo.pod()) { - t.Errorf("new pod changed: %v", cmp.Diff(newPod, newPodInfo.pod())) - } - } - }) - } - } - } -} - func TestDropClusterTrustBundleProjectedVolumes(t *testing.T) { featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ClusterTrustBundle, true) diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 116f8675dc5..6169c0af229 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -6406,39 +6406,37 @@ func ValidatePodResize(newPod, oldPod *core.Pod, opts PodValidationOptions) fiel // Ensure that only CPU and memory resources are mutable for restartable init containers. var newInitContainers []core.Container - if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { - for ix, container := range newPodSpecCopy.InitContainers { - isRestartable := isRestartableInitContainer(&container) - canResize := isRestartable || utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScalingInitContainers) - modifiedContainer := !apiequality.Semantic.DeepEqual(container, oldPod.Spec.InitContainers[ix]) + for ix, container := range newPodSpecCopy.InitContainers { + isRestartable := isRestartableInitContainer(&container) + canResize := isRestartable || utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScalingInitContainers) + modifiedContainer := !apiequality.Semantic.DeepEqual(container, oldPod.Spec.InitContainers[ix]) - if canResize { - dropCPUMemoryResourcesFromContainer(&container, &oldPod.Spec.InitContainers[ix]) - if !apiequality.Semantic.DeepEqual(container, oldPod.Spec.InitContainers[ix]) { - // This likely means that the user has made changes to resources other than CPU and memory for sidecar container. - errs := field.Forbidden(specPath.Child("initContainers").Index(ix), "only cpu and memory resources for init or sidecar containers are mutable") - allErrs = append(allErrs, errs) - } - if modifiedContainer && !isRestartable { - for _, resizePolicy := range container.ResizePolicy { - if resizePolicy.RestartPolicy == core.RestartContainer { - // TODO: This validation check can eventually be removed in 1.40, - // as https://github.com/kubernetes/kubernetes/pull/137458 prohibits - // the ability to set RestartContainer resize policy for non-sidecar init containers. - errs := field.Forbidden(specPath.Child("initContainers").Index(ix), "non-sidecar init containers with a resize policy of RestartContainer cannot be resized") - allErrs = append(allErrs, errs) - } - } - } - } else if modifiedContainer { // modified non-resizable init container - // This likely means that the user has modified resources of non-sidecar init container. - errs := field.Forbidden(specPath, "resources for non-sidecar init containers are immutable") + if canResize { + dropCPUMemoryResourcesFromContainer(&container, &oldPod.Spec.InitContainers[ix]) + if !apiequality.Semantic.DeepEqual(container, oldPod.Spec.InitContainers[ix]) { + // This likely means that the user has made changes to resources other than CPU and memory for sidecar container. + errs := field.Forbidden(specPath.Child("initContainers").Index(ix), "only cpu and memory resources for init or sidecar containers are mutable") allErrs = append(allErrs, errs) } - newInitContainers = append(newInitContainers, container) + if modifiedContainer && !isRestartable { + for _, resizePolicy := range container.ResizePolicy { + if resizePolicy.RestartPolicy == core.RestartContainer { + // TODO: This validation check can eventually be removed in 1.40, + // as https://github.com/kubernetes/kubernetes/pull/137458 prohibits + // the ability to set RestartContainer resize policy for non-sidecar init containers. + errs := field.Forbidden(specPath.Child("initContainers").Index(ix), "non-sidecar init containers with a resize policy of RestartContainer cannot be resized") + allErrs = append(allErrs, errs) + } + } + } + } else if modifiedContainer { // modified non-resizable init container + // This likely means that the user has modified resources of non-sidecar init container. + errs := field.Forbidden(specPath, "resources for non-sidecar init containers are immutable") + allErrs = append(allErrs, errs) } - newPodSpecCopy.InitContainers = newInitContainers + newInitContainers = append(newInitContainers, container) } + newPodSpecCopy.InitContainers = newInitContainers if len(allErrs) > 0 { return allErrs diff --git a/pkg/controller/job/backoff_utils.go b/pkg/controller/job/backoff_utils.go index 47a07d2ad39..55c74a78260 100644 --- a/pkg/controller/job/backoff_utils.go +++ b/pkg/controller/job/backoff_utils.go @@ -23,11 +23,9 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/cache" "k8s.io/klog/v2" apipod "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/features" "k8s.io/utils/clock" "k8s.io/utils/ptr" ) @@ -187,20 +185,19 @@ func getFinishedTime(p *v1.Pod) time.Time { func getFinishTimeFromContainers(p *v1.Pod) *time.Time { finishTime := latestFinishTime(nil, p.Status.ContainerStatuses, nil) - if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { - // We need to check InitContainerStatuses here also, - // because with the sidecar (restartable init) containers, - // sidecar containers will always finish later than regular containers. - names := sets.New[string]() - for _, c := range p.Spec.InitContainers { - if c.RestartPolicy != nil && *c.RestartPolicy == v1.ContainerRestartPolicyAlways { - names.Insert(c.Name) - } + // We need to check InitContainerStatuses here also, + // because with the sidecar (restartable init) containers, + // sidecar containers will always finish later than regular containers. + names := sets.New[string]() + for _, c := range p.Spec.InitContainers { + if c.RestartPolicy != nil && *c.RestartPolicy == v1.ContainerRestartPolicyAlways { + names.Insert(c.Name) } - finishTime = latestFinishTime(finishTime, p.Status.InitContainerStatuses, func(status v1.ContainerStatus) bool { - return names.Has(status.Name) - }) } + finishTime = latestFinishTime(finishTime, p.Status.InitContainerStatuses, func(status v1.ContainerStatus) bool { + return names.Has(status.Name) + }) + return finishTime } diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index ece1aa0ce7e..0ad3a3f0f54 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -987,14 +987,6 @@ const ( // When enabled, the apiserver ignores changes to status fields in writes to the ServiceCIDR root resource. ServiceCIDRStatusFieldWiping featuregate.Feature = "ServiceCIDRStatusFieldWiping" - // owner: @gjkim42 @SergeyKanzhelev @matthyx @tzneal - // kep: http://kep.k8s.io/753 - // - // Introduces sidecar containers, a new type of init container that starts - // before other containers but remains running for the full duration of the - // pod's lifecycle and will not block pod termination. - SidecarContainers featuregate.Feature = "SidecarContainers" - // owner: @michaelasp // kep: http://kep.k8s.io/5647 // @@ -1923,12 +1915,6 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate {Version: version.MustParse("1.36"), Default: true, PreRelease: featuregate.Deprecated}, }, - SidecarContainers: { - {Version: version.MustParse("1.28"), Default: false, PreRelease: featuregate.Alpha}, - {Version: version.MustParse("1.29"), Default: true, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.33"), Default: true, LockToDefault: true, PreRelease: featuregate.GA}, // GA in 1.33 remove in 1.36 - }, - StaleControllerConsistencyDaemonSet: { {Version: version.MustParse("1.36"), Default: true, PreRelease: featuregate.Beta}, }, @@ -2601,8 +2587,6 @@ var defaultKubernetesFeatureGateDependencies = map[featuregate.Feature][]feature ServiceCIDRStatusFieldWiping: {}, - SidecarContainers: {}, - StaleControllerConsistencyDaemonSet: {featuregate.Feature(clientfeatures.AtomicFIFO)}, StaleControllerConsistencyJob: {featuregate.Feature(clientfeatures.AtomicFIFO)}, diff --git a/pkg/registry/core/pod/strategy.go b/pkg/registry/core/pod/strategy.go index 191278b5867..250c4bf101d 100644 --- a/pkg/registry/core/pod/strategy.go +++ b/pkg/registry/core/pod/strategy.go @@ -384,9 +384,7 @@ func dropNonResizeUpdates(newPod, oldPod *api.Pod) *api.Pod { metav1.ResetObjectMetaForStatus(&newPod.ObjectMeta, &oldPod.ObjectMeta) newPod.Spec.Containers = containers - if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { - newPod.Spec.InitContainers = initContainers - } + newPod.Spec.InitContainers = initContainers return newPod } diff --git a/pkg/registry/core/pod/strategy_test.go b/pkg/registry/core/pod/strategy_test.go index 9ce380bc7dc..27d06e6c201 100644 --- a/pkg/registry/core/pod/strategy_test.go +++ b/pkg/registry/core/pod/strategy_test.go @@ -3665,7 +3665,6 @@ func TestPodResizePrepareForUpdate(t *testing.T) { t.Run(tc.name, func(t *testing.T) { featuregatetesting.SetFeatureGatesDuringTest(t, utilfeature.DefaultFeatureGate, featuregatetesting.FeatureOverrides{ features.InPlacePodVerticalScaling: true, - features.SidecarContainers: true, }) ctx := context.Background() ResizeStrategy.PrepareForUpdate(ctx, tc.newPod, tc.oldPod) diff --git a/pkg/scheduler/framework/plugins/feature/feature.go b/pkg/scheduler/framework/plugins/feature/feature.go index 934b8ce8482..a6cdd58c54a 100644 --- a/pkg/scheduler/framework/plugins/feature/feature.go +++ b/pkg/scheduler/framework/plugins/feature/feature.go @@ -41,7 +41,6 @@ type Features struct { EnableNodeInclusionPolicyInPodTopologySpread bool EnableMatchLabelKeysInPodTopologySpread bool EnableInPlacePodVerticalScaling bool - EnableSidecarContainers bool EnableSchedulingQueueHint bool EnableAsyncPreemption bool EnablePodLevelResources bool @@ -71,7 +70,6 @@ func NewSchedulerFeaturesFromGates(featureGate featuregate.FeatureGate) Features EnableNodeInclusionPolicyInPodTopologySpread: featureGate.Enabled(features.NodeInclusionPolicyInPodTopologySpread), EnableMatchLabelKeysInPodTopologySpread: featureGate.Enabled(features.MatchLabelKeysInPodTopologySpread), EnableInPlacePodVerticalScaling: featureGate.Enabled(features.InPlacePodVerticalScaling), - EnableSidecarContainers: featureGate.Enabled(features.SidecarContainers), EnableSchedulingQueueHint: featureGate.Enabled(features.SchedulerQueueingHints), EnableAsyncPreemption: featureGate.Enabled(features.SchedulerAsyncPreemption), EnablePodLevelResources: featureGate.Enabled(features.PodLevelResources), diff --git a/pkg/scheduler/framework/plugins/noderesources/fit.go b/pkg/scheduler/framework/plugins/noderesources/fit.go index 1e79ebfeeb0..e2c4bcf9236 100644 --- a/pkg/scheduler/framework/plugins/noderesources/fit.go +++ b/pkg/scheduler/framework/plugins/noderesources/fit.go @@ -94,7 +94,6 @@ type Fit struct { ignoredResources sets.Set[string] ignoredResourceGroups sets.Set[string] enableInPlacePodVerticalScaling bool - enableSidecarContainers bool enableSchedulingQueueHint bool enablePodLevelResources bool enableDRAExtendedResource bool @@ -234,7 +233,6 @@ func NewFit(_ context.Context, plArgs runtime.Object, h fwk.Handle, fts feature. ignoredResources: sets.New(args.IgnoredResources...), ignoredResourceGroups: sets.New(args.IgnoredResourceGroups...), enableInPlacePodVerticalScaling: fts.EnableInPlacePodVerticalScaling, - enableSidecarContainers: fts.EnableSidecarContainers, enableSchedulingQueueHint: fts.EnableSchedulingQueueHint, handle: h, enablePodLevelResources: fts.EnablePodLevelResources, @@ -329,14 +327,6 @@ func computePodResourceRequest(pod *v1.Pod, opts ResourceRequestsOptions) *preFi // PreFilter invoked at the prefilter extension point. func (f *Fit) PreFilter(ctx context.Context, cycleState fwk.CycleState, pod *v1.Pod, nodes []fwk.NodeInfo) (*fwk.PreFilterResult, *fwk.Status) { - if !f.enableSidecarContainers && hasRestartableInitContainer(pod) { - // Scheduler will calculate resources usage for a Pod containing - // restartable init containers that will be equal or more than kubelet will - // require to run the Pod. So there will be no overbooking. However, to - // avoid the inconsistency in resource calculation between the scheduler - // and the older (before v1.28) kubelet, make the Pod unschedulable. - return nil, fwk.NewStatus(fwk.UnschedulableAndUnresolvable, "Pod has a restartable init container and the SidecarContainers feature is disabled") - } result := computePodResourceRequest(pod, ResourceRequestsOptions{EnablePodLevelResources: f.enablePodLevelResources}) cycleState.Write(preFilterStateKey, result) @@ -644,15 +634,6 @@ func (f *Fit) Filter(ctx context.Context, cycleState fwk.CycleState, pod *v1.Pod return nil } -func hasRestartableInitContainer(pod *v1.Pod) bool { - for _, c := range pod.Spec.InitContainers { - if c.RestartPolicy != nil && *c.RestartPolicy == v1.ContainerRestartPolicyAlways { - return true - } - } - return false -} - // InsufficientResource describes what kind of resource limit is hit and caused the pod to not fit the node. type InsufficientResource struct { ResourceName v1.ResourceName diff --git a/pkg/scheduler/framework/plugins/noderesources/fit_test.go b/pkg/scheduler/framework/plugins/noderesources/fit_test.go index 1200713fe38..12f96a81542 100644 --- a/pkg/scheduler/framework/plugins/noderesources/fit_test.go +++ b/pkg/scheduler/framework/plugins/noderesources/fit_test.go @@ -913,42 +913,28 @@ func testRestartableInitContainers(tCtx ktesting.TContext) { } testCases := []struct { - name string - pod *v1.Pod - enableSidecarContainers bool - wantPreFilterStatus *fwk.Status - wantFilterStatus *fwk.Status + name string + pod *v1.Pod + wantPreFilterStatus *fwk.Status + wantFilterStatus *fwk.Status }{ { - name: "allow pod without restartable init containers if sidecar containers is disabled", + name: "allow pod without restartable init containers", pod: newPod(), }, { - name: "not allow pod with restartable init containers if sidecar containers is disabled", - pod: newPodWithRestartableInitContainers(nil, nil), - wantPreFilterStatus: fwk.NewStatus(fwk.UnschedulableAndUnresolvable, "Pod has a restartable init container and the SidecarContainers feature is disabled"), + name: "allow pod with restartable init containers", + pod: newPodWithRestartableInitContainers(nil, nil), }, { - name: "allow pod without restartable init containers if sidecar containers is enabled", - enableSidecarContainers: true, - pod: newPod(), - }, - { - name: "allow pod with restartable init containers if sidecar containers is enabled", - enableSidecarContainers: true, - pod: newPodWithRestartableInitContainers(nil, nil), - }, - { - name: "allow pod if the total requested resources do not exceed the node's allocatable resources", - enableSidecarContainers: true, + name: "allow pod if the total requested resources do not exceed the node's allocatable resources", pod: newPodWithRestartableInitContainers( &v1.ResourceList{v1.ResourceCPU: *resource.NewMilliQuantity(1, resource.DecimalSI)}, &v1.ResourceList{v1.ResourceCPU: *resource.NewMilliQuantity(1, resource.DecimalSI)}, ), }, { - name: "not allow pod if the total requested resources do exceed the node's allocatable resources", - enableSidecarContainers: true, + name: "not allow pod if the total requested resources do exceed the node's allocatable resources", pod: newPodWithRestartableInitContainers( &v1.ResourceList{v1.ResourceCPU: *resource.NewMilliQuantity(1, resource.DecimalSI)}, &v1.ResourceList{v1.ResourceCPU: *resource.NewMilliQuantity(2, resource.DecimalSI)}, @@ -963,7 +949,7 @@ func testRestartableInitContainers(tCtx ktesting.TContext) { nodeInfo := framework.NewNodeInfo() nodeInfo.SetNode(&node) - p, err := NewFit(tCtx, &config.NodeResourcesFitArgs{ScoringStrategy: defaultScoringStrategy}, nil, plfeature.Features{EnableSidecarContainers: test.enableSidecarContainers}) + p, err := NewFit(tCtx, &config.NodeResourcesFitArgs{ScoringStrategy: defaultScoringStrategy}, nil, plfeature.Features{}) tCtx.ExpectNoError(err, "create fit plugin") cycleState := framework.NewCycleState() _, preFilterStatus := p.(fwk.PreFilterPlugin).PreFilter(tCtx, cycleState, test.pod, nil) diff --git a/test/compatibility_lifecycle/reference/feature_list.md b/test/compatibility_lifecycle/reference/feature_list.md index 07a271eccf5..1867902febd 100644 --- a/test/compatibility_lifecycle/reference/feature_list.md +++ b/test/compatibility_lifecycle/reference/feature_list.md @@ -191,7 +191,6 @@ | ServiceAccountTokenPodNodeInfo | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.32+ | 1.29 | 1.30–1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbServiceAccountTokenPodNodeInfo%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceAccountTokenPodNodeInfo%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | ServiceCIDRStatusFieldWiping | :ballot_box_with_check: 1.36+ | | | | 1.0–1.35 | 1.36– | | [code](https://cs.k8s.io/?q=%5CbServiceCIDRStatusFieldWiping%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceCIDRStatusFieldWiping%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | ShardedListAndWatch | | | 1.36– | | | | | [code](https://cs.k8s.io/?q=%5CbShardedListAndWatch%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbShardedListAndWatch%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | -| SidecarContainers | :ballot_box_with_check: 1.29+ | :closed_lock_with_key: 1.33+ | 1.28 | 1.29–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbSidecarContainers%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSidecarContainers%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | SizeBasedListCostEstimate | :ballot_box_with_check: 1.34+ | | | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbSizeBasedListCostEstimate%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSizeBasedListCostEstimate%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | StaleControllerConsistencyDaemonSet | :ballot_box_with_check: 1.36+ | | | 1.36– | | | AtomicFIFO | [code](https://cs.k8s.io/?q=%5CbStaleControllerConsistencyDaemonSet%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStaleControllerConsistencyDaemonSet%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | StaleControllerConsistencyJob | :ballot_box_with_check: 1.36+ | | | 1.36– | | | AtomicFIFO | [code](https://cs.k8s.io/?q=%5CbStaleControllerConsistencyJob%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStaleControllerConsistencyJob%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | diff --git a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml index 0760a4377c2..9ab20afebac 100644 --- a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml +++ b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml @@ -1891,20 +1891,6 @@ lockToDefault: false preRelease: Alpha version: "1.36" -- name: SidecarContainers - versionedSpecs: - - default: false - lockToDefault: false - preRelease: Alpha - version: "1.28" - - default: true - lockToDefault: false - preRelease: Beta - version: "1.29" - - default: true - lockToDefault: true - preRelease: GA - version: "1.33" - name: SizeBasedListCostEstimate versionedSpecs: - default: true diff --git a/test/e2e/common/node/container_probe.go b/test/e2e/common/node/container_probe.go index 7ec421a4867..b593ecca3c8 100644 --- a/test/e2e/common/node/container_probe.go +++ b/test/e2e/common/node/container_probe.go @@ -34,7 +34,6 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/events" "k8s.io/kubernetes/test/e2e/framework" e2eevents "k8s.io/kubernetes/test/e2e/framework/events" @@ -729,7 +728,7 @@ done }) }) -var _ = SIGDescribe(framework.WithNodeConformance(), framework.WithFeatureGate(features.SidecarContainers), "Probing restartable init container", func() { +var _ = SIGDescribe(framework.WithNodeConformance(), "Probing restartable init container", func() { f := framework.NewDefaultFramework("container-probe") f.NamespacePodSecurityLevel = admissionapi.LevelBaseline var podClient *e2epod.PodClient diff --git a/test/e2e/common/node/lifecycle_hook.go b/test/e2e/common/node/lifecycle_hook.go index d51a5652221..74151eac901 100644 --- a/test/e2e/common/node/lifecycle_hook.go +++ b/test/e2e/common/node/lifecycle_hook.go @@ -277,7 +277,7 @@ var _ = SIGDescribe("Container Lifecycle Hook", func() { }) }) -var _ = SIGDescribe(framework.WithNodeConformance(), framework.WithFeatureGate(features.SidecarContainers), "Restartable Init Container Lifecycle Hook", func() { +var _ = SIGDescribe(framework.WithNodeConformance(), "Restartable Init Container Lifecycle Hook", func() { f := framework.NewDefaultFramework("restartable-init-container-lifecycle-hook") f.NamespacePodSecurityLevel = admissionapi.LevelBaseline var podClient *e2epod.PodClient