From 518936fb5fc3b6cf184c13d4d86c0dba4003a606 Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Mon, 16 Oct 2017 18:08:03 +0800 Subject: [PATCH] validate ipvs scheduler --- cmd/kube-proxy/app/validation.go | 31 +++++++++++++++++++++++ pkg/apis/componentconfig/types.go | 42 +++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/cmd/kube-proxy/app/validation.go b/cmd/kube-proxy/app/validation.go index f899bd35c71..887a66e2252 100644 --- a/cmd/kube-proxy/app/validation.go +++ b/cmd/kube-proxy/app/validation.go @@ -38,6 +38,7 @@ func Validate(config *componentconfig.KubeProxyConfiguration) field.ErrorList { allErrs = append(allErrs, validateKubeProxyConntrackConfiguration(config.Conntrack, newPath.Child("KubeProxyConntrackConfiguration"))...) allErrs = append(allErrs, validateProxyMode(config.Mode, newPath.Child("Mode"))...) allErrs = append(allErrs, validateClientConnectionConfiguration(config.ClientConnection, newPath.Child("ClientConnection"))...) + allErrs = append(allErrs, validateIPVSSchedulerMethod(config.IPVS.Scheduler, newPath.Child("KubeProxyIPVSConfiguration").Child("Scheduler"))...) if config.OOMScoreAdj != nil && (*config.OOMScoreAdj < -1000 || *config.OOMScoreAdj > 1000) { allErrs = append(allErrs, field.Invalid(newPath.Child("OOMScoreAdj"), *config.OOMScoreAdj, "must be within the range [-1000, 1000]")) @@ -156,3 +157,33 @@ func validateHostPort(input string, fldPath *field.Path) field.ErrorList { return allErrs } + +func validateIPVSSchedulerMethod(scheduler string, fldPath *field.Path) field.ErrorList { + supportedMethod := []string{ + string(componentconfig.RoundRobin), + string(componentconfig.WeightedRoundRobin), + string(componentconfig.LeastConnection), + string(componentconfig.WeightedLeastConnection), + string(componentconfig.LocalityBasedLeastConnection), + string(componentconfig.LocalityBasedLeastConnectionWithReplication), + string(componentconfig.SourceHashing), + string(componentconfig.DestinationHashing), + string(componentconfig.ShortestExpectedDelay), + string(componentconfig.NeverQueue), + "", + } + allErrs := field.ErrorList{} + var found bool + for i := range supportedMethod { + if scheduler == supportedMethod[i] { + found = true + break + } + } + // Not found + if !found { + errMsg := fmt.Sprintf("must be in %v, blank means the default algorithm method (currently rr)", supportedMethod) + allErrs = append(allErrs, field.Invalid(fldPath.Child("Scheduler"), string(scheduler), errMsg)) + } + return allErrs +} diff --git a/pkg/apis/componentconfig/types.go b/pkg/apis/componentconfig/types.go index 078fa11d006..f5233d459dc 100644 --- a/pkg/apis/componentconfig/types.go +++ b/pkg/apis/componentconfig/types.go @@ -160,6 +160,48 @@ const ( ProxyModeIPTables ProxyMode = "iptables" ) +// IPVSSchedulerMethod is the algorithm for allocating TCP connections and +// UDP datagrams to real servers. Scheduling algorithms are imple- +//wanted as kernel modules. Ten are shipped with the Linux Virtual Server. +type IPVSSchedulerMethod string + +const ( + // Robin Robin distributes jobs equally amongst the available real servers. + RoundRobin IPVSSchedulerMethod = "rr" + // Weighted Round Robin assigns jobs to real servers proportionally to there real servers' weight. + // Servers with higher weights receive new jobs first and get more jobs than servers with lower weights. + // Servers with equal weights get an equal distribution of new jobs. + WeightedRoundRobin IPVSSchedulerMethod = "wrr" + // Least Connection assigns more jobs to real servers with fewer active jobs. + LeastConnection IPVSSchedulerMethod = "lc" + // Weighted Least Connection assigns more jobs to servers with fewer jobs and + // relative to the real servers’weight(Ci/Wi). + WeightedLeastConnection IPVSSchedulerMethod = "wlc" + // Locality Based Least Connection assigns jobs destined for the same IP address to the same server if + // the server is not overloaded and available; otherwise assign jobs to servers with fewer jobs, + // and keep it for future assignment. + LocalityBasedLeastConnection IPVSSchedulerMethod = "lblc" + // Locality Based Least Connection with Replication assigns jobs destined for the same IP address to the + // least-connection node in the server set for the IP address. If all the node in the server set are over loaded, + // it picks up a node with fewer jobs in the cluster and adds it in the sever set for the target. + // If the server set has not been modified for the specified time, the most loaded node is removed from the server set, + // in order to avoid high degree of replication. + LocalityBasedLeastConnectionWithReplication IPVSSchedulerMethod = "lblcr" + // Source Hashing assigns jobs to servers through looking up a statically assigned hash table + // by their source IP addresses. + SourceHashing IPVSSchedulerMethod = "sh" + // Destination Hashing assigns jobs to servers through looking up a statically assigned hash table + // by their destination IP addresses. + DestinationHashing IPVSSchedulerMethod = "dh" + // Shortest Expected Delay assigns an incoming job to the server with the shortest expected delay. + // The expected delay that the job will experience is (Ci + 1) / Ui if sent to the ith server, in which + // Ci is the number of jobs on the the ith server and Ui is the fixed service rate (weight) of the ith server. + ShortestExpectedDelay IPVSSchedulerMethod = "sed" + // Never Queue assigns an incoming job to an idle server if there is, instead of waiting for a fast one; + // if all the servers are busy, it adopts the Shortest Expected Delay policy to assign the job. + NeverQueue IPVSSchedulerMethod = "nq" +) + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type KubeSchedulerConfiguration struct {