Repository: kubernetes/kubernetes (language: go)

Issue:
Default values of Kubelet's EvictionHard
### What happened?

As we know, the default values of kubelet hard eviction's parameters are:
```
memory.available: "100Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
imagefs.available: "15%
```
When we change one of the default values, then the other unchanged parameters are set to 0. As per the code, this is the expected case.

### What did you expect to happen?

 The unchanged parameters should inherit their default values or is there any good scenario by setting the other parameters to 0.

### How can we reproduce it (as minimally and precisely as possible)?

NA

### Anything else we need to know?

_No response_

### Kubernetes version

<details>

```console
$ kubectl version
v1.25
```

</details>


### Cloud provider

<details>
NA
</details>


### OS version

<details>

```console
# On Linux:
$ cat /etc/os-release
# paste output here
$ uname -a
# paste output here

# On Windows:
C:\> wmic os get Caption, Version, BuildNumber, OSArchitecture
# paste output here
```

</details>


### Install tools

<details>

</details>


### Container runtime (CRI) and version (if applicable)

<details>

</details>


### Related plugins (CNI, CSI, ...) and versions (if applicable)

<details>

</details>



Discussion / hints:
/sig node
/cc
This behavior is expected.  

https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/#hard-eviction-thresholds

In general it is recommend if you change one of those items you should change all the other ones.  


I realize I’m starting what you said but I don’t think this can be considered a bug.  I’d say it’s a feature to allow for different fields for HardEviction.

/remove-kind bug
/kind feature
can we add a switch to controll it continue on inheriting the default values or be set to zero?
@kannon92 

> In general it is recommend if you change one of those items you should change all the other ones.

Yes, but if someone is changing only one parameter then all the other will be set to zero in that case.


> I realize I’m starting what you said but I don’t think this can be considered a bug. I’d say it’s a feature to allow for different fields for HardEviction.

Are you doing some work on this part?
I meant stating not starting. I’m not working on this but I think this could be a welcome addition if someone wants to look into it.

the main issue is we set defaults if a user doesn’t specify those settings.
Related issue: https://github.com/kubernetes/kubernetes/issues/121809

@vaibhav2107 you want to contribute a "fix" for this? Looking into this, I think we substitute user provided values in for the defaults.  

I think your suggestion could be a good addition.
@kannon92 I tthink I don't know exactly about the fix for this but I am investigating and trying to get it.
> @vaibhav2107 you want to contribute a "fix" for this? Looking into this, I think we substitute user provided values in for the defaults.



The Kubernetes project currently lacks enough contributors to adequately respond to all issues.

This bot triages un-triaged issues according to the following rules:
- After 90d of inactivity, `lifecycle/stale` is applied
- After 30d of inactivity since `lifecycle/stale` was applied, `lifecycle/rotten` is applied
- After 30d of inactivity since `lifecycle/rotten` was applied, the issue is closed

You can:
- Mark this issue as fresh with `/remove-lifecycle stale`
- Close this issue with `/close`
- Offer to help out with [Issue Triage][1]

