mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 20:24:09 +00:00
Non-zero cfs quota period duration requires feature flag
This commit is contained in:
parent
88512be213
commit
a49760bfce
@ -19,6 +19,7 @@ go_library(
|
|||||||
"//pkg/kubelet/apis/config:go_default_library",
|
"//pkg/kubelet/apis/config:go_default_library",
|
||||||
"//pkg/kubelet/cm/cpuset:go_default_library",
|
"//pkg/kubelet/cm/cpuset:go_default_library",
|
||||||
"//pkg/kubelet/types:go_default_library",
|
"//pkg/kubelet/types:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
|
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
@ -31,6 +32,10 @@ import (
|
|||||||
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
defaultCFSQuota = metav1.Duration{Duration: 100 * time.Millisecond}
|
||||||
|
)
|
||||||
|
|
||||||
// ValidateKubeletConfiguration validates `kc` and returns an error if it is invalid
|
// ValidateKubeletConfiguration validates `kc` and returns an error if it is invalid
|
||||||
func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error {
|
func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error {
|
||||||
allErrors := []error{}
|
allErrors := []error{}
|
||||||
@ -60,6 +65,9 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error
|
|||||||
if kc.HealthzPort != 0 && utilvalidation.IsValidPortNum(int(kc.HealthzPort)) != nil {
|
if kc.HealthzPort != 0 && utilvalidation.IsValidPortNum(int(kc.HealthzPort)) != nil {
|
||||||
allErrors = append(allErrors, fmt.Errorf("invalid configuration: HealthzPort (--healthz-port) %v must be between 1 and 65535, inclusive", kc.HealthzPort))
|
allErrors = append(allErrors, fmt.Errorf("invalid configuration: HealthzPort (--healthz-port) %v must be between 1 and 65535, inclusive", kc.HealthzPort))
|
||||||
}
|
}
|
||||||
|
if !localFeatureGate.Enabled(features.CPUCFSQuotaPeriod) && kc.CPUCFSQuotaPeriod != defaultCFSQuota {
|
||||||
|
allErrors = append(allErrors, fmt.Errorf("invalid configuration: CPUCFSQuotaPeriod %v requires feature gate CustomCPUCFSQuotaPeriod", kc.CPUCFSQuotaPeriod))
|
||||||
|
}
|
||||||
if localFeatureGate.Enabled(features.CPUCFSQuotaPeriod) && utilvalidation.IsInRange(int(kc.CPUCFSQuotaPeriod.Duration), int(1*time.Microsecond), int(time.Second)) != nil {
|
if localFeatureGate.Enabled(features.CPUCFSQuotaPeriod) && utilvalidation.IsInRange(int(kc.CPUCFSQuotaPeriod.Duration), int(1*time.Microsecond), int(time.Second)) != nil {
|
||||||
allErrors = append(allErrors, fmt.Errorf("invalid configuration: CPUCFSQuotaPeriod (--cpu-cfs-quota-period) %v must be between 1usec and 1sec, inclusive", kc.CPUCFSQuotaPeriod))
|
allErrors = append(allErrors, fmt.Errorf("invalid configuration: CPUCFSQuotaPeriod (--cpu-cfs-quota-period) %v must be between 1usec and 1sec, inclusive", kc.CPUCFSQuotaPeriod))
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,10 @@ func TestValidateKubeletConfiguration(t *testing.T) {
|
|||||||
RegistryPullQPS: 5,
|
RegistryPullQPS: 5,
|
||||||
HairpinMode: kubeletconfig.PromiscuousBridge,
|
HairpinMode: kubeletconfig.PromiscuousBridge,
|
||||||
NodeLeaseDurationSeconds: 1,
|
NodeLeaseDurationSeconds: 1,
|
||||||
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
|
CPUCFSQuotaPeriod: metav1.Duration{Duration: 25 * time.Millisecond},
|
||||||
|
FeatureGates: map[string]bool{
|
||||||
|
"CustomCPUCFSQuotaPeriod": true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
if allErrors := ValidateKubeletConfiguration(successCase1); allErrors != nil {
|
if allErrors := ValidateKubeletConfiguration(successCase1); allErrors != nil {
|
||||||
t.Errorf("expect no errors, got %v", allErrors)
|
t.Errorf("expect no errors, got %v", allErrors)
|
||||||
@ -84,8 +87,11 @@ func TestValidateKubeletConfiguration(t *testing.T) {
|
|||||||
RegistryPullQPS: 5,
|
RegistryPullQPS: 5,
|
||||||
HairpinMode: kubeletconfig.PromiscuousBridge,
|
HairpinMode: kubeletconfig.PromiscuousBridge,
|
||||||
NodeLeaseDurationSeconds: 1,
|
NodeLeaseDurationSeconds: 1,
|
||||||
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
|
CPUCFSQuotaPeriod: metav1.Duration{Duration: 50 * time.Millisecond},
|
||||||
ReservedSystemCPUs: "0-3",
|
ReservedSystemCPUs: "0-3",
|
||||||
|
FeatureGates: map[string]bool{
|
||||||
|
"CustomCPUCFSQuotaPeriod": true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
if allErrors := ValidateKubeletConfiguration(successCase2); allErrors != nil {
|
if allErrors := ValidateKubeletConfiguration(successCase2); allErrors != nil {
|
||||||
t.Errorf("expect no errors, got %v", allErrors)
|
t.Errorf("expect no errors, got %v", allErrors)
|
||||||
@ -115,7 +121,7 @@ func TestValidateKubeletConfiguration(t *testing.T) {
|
|||||||
RegistryPullQPS: -10,
|
RegistryPullQPS: -10,
|
||||||
HairpinMode: "foo",
|
HairpinMode: "foo",
|
||||||
NodeLeaseDurationSeconds: -1,
|
NodeLeaseDurationSeconds: -1,
|
||||||
CPUCFSQuotaPeriod: metav1.Duration{Duration: 0},
|
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
|
||||||
}
|
}
|
||||||
const numErrsErrorCase1 = 25
|
const numErrsErrorCase1 = 25
|
||||||
if allErrors := ValidateKubeletConfiguration(errorCase1); len(allErrors.(utilerrors.Aggregate).Errors()) != numErrsErrorCase1 {
|
if allErrors := ValidateKubeletConfiguration(errorCase1); len(allErrors.(utilerrors.Aggregate).Errors()) != numErrsErrorCase1 {
|
||||||
@ -148,8 +154,11 @@ func TestValidateKubeletConfiguration(t *testing.T) {
|
|||||||
RegistryPullQPS: 5,
|
RegistryPullQPS: 5,
|
||||||
HairpinMode: kubeletconfig.PromiscuousBridge,
|
HairpinMode: kubeletconfig.PromiscuousBridge,
|
||||||
NodeLeaseDurationSeconds: 1,
|
NodeLeaseDurationSeconds: 1,
|
||||||
CPUCFSQuotaPeriod: metav1.Duration{Duration: 100 * time.Millisecond},
|
CPUCFSQuotaPeriod: metav1.Duration{Duration: 50 * time.Millisecond},
|
||||||
ReservedSystemCPUs: "0-3",
|
ReservedSystemCPUs: "0-3",
|
||||||
|
FeatureGates: map[string]bool{
|
||||||
|
"CustomCPUCFSQuotaPeriod": true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
const numErrsErrorCase2 = 1
|
const numErrsErrorCase2 = 1
|
||||||
if allErrors := ValidateKubeletConfiguration(errorCase2); len(allErrors.(utilerrors.Aggregate).Errors()) != numErrsErrorCase2 {
|
if allErrors := ValidateKubeletConfiguration(errorCase2); len(allErrors.(utilerrors.Aggregate).Errors()) != numErrsErrorCase2 {
|
||||||
|
Loading…
Reference in New Issue
Block a user