@@ -651,7 +651,7 @@ type EmptyDirVolumeSource struct {
|
|||||||
// The default is nil which means that the limit is undefined.
|
// The default is nil which means that the limit is undefined.
|
||||||
// More info: http://kubernetes.io/docs/user-guide/volumes#emptydir
|
// More info: http://kubernetes.io/docs/user-guide/volumes#emptydir
|
||||||
// +optional
|
// +optional
|
||||||
SizeLimit resource.Quantity
|
SizeLimit *resource.Quantity
|
||||||
}
|
}
|
||||||
|
|
||||||
// StorageMedium defines ways that storage can be allocated to a volume.
|
// StorageMedium defines ways that storage can be allocated to a volume.
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ go_library(
|
|||||||
"//pkg/util/parsers:go_default_library",
|
"//pkg/util/parsers:go_default_library",
|
||||||
"//pkg/util/pointer:go_default_library",
|
"//pkg/util/pointer:go_default_library",
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
|||||||
@@ -386,10 +386,13 @@ func validateVolumeSource(source *api.VolumeSource, fldPath *field.Path, volName
|
|||||||
if source.EmptyDir != nil {
|
if source.EmptyDir != nil {
|
||||||
numVolumes++
|
numVolumes++
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
|
if !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
|
||||||
unsetSizeLimit := resource.Quantity{}
|
if source.EmptyDir.SizeLimit != nil && source.EmptyDir.SizeLimit.Cmp(resource.Quantity{}) != 0 {
|
||||||
if unsetSizeLimit.Cmp(source.EmptyDir.SizeLimit) != 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("sizeLimit"), "SizeLimit field disabled by feature-gate for EmptyDir volumes"))
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("sizeLimit"), "SizeLimit field disabled by feature-gate for EmptyDir volumes"))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if source.EmptyDir.SizeLimit != nil && source.EmptyDir.SizeLimit.Cmp(resource.Quantity{}) < 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("sizeLimit"), "SizeLimit field must be a valid resource quantity"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if source.HostPath != nil {
|
if source.HostPath != nil {
|
||||||
|
|||||||
@@ -2656,7 +2656,7 @@ func TestValidateVolumes(t *testing.T) {
|
|||||||
func TestAlphaLocalStorageCapacityIsolation(t *testing.T) {
|
func TestAlphaLocalStorageCapacityIsolation(t *testing.T) {
|
||||||
|
|
||||||
testCases := []api.VolumeSource{
|
testCases := []api.VolumeSource{
|
||||||
{EmptyDir: &api.EmptyDirVolumeSource{SizeLimit: *resource.NewQuantity(int64(5), resource.BinarySI)}},
|
{EmptyDir: &api.EmptyDirVolumeSource{SizeLimit: resource.NewQuantity(int64(5), resource.BinarySI)}},
|
||||||
}
|
}
|
||||||
// Enable alpha feature LocalStorageCapacityIsolation
|
// Enable alpha feature LocalStorageCapacityIsolation
|
||||||
err := utilfeature.DefaultFeatureGate.Set("LocalStorageCapacityIsolation=true")
|
err := utilfeature.DefaultFeatureGate.Set("LocalStorageCapacityIsolation=true")
|
||||||
|
|||||||
@@ -496,7 +496,7 @@ func (m *managerImpl) emptyDirLimitEviction(podStats statsapi.PodStats, pod *v1.
|
|||||||
if source.EmptyDir != nil {
|
if source.EmptyDir != nil {
|
||||||
size := source.EmptyDir.SizeLimit
|
size := source.EmptyDir.SizeLimit
|
||||||
used := podVolumeUsed[pod.Spec.Volumes[i].Name]
|
used := podVolumeUsed[pod.Spec.Volumes[i].Name]
|
||||||
if used != nil && size.Sign() == 1 && used.Cmp(size) > 0 {
|
if used != nil && size != nil && size.Sign() == 1 && used.Cmp(*size) > 0 {
|
||||||
// the emptyDir usage exceeds the size limit, evict the pod
|
// the emptyDir usage exceeds the size limit, evict the pod
|
||||||
return m.evictPod(pod, v1.ResourceName("EmptyDir"), fmt.Sprintf("emptyDir usage exceeds the limit %q", size.String()))
|
return m.evictPod(pod, v1.ResourceName("EmptyDir"), fmt.Sprintf("emptyDir usage exceeds the limit %q", size.String()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ func addStorageLimit(pod *v1.Pod, sizeLimit int64, medium v1.StorageMedium) *v1.
|
|||||||
Name: "emptyDirVolumeName",
|
Name: "emptyDirVolumeName",
|
||||||
VolumeSource: v1.VolumeSource{
|
VolumeSource: v1.VolumeSource{
|
||||||
EmptyDir: &v1.EmptyDirVolumeSource{
|
EmptyDir: &v1.EmptyDirVolumeSource{
|
||||||
SizeLimit: *resource.NewQuantity(sizeLimit, resource.BinarySI),
|
SizeLimit: resource.NewQuantity(sizeLimit, resource.BinarySI),
|
||||||
Medium: medium,
|
Medium: medium,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -739,7 +739,7 @@ type EmptyDirVolumeSource struct {
|
|||||||
// The default is nil which means that the limit is undefined.
|
// The default is nil which means that the limit is undefined.
|
||||||
// More info: http://kubernetes.io/docs/user-guide/volumes#emptydir
|
// More info: http://kubernetes.io/docs/user-guide/volumes#emptydir
|
||||||
// +optional
|
// +optional
|
||||||
SizeLimit resource.Quantity `json:"sizeLimit,omitempty" protobuf:"bytes,2,opt,name=sizeLimit"`
|
SizeLimit *resource.Quantity `json:"sizeLimit,omitempty" protobuf:"bytes,2,opt,name=sizeLimit"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Represents a Glusterfs mount that lasts the lifetime of a pod.
|
// Represents a Glusterfs mount that lasts the lifetime of a pod.
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se
|
|||||||
Name: emptyDirVolumeName,
|
Name: emptyDirVolumeName,
|
||||||
VolumeSource: v1.VolumeSource{
|
VolumeSource: v1.VolumeSource{
|
||||||
EmptyDir: &v1.EmptyDirVolumeSource{
|
EmptyDir: &v1.EmptyDirVolumeSource{
|
||||||
SizeLimit: *resource.NewQuantity(int64(1000), resource.BinarySI),
|
SizeLimit: resource.NewQuantity(int64(1000), resource.BinarySI),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -112,7 +112,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se
|
|||||||
VolumeSource: v1.VolumeSource{
|
VolumeSource: v1.VolumeSource{
|
||||||
EmptyDir: &v1.EmptyDirVolumeSource{
|
EmptyDir: &v1.EmptyDirVolumeSource{
|
||||||
Medium: "Memory",
|
Medium: "Memory",
|
||||||
SizeLimit: *resource.NewQuantity(int64(10000), resource.BinarySI),
|
SizeLimit: resource.NewQuantity(int64(10000), resource.BinarySI),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -148,7 +148,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se
|
|||||||
Name: emptyDirVolumeName,
|
Name: emptyDirVolumeName,
|
||||||
VolumeSource: v1.VolumeSource{
|
VolumeSource: v1.VolumeSource{
|
||||||
EmptyDir: &v1.EmptyDirVolumeSource{
|
EmptyDir: &v1.EmptyDirVolumeSource{
|
||||||
SizeLimit: *resource.NewQuantity(int64(100000), resource.BinarySI),
|
SizeLimit: resource.NewQuantity(int64(100000), resource.BinarySI),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -218,7 +218,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se
|
|||||||
Name: emptyDirVolumeName,
|
Name: emptyDirVolumeName,
|
||||||
VolumeSource: v1.VolumeSource{
|
VolumeSource: v1.VolumeSource{
|
||||||
EmptyDir: &v1.EmptyDirVolumeSource{
|
EmptyDir: &v1.EmptyDirVolumeSource{
|
||||||
SizeLimit: *resource.NewQuantity(int64(100000), resource.BinarySI),
|
SizeLimit: resource.NewQuantity(int64(100000), resource.BinarySI),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user