Please send feedback to sig-contributor-experience at [kubernetes/community](https://github.com/kubernetes/community).

/lifecycle stale

[1]: https://www.kubernetes.dev/docs/guide/issue-triage/
/remove-lifecycle stale
/triage accepted
/priority backlog
I have raised the PR #125033  for change in behaviour of the default values of the EvictionHard parameters. 

The current behaviour is if we explicitly set any parameter like memory.available: "200Mi" then the default values will be like this
```
memory.available:  "200Mi" 
nodefs.available:  "0%" 
nodefs.inodesFree: "0%" 
imagefs.available: "0%"
imagefs.inodesFree: "0%"

```
After the PR ,the idea is to change the beahviour that if we set any parameter explicitly then other parameters would inherit their default values instead of 0. Like if we apply memory.available: "200Mi" then the default values will be like this
```
memory.available:  "200Mi" 
nodefs.available:  "10%" 
nodefs.inodesFree: "5%" 
imagefs.available: "15%" 
imagefs.inodesFree: "5%"
```
As per the [comment](https://github.com/kubernetes/kubernetes/issues/119985#issuecomment-1683188933) and my understanding, the idea is to add switch or add a flag that can switch between the current behaviour and the behaviour after the PR change that I explained above.

Like if we add a flag inherit-eviction-default, 
If the flag is disabled and we change any parameter, then the default values are set as per the current behaviour.
	  

> inherit-eviction-default: false
> 	memory.available: "200Mi"

then the config will be set as
```
memory.available:  "200Mi" 
nodefs.available:  "0%" 
nodefs.inodesFree: "0%" 
imagefs.available: "0%"
imagefs.inodesFree: "0%"
```

If the flag is enabled and we change any parameter, then the default values are set as per the new behaviour

> 	inherit-eviction-default: true
> 	memory.available: "200Mi"

then the config will be set as
```
memory.available:  "200Mi" 
nodefs.available:  "10%" 
nodefs.inodesFree: "5%" 
imagefs.available: "15%" 
imagefs.inodesFree: "5%"
```
@SergeyKanzhelev @kannon92 
What could be the better approach to go forward with the issue. Why is the current behaviour considered as expected and do we need to keep the current behaviour as well, like what are the use cases for the current behaviour. I think if there are some cuse cases then we can go for the switch based approach else we can go for the simple change in beahviour similar to which the PR is open. 
/assign
we chatted about this at sig node. I believe this is from the kubelet's config reading code, where it can't tell the difference between explicitly 0 values and not present values, so it assumes the former. To fix this, we'd need to interpret 0 values as the default, which would mean we'd need to see whether 0 value is meaningful in the context. I have volunteered to look deeper into it.
Hi @haircommander, do you find time to look at this, how can we proceed further. Is zero value meaningful in the context?
@haircommander I found this [PR](https://github.com/kubernetes/kubernetes/pull/59681) regarding the 0% threshold value of Eviction hard parameters, as the [PR description](https://github.com/kubernetes/kubernetes/pull/59681#issue-296047973) says that 0% threshold value doesn't make sense then why are we setting the default parameters to 0 in case of changing any of the parameter. Or is there any difference between the zero value that we are setting explicitly and the one that is set by default when changing the parameter. If there is none then I think we can go with the proposed change to inherit the default values to the unchanged parameters.
@vaibhav2107 

> I found this PR regarding the 0% threshold value of Eviction hard parameters, as the PR description says that 0% threshold value doesn't make sense ...

Which PR do you refer?
Could you share the link for that?
@atoato88 oh, forgot to attach the link, I have updated my comment to add that
hey I'm sorry I dropped the ball on this one. I think the key of that PR and why you are correct that we can take 0 as not present, is we also interpret 100% as "disable". I think we would need to update the documentation to say 100% is disable, and 0 will inherit the values of the base config (if all configs are 0, then we'll use 0 and disable). I do imagine there are some users that have disabled with 0 and thus would have the change in behavior, but I think this is better than disabling eviction when just one field is added...
> I do imagine there are some users that have disabled with 0 and thus would have the change in behavior, but I think this is better than disabling eviction when just one field is added...

To benefit these users who are using the current behaviour, we can use the switch case like I have explained in this [comment](https://github.com/kubernetes/kubernetes/issues/119985#issuecomment-2145561679), which can keep the both behaviours and could be helpful for the users.
How about it,,I would like to know the opinion on this.
Yeah I think making it toggleable is the right approach. We may be able to get away with just a feature gate, with the result of the GA being the new behavior is the only option (giving admins ample warning and time to update their configuraitons). 
Here is the summary of the issue to date. As the current behaviour is mentioned in the [bug description](https://github.com/kubernetes/kubernetes/issues/119985#issue-1853901529), I proposed the change in behaviour so that instead of zero value, eviction hard parameters should inherit their default values in case any of the parameter is changed. 
[Here](https://github.com/kubernetes/kubernetes/issues/119985#issuecomment-2145561679), I have explained how we can keep the both behaviours using the feature gate so that user does have the option to choose between the current and new behaviour. The community [has endorsed](https://github.com/kubernetes/kubernetes/issues/119985#issuecomment-2236628816) this idea and I am currently working on its implementation.

Fix patch:
diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go
index 888cc17fa0af2..e3e5e5f453f0b 100644
--- a/cmd/kubelet/app/server.go
+++ b/cmd/kubelet/app/server.go
@@ -443,6 +443,12 @@ func loadConfigFile(name string) (*kubeletconfiginternal.KubeletConfiguration, e
 	// See: https://github.com/kubernetes/kubernetes/pull/110263
 	if kc.EvictionHard == nil {
 		kc.EvictionHard = eviction.DefaultEvictionHard
+	} else if kc.MergeDefaultEvictionSettings {
+		for k, v := range eviction.DefaultEvictionHard {
+			if _, exists := kc.EvictionHard[k]; !exists {
+				kc.EvictionHard[k] = v
+			}
+		}
 	}
 	return kc, err
 }
diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go
index 86216cde30029..6cc045557bf87 100644
--- a/pkg/generated/openapi/zz_generated.openapi.go
+++ b/pkg/generated/openapi/zz_generated.openapi.go
@@ -64353,6 +64353,13 @@ func schema_k8sio_kubelet_config_v1beta1_KubeletConfiguration(ref common.Referen
 							},
 						},
 					},
+					"mergeDefaultEvictionSettings": {
+						SchemaProps: spec.SchemaProps{
+							Description: "mergeDefaultEvictionSettings indicates that defaults for the evictionHard, evictionSoft, evictionSoftGracePeriod, and evictionMinimumReclaim fields should be merged into values specified for those fields in this configuration. Signals specified in this configuration take precedence. Signals not specified in this configuration inherit their defaults. If false, and if any signal is specified in this configuration then other signals that are not specified in this configuration will be set to 0. It applies to merging the fields for which the default exists, and currently only evictionHard has default values. Default: false",
+							Type:        []string{"boolean"},
+							Format:      "",
+						},
+					},
 					"podsPerCore": {
 						SchemaProps: spec.SchemaProps{
 							Description: "podsPerCore is the maximum number of pods per core. Cannot exceed maxPods. The value must be a non-negative integer. If 0, there is no limit on the number of Pods. Default: 0",
diff --git a/pkg/kubelet/apis/config/fuzzer/fuzzer.go b/pkg/kubelet/apis/config/fuzzer/fuzzer.go
index 474d6db2ef016..70d6d485c6c11 100644
--- a/pkg/kubelet/apis/config/fuzzer/fuzzer.go
+++ b/pkg/kubelet/apis/config/fuzzer/fuzzer.go
@@ -98,6 +98,7 @@ func Funcs(codecs runtimeserializer.CodecFactory) []interface{} {
 			obj.HairpinMode = v1beta1.PromiscuousBridge
 			obj.EvictionHard = eviction.DefaultEvictionHard
 			obj.EvictionPressureTransitionPeriod = metav1.Duration{Duration: 5 * time.Minute}
+			obj.MergeDefaultEvictionSettings = false
 			obj.MakeIPTablesUtilChains = true
 			obj.IPTablesMasqueradeBit = kubeletconfigv1beta1.DefaultIPTablesMasqueradeBit
 			obj.IPTablesDropBit = kubeletconfigv1beta1.DefaultIPTablesDropBit
diff --git a/pkg/kubelet/apis/config/types.go b/pkg/kubelet/apis/config/types.go
index a7024cc993c35..027a097c8349c 100644
--- a/pkg/kubelet/apis/config/types.go
+++ b/pkg/kubelet/apis/config/types.go
@@ -322,6 +322,14 @@ type KubeletConfiguration struct {
 	// amount of a given resource the kubelet will reclaim when performing a pod eviction while
 	// that resource is under pressure. For example: {"imagefs.available": "2Gi"}
 	EvictionMinimumReclaim map[string]string
+	// mergeDefaultEvictionSettings indicates that defaults for the evictionHard, evictionSoft, evictionSoftGracePeriod, and evictionMinimumReclaim
+	// fields should be merged into values specified for those fields in this configuration.
+	// Signals specified in this configuration take precedence.
+	// Signals not specified in this configuration inherit their defaults.
+	// If false, and if any signal is specified in this configuration then other signals that
+	// are not specified in this configuration will be set to 0.
+	// It applies to merging the fields for which the default exists, and currently only evictionHard has default values.
+	MergeDefaultEvictionSettings bool
 	// podsPerCore is the maximum number of pods per core. Cannot exceed MaxPods.
 	// If 0, this field is ignored.
 	PodsPerCore int32
diff --git a/pkg/kubelet/apis/config/v1beta1/defaults.go b/pkg/kubelet/apis/config/v1beta1/defaults.go
index 960b1489d30b4..6a7ea7fd46881 100644
--- a/pkg/kubelet/apis/config/v1beta1/defaults.go
+++ b/pkg/kubelet/apis/config/v1beta1/defaults.go
@@ -236,6 +236,9 @@ func SetDefaults_KubeletConfiguration(obj *kubeletconfigv1beta1.KubeletConfigura
 	if obj.EvictionPressureTransitionPeriod == zeroDuration {
 		obj.EvictionPressureTransitionPeriod = metav1.Duration{Duration: 5 * time.Minute}
 	}
+	if obj.MergeDefaultEvictionSettings == nil {
+		obj.MergeDefaultEvictionSettings = ptr.To(false)
+	}
 	if obj.EnableControllerAttachDetach == nil {
 		obj.EnableControllerAttachDetach = ptr.To(true)
 	}
diff --git a/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go b/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go
index 347a3d54dec74..6c0bffa63a3dd 100644
--- a/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go
+++ b/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go
@@ -483,6 +483,9 @@ func autoConvert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(in
 	out.EvictionPressureTransitionPeriod = in.EvictionPressureTransitionPeriod
 	out.EvictionMaxPodGracePeriod = in.EvictionMaxPodGracePeriod
 	out.EvictionMinimumReclaim = *(*map[string]string)(unsafe.Pointer(&in.EvictionMinimumReclaim))
+	if err := v1.Convert_Pointer_bool_To_bool(&in.MergeDefaultEvictionSettings, &out.MergeDefaultEvictionSettings, s); err != nil {
+		return err
+	}
 	out.PodsPerCore = in.PodsPerCore
 	if err := v1.Convert_Pointer_bool_To_bool(&in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach, s); err != nil {
 		return err
@@ -685,6 +688,9 @@ func autoConvert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in
 	out.EvictionPressureTransitionPeriod = in.EvictionPressureTransitionPeriod
 	out.EvictionMaxPodGracePeriod = in.EvictionMaxPodGracePeriod
 	out.EvictionMinimumReclaim = *(*map[string]string)(unsafe.Pointer(&in.EvictionMinimumReclaim))
+	if err := v1.Convert_bool_To_Pointer_bool(&in.MergeDefaultEvictionSettings, &out.MergeDefaultEvictionSettings, s); err != nil {
+		return err
+	}
 	out.PodsPerCore = in.PodsPerCore
 	if err := v1.Convert_bool_To_Pointer_bool(&in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach, s); err != nil {
 		return err
diff --git a/staging/src/k8s.io/kubelet/config/v1beta1/types.go b/staging/src/k8s.io/kubelet/config/v1beta1/types.go
index 9fe75d41b0c15..5646febee1967 100644
--- a/staging/src/k8s.io/kubelet/config/v1beta1/types.go
+++ b/staging/src/k8s.io/kubelet/config/v1beta1/types.go
@@ -546,6 +546,16 @@ type KubeletConfiguration struct {
 	// Default: nil
 	// +optional
 	EvictionMinimumReclaim map[string]string `json:"evictionMinimumReclaim,omitempty"`
+	// mergeDefaultEvictionSettings indicates that defaults for the evictionHard, evictionSoft, evictionSoftGracePeriod, and evictionMinimumReclaim
+	// fields should be merged into values specified for those fields in this configuration.
+	// Signals specified in this configuration take precedence.
+	// Signals not specified in this configuration inherit their defaults.
+	// If false, and if any signal is specified in this configuration then other signals that
+	// are not specified in this configuration will be set to 0.
+	// It applies to merging the fields for which the default exists, and currently only evictionHard has default values.
+	// Default: false
+	// +optional
+	MergeDefaultEvictionSettings *bool `json:"mergeDefaultEvictionSettings,omitempty"`
 	// podsPerCore is the maximum number of pods per core. Cannot exceed maxPods.
 	// The value must be a non-negative integer.
 	// If 0, there is no limit on the number of Pods.
diff --git a/staging/src/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go
index 89dda0dfa17cd..87d56899c814d 100644
--- a/staging/src/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go
+++ b/staging/src/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go
@@ -372,6 +372,11 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) {
 			(*out)[key] = val
 		}
 	}
+	if in.MergeDefaultEvictionSettings != nil {
+		in, out := &in.MergeDefaultEvictionSettings, &out.MergeDefaultEvictionSettings
+		*out = new(bool)
+		**out = **in
+	}
 	if in.EnableControllerAttachDetach != nil {
 		in, out := &in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach
 		*out = new(bool)


Test patch:
diff --git a/pkg/kubelet/apis/config/helpers_test.go b/pkg/kubelet/apis/config/helpers_test.go
index 3be9d8a392e34..568b0be20df42 100644
--- a/pkg/kubelet/apis/config/helpers_test.go
+++ b/pkg/kubelet/apis/config/helpers_test.go
@@ -258,6 +258,7 @@ var (
 		"MaxPods",
 		"MemoryManagerPolicy",
 		"MemorySwap.SwapBehavior",
+		"MergeDefaultEvictionSettings",
 		"NodeLeaseDurationSeconds",
 		"NodeStatusMaxImages",
 		"NodeStatusUpdateFrequency.Duration",
diff --git a/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/after/v1beta1.yaml b/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/after/v1beta1.yaml
index 09b9e4ff839f5..1acdd87f50f11 100644
--- a/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/after/v1beta1.yaml
+++ b/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/after/v1beta1.yaml
@@ -70,6 +70,7 @@ maxPods: 110
 memoryManagerPolicy: None
 memorySwap: {}
 memoryThrottlingFactor: 0.9
+mergeDefaultEvictionSettings: false
 nodeLeaseDurationSeconds: 40
 nodeStatusMaxImages: 50
 nodeStatusReportFrequency: 5m0s
diff --git a/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/roundtrip/default/v1beta1.yaml b/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/roundtrip/default/v1beta1.yaml
index 99ff9671f8b52..33c9777a94aad 100644
--- a/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/roundtrip/default/v1beta1.yaml
+++ b/pkg/kubelet/apis/config/scheme/testdata/KubeletConfiguration/roundtrip/default/v1beta1.yaml
@@ -70,6 +70,7 @@ maxPods: 110
 memoryManagerPolicy: None
 memorySwap: {}
 memoryThrottlingFactor: 0.9
+mergeDefaultEvictionSettings: false
 nodeLeaseDurationSeconds: 40
 nodeStatusMaxImages: 50
 nodeStatusReportFrequency: 5m0s
diff --git a/pkg/kubelet/apis/config/v1beta1/defaults_test.go b/pkg/kubelet/apis/config/v1beta1/defaults_test.go
index c33c5c730ef84..391bdbe0b9d7f 100644
--- a/pkg/kubelet/apis/config/v1beta1/defaults_test.go
+++ b/pkg/kubelet/apis/config/v1beta1/defaults_test.go
@@ -104,6 +104,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				MaxParallelImagePulls:                     nil,
 				EvictionHard:                              nil,
 				EvictionPressureTransitionPeriod:          metav1.Duration{Duration: 5 * time.Minute},
+				MergeDefaultEvictionSettings:              ptr.To(false),
 				EnableControllerAttachDetach:              ptr.To(true),
 				MakeIPTablesUtilChains:                    ptr.To(true),
 				IPTablesMasqueradeBit:                     ptr.To[int32](DefaultIPTablesMasqueradeBit),
@@ -221,6 +222,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				EvictionPressureTransitionPeriod: zeroDuration,
 				EvictionMaxPodGracePeriod:        0,
 				EvictionMinimumReclaim:           map[string]string{},
+				MergeDefaultEvictionSettings:     ptr.To(false),
 				PodsPerCore:                      0,
 				EnableControllerAttachDetach:     ptr.To(false),
 				ProtectKernelDefaults:            false,
@@ -334,6 +336,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				EvictionSoftGracePeriod:                   map[string]string{},
 				EvictionPressureTransitionPeriod:          metav1.Duration{Duration: 5 * time.Minute},
 				EvictionMinimumReclaim:                    map[string]string{},
+				MergeDefaultEvictionSettings:              ptr.To(false),
 				EnableControllerAttachDetach:              ptr.To(false),
 				MakeIPTablesUtilChains:                    ptr.To(false),
 				IPTablesMasqueradeBit:                     ptr.To[int32](0),
@@ -472,6 +475,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				EvictionMinimumReclaim: map[string]string{
 					"imagefs.available": "1Gi",
 				},
+				MergeDefaultEvictionSettings:              ptr.To(true),
 				PodsPerCore:                               1,
 				EnableControllerAttachDetach:              ptr.To(true),
 				ProtectKernelDefaults:                     true,
@@ -630,6 +634,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				PodsPerCore:                               1,
 				EnableControllerAttachDetach:              ptr.To(true),
 				ProtectKernelDefaults:                     true,
+				MergeDefaultEvictionSettings:              ptr.To(true),
 				MakeIPTablesUtilChains:                    ptr.To(true),
 				IPTablesMasqueradeBit:                     ptr.To[int32](1),
 				IPTablesDropBit:                           ptr.To[int32](1),
@@ -748,6 +753,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				MaxParallelImagePulls:                     nil,
 				EvictionHard:                              nil,
 				EvictionPressureTransitionPeriod:          metav1.Duration{Duration: 5 * time.Minute},
+				MergeDefaultEvictionSettings:              ptr.To(false),
 				EnableControllerAttachDetach:              ptr.To(true),
 				MakeIPTablesUtilChains:                    ptr.To(true),
 				IPTablesMasqueradeBit:                     ptr.To[int32](DefaultIPTablesMasqueradeBit),
@@ -843,6 +849,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				MaxParallelImagePulls:                     ptr.To[int32](5),
 				EvictionHard:                              nil,
 				EvictionPressureTransitionPeriod:          metav1.Duration{Duration: 5 * time.Minute},
+				MergeDefaultEvictionSettings:              ptr.To(false),
 				EnableControllerAttachDetach:              ptr.To(true),
 				MakeIPTablesUtilChains:                    ptr.To(true),
 				IPTablesMasqueradeBit:                     ptr.To[int32](DefaultIPTablesMasqueradeBit),
@@ -938,6 +945,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				MaxParallelImagePulls:                     ptr.To[int32](1),
 				EvictionHard:                              nil,
 				EvictionPressureTransitionPeriod:          metav1.Duration{Duration: 5 * time.Minute},
+				MergeDefaultEvictionSettings:              ptr.To(false),
 				EnableControllerAttachDetach:              ptr.To(true),
 				MakeIPTablesUtilChains:                    ptr.To(true),
 				IPTablesMasqueradeBit:                     ptr.To[int32](DefaultIPTablesMasqueradeBit),
@@ -1033,6 +1041,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) {
 				MaxParallelImagePulls:                     nil,
 				EvictionHard:                              nil,
 				EvictionPressureTransitionPeriod:          metav1.Duration{Duration: 5 * time.Minute},
+				MergeDefaultEvictionSettings:              ptr.To(false),
 				EnableControllerAttachDetach:              ptr.To(true),
 				MakeIPTablesUtilChains:                    ptr.To(true),
 				IPTablesMasqueradeBit:                     ptr.To[int32](DefaultIPTablesMasqueradeBit),