diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 8c2d2a94d99..5eaa2b7561a 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -466,10 +466,11 @@ func buildGenericConfig( pluginInitializers...) if err != nil { lastErr = fmt.Errorf("failed to initialize admission: %v", err) + return } if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.APIPriorityAndFairness) && s.GenericServerRunOptions.EnablePriorityAndFairness { - genericConfig.FlowControl = BuildPriorityAndFairness(s, clientgoExternalClient, versionedInformers) + genericConfig.FlowControl, lastErr = BuildPriorityAndFairness(s, clientgoExternalClient, versionedInformers) } return @@ -491,13 +492,16 @@ func BuildAuthorizer(s *options.ServerRunOptions, EgressSelector *egressselector } // BuildPriorityAndFairness constructs the guts of the API Priority and Fairness filter -func BuildPriorityAndFairness(s *options.ServerRunOptions, extclient clientgoclientset.Interface, versionedInformer clientgoinformers.SharedInformerFactory) utilflowcontrol.Interface { +func BuildPriorityAndFairness(s *options.ServerRunOptions, extclient clientgoclientset.Interface, versionedInformer clientgoinformers.SharedInformerFactory) (utilflowcontrol.Interface, error) { + if s.GenericServerRunOptions.MaxRequestsInFlight+s.GenericServerRunOptions.MaxMutatingRequestsInFlight <= 0 { + return nil, fmt.Errorf("invalid configuration: MaxRequestsInFlight=%d and MaxMutatingRequestsInFlight=%d; they must add up to something positive", s.GenericServerRunOptions.MaxRequestsInFlight, s.GenericServerRunOptions.MaxMutatingRequestsInFlight) + } return utilflowcontrol.New( versionedInformer, extclient.FlowcontrolV1beta1(), s.GenericServerRunOptions.MaxRequestsInFlight+s.GenericServerRunOptions.MaxMutatingRequestsInFlight, s.GenericServerRunOptions.RequestTimeout/4, - ) + ), nil } // completedServerRunOptions is a private wrapper that enforces a call of Complete() before Run can be invoked. diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go index 859dc88cb55..e15191cb916 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go @@ -17,6 +17,8 @@ limitations under the License. package options import ( + "fmt" + "github.com/spf13/pflag" "k8s.io/apimachinery/pkg/runtime" @@ -126,6 +128,10 @@ func (o *RecommendedOptions) ApplyTo(config *server.RecommendedConfig) error { } if feature.DefaultFeatureGate.Enabled(features.APIPriorityAndFairness) { if config.ClientConfig != nil { + if config.MaxRequestsInFlight+config.MaxMutatingRequestsInFlight <= 0 { + return fmt.Errorf("invalid configuration: MaxRequestsInFlight=%d and MaxMutatingRequestsInFlight=%d; they must add up to something positive", config.MaxRequestsInFlight, config.MaxMutatingRequestsInFlight) + + } config.FlowControl = utilflowcontrol.New( config.SharedInformerFactory, kubernetes.NewForConfigOrDie(config.ClientConfig).FlowcontrolV1beta1(), diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go b/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go index b9080fa81d7..9758eec11b1 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go @@ -204,12 +204,16 @@ func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) { "DEPRECATED: the namespace from which the Kubernetes master services should be injected into pods.") fs.IntVar(&s.MaxRequestsInFlight, "max-requests-inflight", s.MaxRequestsInFlight, ""+ - "The maximum number of non-mutating requests in flight at a given time. When the server exceeds this, "+ - "it rejects requests. Zero for no limit.") + "This and --max-mutating-requests-inflight are summed to determine the server's total concurrency limit "+ + "(which must be positive) if --enable-priority-and-fairness is true. "+ + "Otherwise, this flag limits the maximum number of non-mutating requests in flight, "+ + "or a zero value disables the limit completely.") fs.IntVar(&s.MaxMutatingRequestsInFlight, "max-mutating-requests-inflight", s.MaxMutatingRequestsInFlight, ""+ - "The maximum number of mutating requests in flight at a given time. When the server exceeds this, "+ - "it rejects requests. Zero for no limit.") + "This and --max-requests-inflight are summed to determine the server's total concurrency limit "+ + "(which must be positive) if --enable-priority-and-fairness is true. "+ + "Otherwise, this flag limits the maximum number of mutating requests in flight, "+ + "or a zero value disables the limit completely.") fs.DurationVar(&s.RequestTimeout, "request-timeout", s.RequestTimeout, ""+ "An optional field indicating the duration a handler must keep a request open before timing "+