Skip to content

Commit 685b8b3

Browse files
authored
Merge pull request kubernetes#126981 from kannon92/stable-empty-dir-promotion
KEP-1967: promote size backed memory volumes to stable
2 parents 36081ff + b690c4f commit 685b8b3

File tree

5 files changed

+9
-73
lines changed

5 files changed

+9
-73
lines changed

pkg/features/kube_features.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,8 @@ const (
602602
// owner: @derekwaynecarr
603603
//
604604
// Enables kubelet support to size memory backed volumes
605+
// This is a kubelet only feature gate.
606+
// Code can be removed in 1.35 without any consideration for emulated versions.
605607
SizeMemoryBackedVolumes featuregate.Feature = "SizeMemoryBackedVolumes"
606608

607609
// owner: @mattcary

pkg/features/versioned_kube_features.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
683683
SizeMemoryBackedVolumes: {
684684
{Version: version.MustParse("1.20"), Default: false, PreRelease: featuregate.Alpha},
685685
{Version: version.MustParse("1.22"), Default: true, PreRelease: featuregate.Beta},
686+
{Version: version.MustParse("1.32"), Default: true, LockToDefault: true, PreRelease: featuregate.GA},
686687
},
687688

688689
StatefulSetAutoDeletePVC: {

pkg/volume/emptydir/empty_dir_test.go

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,18 @@ package emptydir
2121

2222
import (
2323
"fmt"
24-
"k8s.io/kubernetes/pkg/kubelet/util/swap"
2524
"os"
2625
"path/filepath"
2726
"strings"
2827
"testing"
2928

29+
"k8s.io/kubernetes/pkg/kubelet/util/swap"
30+
3031
v1 "k8s.io/api/core/v1"
3132
"k8s.io/apimachinery/pkg/api/resource"
3233
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3334
"k8s.io/apimachinery/pkg/types"
34-
utilfeature "k8s.io/apiserver/pkg/util/feature"
3535
utiltesting "k8s.io/client-go/util/testing"
36-
featuregatetesting "k8s.io/component-base/featuregate/testing"
37-
"k8s.io/kubernetes/pkg/features"
3836
"k8s.io/kubernetes/pkg/volume"
3937
volumetest "k8s.io/kubernetes/pkg/volume/testing"
4038
volumeutil "k8s.io/kubernetes/pkg/volume/util"
@@ -963,27 +961,7 @@ func TestCalculateEmptyDirMemorySize(t *testing.T) {
963961
nodeAllocatableMemory resource.Quantity
964962
emptyDirSizeLimit resource.Quantity
965963
expectedResult resource.Quantity
966-
featureGateEnabled bool
967964
}{
968-
"SizeMemoryBackedVolumesDisabled": {
969-
pod: &v1.Pod{
970-
Spec: v1.PodSpec{
971-
Containers: []v1.Container{
972-
{
973-
Resources: v1.ResourceRequirements{
974-
Requests: v1.ResourceList{
975-
v1.ResourceName("memory"): resource.MustParse("10Gi"),
976-
},
977-
},
978-
},
979-
},
980-
},
981-
},
982-
nodeAllocatableMemory: resource.MustParse("16Gi"),
983-
emptyDirSizeLimit: resource.MustParse("1Gi"),
984-
expectedResult: resource.MustParse("0"),
985-
featureGateEnabled: false,
986-
},
987965
"EmptyDirLocalLimit": {
988966
pod: &v1.Pod{
989967
Spec: v1.PodSpec{
@@ -1001,7 +979,6 @@ func TestCalculateEmptyDirMemorySize(t *testing.T) {
1001979
nodeAllocatableMemory: resource.MustParse("16Gi"),
1002980
emptyDirSizeLimit: resource.MustParse("1Gi"),
1003981
expectedResult: resource.MustParse("1Gi"),
1004-
featureGateEnabled: true,
1005982
},
1006983
"PodLocalLimit": {
1007984
pod: &v1.Pod{
@@ -1020,7 +997,6 @@ func TestCalculateEmptyDirMemorySize(t *testing.T) {
1020997
nodeAllocatableMemory: resource.MustParse("16Gi"),
1021998
emptyDirSizeLimit: resource.MustParse("0"),
1022999
expectedResult: resource.MustParse("10Gi"),
1023-
featureGateEnabled: true,
10241000
},
10251001
"NodeAllocatableLimit": {
10261002
pod: &v1.Pod{
@@ -1039,13 +1015,11 @@ func TestCalculateEmptyDirMemorySize(t *testing.T) {
10391015
nodeAllocatableMemory: resource.MustParse("16Gi"),
10401016
emptyDirSizeLimit: resource.MustParse("0"),
10411017
expectedResult: resource.MustParse("16Gi"),
1042-
featureGateEnabled: true,
10431018
},
10441019
}
10451020

10461021
for testCaseName, testCase := range testCases {
10471022
t.Run(testCaseName, func(t *testing.T) {
1048-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.SizeMemoryBackedVolumes, testCase.featureGateEnabled)
10491023
spec := &volume.Spec{
10501024
Volume: &v1.Volume{
10511025
VolumeSource: v1.VolumeSource{

test/e2e_node/eviction_test.go

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -288,51 +288,6 @@ var _ = SIGDescribe("LocalStorageSoftEvictionNotOverwriteTerminationGracePeriodS
288288
})
289289
})
290290

291-
// This test validates that in-memory EmptyDir's are evicted when the Kubelet does
292-
// not have Sized Memory Volumes enabled. When Sized volumes are enabled, it's
293-
// not possible to exhaust the quota.
294-
var _ = SIGDescribe("LocalStorageCapacityIsolationMemoryBackedVolumeEviction", framework.WithSlow(), framework.WithSerial(), framework.WithDisruptive(), feature.LocalStorageCapacityIsolation, nodefeature.Eviction, func() {
295-
f := framework.NewDefaultFramework("localstorage-eviction-test")
296-
f.NamespacePodSecurityLevel = admissionapi.LevelPrivileged
297-
evictionTestTimeout := 7 * time.Minute
298-
ginkgo.Context(fmt.Sprintf(testContextFmt, "evictions due to pod local storage violations"), func() {
299-
tempSetCurrentKubeletConfig(f, func(ctx context.Context, initialConfig *kubeletconfig.KubeletConfiguration) {
300-
// setting a threshold to 0% disables; non-empty map overrides default value (necessary due to omitempty)
301-
initialConfig.EvictionHard = map[string]string{string(evictionapi.SignalMemoryAvailable): "0%"}
302-
if initialConfig.FeatureGates == nil {
303-
initialConfig.FeatureGates = make(map[string]bool)
304-
}
305-
initialConfig.FeatureGates["SizeMemoryBackedVolumes"] = false
306-
})
307-
308-
sizeLimit := resource.MustParse("100Mi")
309-
useOverLimit := 200 /* Mb */
310-
useUnderLimit := 80 /* Mb */
311-
containerLimit := v1.ResourceList{v1.ResourceEphemeralStorage: sizeLimit}
312-
313-
runEvictionTest(f, evictionTestTimeout, noPressure, noStarvedResource, logDiskMetrics, []podEvictSpec{
314-
{
315-
evictionPriority: 1, // Should be evicted due to disk limit
316-
pod: diskConsumingPod("emptydir-memory-over-volume-sizelimit", useOverLimit, &v1.VolumeSource{
317-
EmptyDir: &v1.EmptyDirVolumeSource{Medium: "Memory", SizeLimit: &sizeLimit},
318-
}, v1.ResourceRequirements{}),
319-
},
320-
{
321-
evictionPriority: 0, // Should not be evicted, as container limits do not account for memory backed volumes
322-
pod: diskConsumingPod("emptydir-memory-over-container-sizelimit", useOverLimit, &v1.VolumeSource{
323-
EmptyDir: &v1.EmptyDirVolumeSource{Medium: "Memory"},
324-
}, v1.ResourceRequirements{Limits: containerLimit}),
325-
},
326-
{
327-
evictionPriority: 0,
328-
pod: diskConsumingPod("emptydir-memory-innocent", useUnderLimit, &v1.VolumeSource{
329-
EmptyDir: &v1.EmptyDirVolumeSource{Medium: "Memory", SizeLimit: &sizeLimit},
330-
}, v1.ResourceRequirements{}),
331-
},
332-
})
333-
})
334-
})
335-
336291
// LocalStorageCapacityIsolationEviction tests that container and volume local storage limits are enforced through evictions
337292
var _ = SIGDescribe("LocalStorageCapacityIsolationEviction", framework.WithSlow(), framework.WithSerial(), framework.WithDisruptive(), feature.LocalStorageCapacityIsolation, nodefeature.Eviction, func() {
338293
f := framework.NewDefaultFramework("localstorage-eviction-test")

test/featuregates_linter/test_data/versioned_feature_list.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,10 @@
11481148
lockToDefault: false
11491149
preRelease: Beta
11501150
version: "1.22"
1151+
- default: true
1152+
lockToDefault: true
1153+
preRelease: GA
1154+
version: "1.32"
11511155
- name: StatefulSetAutoDeletePVC
11521156
versionedSpecs:
11531157
- default: false

0 commit comments

Comments
 (0)