Skip to content

Commit a49760b

Browse files
committed
Non-zero cfs quota period duration requires feature flag
1 parent 88512be commit a49760b

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

pkg/kubelet/apis/config/validation/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ go_library(
1919
"//pkg/kubelet/apis/config:go_default_library",
2020
"//pkg/kubelet/cm/cpuset:go_default_library",
2121
"//pkg/kubelet/types:go_default_library",
22+
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
2223
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
2324
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
2425
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",

pkg/kubelet/apis/config/validation/validation.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"time"
2222

23+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2324
utilerrors "k8s.io/apimachinery/pkg/util/errors"
2425
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
2526
utilfeature "k8s.io/apiserver/pkg/util/feature"
@@ -31,6 +32,10 @@ import (
3132
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
3233
)
3334

35+
var (
36+
defaultCFSQuota = metav1.Duration{Duration: 100 * time.Millisecond}
37+
)
38+
3439
// ValidateKubeletConfiguration validates `kc` and returns an error if it is invalid
3540
func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error {
3641
allErrors := []error{}
@@ -60,6 +65,9 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error
6065
if kc.HealthzPort != 0 && utilvalidation.IsValidPortNum(int(kc.HealthzPort)) != nil {
6166
allErrors = append(allErrors, fmt.Errorf("invalid configuration: HealthzPort (--healthz-port) %v must be between 1 and 65535, inclusive", kc.HealthzPort))
6267
}
68+
if !localFeatureGate.Enabled(features.CPUCFSQuotaPeriod) && kc.CPUCFSQuotaPeriod != defaultCFSQuota {
69+
allErrors = append(allErrors, fmt.Errorf("invalid configuration: CPUCFSQuotaPeriod %v requires feature gate CustomCPUCFSQuotaPeriod", kc.CPUCFSQuotaPeriod))
70+
}
6371
if localFeatureGate.Enabled(features.CPUCFSQuotaPeriod) && utilvalidation.IsInRange(int(kc.CPUCFSQuotaPeriod.Duration), int(1*time.Microsecond), int(time.Second)) != nil {
6472
allErrors = append(allErrors, fmt.Errorf("invalid configuration: CPUCFSQuotaPeriod (--cpu-cfs-quota-period) %v must be between 1usec and 1sec, inclusive", kc.CPUCFSQuotaPeriod))
6573
}

pkg/kubelet/apis/config/validation/validation_test.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ func TestValidateKubeletConfiguration(t *testing.T) {
5252
RegistryPullQPS: 5,
5353
HairpinMode: kubeletconfig.PromiscuousBridge,
5454
NodeLeaseDurationSeconds: 1,
55-
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
55+
CPUCFSQuotaPeriod: metav1.Duration{Duration: 25 * time.Millisecond},
56+
FeatureGates: map[string]bool{
57+
"CustomCPUCFSQuotaPeriod": true,
58+
},
5659
}
5760
if allErrors := ValidateKubeletConfiguration(successCase1); allErrors != nil {
5861
t.Errorf("expect no errors, got %v", allErrors)
@@ -84,8 +87,11 @@ func TestValidateKubeletConfiguration(t *testing.T) {
8487
RegistryPullQPS: 5,
8588
HairpinMode: kubeletconfig.PromiscuousBridge,
8689
NodeLeaseDurationSeconds: 1,
87-
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
90+
CPUCFSQuotaPeriod: metav1.Duration{Duration: 50 * time.Millisecond},
8891
ReservedSystemCPUs: "0-3",
92+
FeatureGates: map[string]bool{
93+
"CustomCPUCFSQuotaPeriod": true,
94+
},
8995
}
9096
if allErrors := ValidateKubeletConfiguration(successCase2); allErrors != nil {
9197
t.Errorf("expect no errors, got %v", allErrors)
@@ -115,7 +121,7 @@ func TestValidateKubeletConfiguration(t *testing.T) {
115121
RegistryPullQPS: -10,
116122
HairpinMode: "foo",
117123
NodeLeaseDurationSeconds: -1,
118-
CPUCFSQuotaPeriod: metav1.Duration{Duration: 0},
124+
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
119125
}
120126
const numErrsErrorCase1 = 25
121127
if allErrors := ValidateKubeletConfiguration(errorCase1); len(allErrors.(utilerrors.Aggregate).Errors()) != numErrsErrorCase1 {
@@ -148,8 +154,11 @@ func TestValidateKubeletConfiguration(t *testing.T) {
148154
RegistryPullQPS: 5,
149155
HairpinMode: kubeletconfig.PromiscuousBridge,
150156
NodeLeaseDurationSeconds: 1,
151-
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
157+
CPUCFSQuotaPeriod: metav1.Duration{Duration: 50 * time.Millisecond},
152158
ReservedSystemCPUs: "0-3",
159+
FeatureGates: map[string]bool{
160+
"CustomCPUCFSQuotaPeriod": true,
161+
},
153162
}
154163
const numErrsErrorCase2 = 1
155164
if allErrors := ValidateKubeletConfiguration(errorCase2); len(allErrors.(utilerrors.Aggregate).Errors()) != numErrsErrorCase2 {

0 commit comments

Comments
 (0)