Modify the code as the simple solution proposed by MaciekPytel.

This commit is contained in:
t-qini 2019-07-18 23:56:23 +08:00
parent 622a838c2c
commit f7c563ab06
11 changed files with 25 additions and 69 deletions

View File

@ -26,10 +26,8 @@ import (
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/config"
"k8s.io/autoscaler/cluster-autoscaler/config/dynamic"
"k8s.io/autoscaler/cluster-autoscaler/processors/nodegroupset"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/klog"
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
)
const (
@ -231,9 +229,3 @@ func BuildAlicloud(opts config.AutoscalingOptions, do cloudprovider.NodeGroupDis
}
return cloudProvider
}
// IsNodeInfoSimilar compares if two nodes should be considered part of the
// same NodeGroupSet.
func (ali *aliCloudProvider) IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
return nodegroupset.IsNodeInfoSimilar(n1, n2)
}

View File

@ -27,7 +27,6 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/config"
"k8s.io/autoscaler/cluster-autoscaler/processors/nodegroupset"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/klog"
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
@ -358,9 +357,3 @@ func BuildAWS(opts config.AutoscalingOptions, do cloudprovider.NodeGroupDiscover
}
return provider
}
// IsNodeInfoSimilar compares if two nodes should be considered part of the
// same NodeGroupSet.
func (aws *awsCloudProvider) IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
return nodegroupset.IsNodeInfoSimilar(n1, n2)
}

View File

@ -181,14 +181,14 @@ func nodesFromSameAzureNodePool(n1, n2 *schedulernodeinfo.NodeInfo) bool {
// IsNodeInfoSimilar compares if two nodes should be considered part of the
// same NodeGroupSet. This is true if they either belong to the same Azure agentpool
// or match usual conditions checked by IsNodeInfoSimilar, even if they have different agentpool labels.
func (azure *AzureCloudProvider) IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
func IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
if nodesFromSameAzureNodePool(n1, n2) {
return true
}
azureIgnoredLabels := make(map[string]bool)
for k, v := range nodegroupset.IgnoredLabels {
for k, v := range nodegroupset.BasicIgnoredLabels {
azureIgnoredLabels[k] = v
}
azureIgnoredLabels[AzureNodepoolLabel] = true
return nodegroupset.IsNodeInfoSimilarExceptIgnoredLabels(n1, n2, azureIgnoredLabels)
return nodegroupset.IsCloudProviderNodeInfoSimilar(n1, n2, azureIgnoredLabels)
}

View File

@ -27,7 +27,6 @@ import (
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/config"
"k8s.io/autoscaler/cluster-autoscaler/config/dynamic"
"k8s.io/autoscaler/cluster-autoscaler/processors/nodegroupset"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/klog"
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
@ -369,9 +368,3 @@ func (asg *Asg) Delete() error {
func (asg *Asg) Autoprovisioned() bool {
return false
}
// IsNodeInfoSimilar compares if two nodes should be considered part of the
// same NodeGroupSet.
func (baiducloud *baiducloudCloudProvider) IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
return nodegroupset.IsNodeInfoSimilar(n1, n2)
}

View File

@ -26,6 +26,12 @@ import (
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
)
const (
// AzureProviderName gets the azure.ProviderName. To prevent the cyclic importation,
// `azure.ProviderName` cannot be directly used here.
AzureProviderName = "azure"
)
// CloudProvider contains configuration info and functions for interacting with
// cloud provider (GCE, AWS, etc).
type CloudProvider interface {
@ -69,9 +75,6 @@ type CloudProvider interface {
// Refresh is called before every main loop and can be used to dynamically update cloud provider state.
// In particular the list of node groups returned by NodeGroups can change as a result of CloudProvider.Refresh().
Refresh() error
// IsNodeInfoSimilar compare if two nodes are similar
IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool
}
// ErrNotImplemented is returned if a method is not implemented.

View File

@ -26,7 +26,6 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/config"
"k8s.io/autoscaler/cluster-autoscaler/processors/nodegroupset"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/klog"
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
@ -367,9 +366,3 @@ func BuildGCE(opts config.AutoscalingOptions, do cloudprovider.NodeGroupDiscover
RegisterMetrics()
return provider
}
// IsNodeInfoSimilar compares if two nodes should be considered part of the
// same NodeGroupSet.
func (gce *GceCloudProvider) IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
return nodegroupset.IsNodeInfoSimilar(n1, n2)
}

View File

@ -26,10 +26,8 @@ import (
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/config"
"k8s.io/autoscaler/cluster-autoscaler/config/dynamic"
"k8s.io/autoscaler/cluster-autoscaler/processors/nodegroupset"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/klog"
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
)
const (
@ -209,9 +207,3 @@ func BuildMagnum(opts config.AutoscalingOptions, do cloudprovider.NodeGroupDisco
return provider
}
// IsNodeInfoSimilar compares if two nodes should be considered part of the
// same NodeGroupSet.
func (mcp *magnumCloudProvider) IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
return nodegroupset.IsNodeInfoSimilar(n1, n2)
}

View File

@ -57,8 +57,6 @@ type Autoscaler interface {
RunOnce(currentTime time.Time) errors.AutoscalerError
// ExitCleanUp is a clean-up performed just before process termination.
ExitCleanUp()
GetCloudProvider() cloudprovider.CloudProvider
}
// NewAutoscaler creates an autoscaler of an appropriate type according to the parameters

View File

@ -74,11 +74,6 @@ type StaticAutoscaler struct {
ignoredTaints taintKeySet
}
// GetCloudProvider returns the CloudProvider instance in staticAutoscaler
func (a *StaticAutoscaler) GetCloudProvider() cloudprovider.CloudProvider {
return a.CloudProvider
}
type staticAutoscalerProcessorCallbacks struct {
disableScaleDownForLoop bool
extraValues map[string]interface{}

View File

@ -29,10 +29,13 @@ import (
"syscall"
"time"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/azure"
"github.com/prometheus/client_golang/prometheus"
"github.com/spf13/pflag"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
cloudBuilder "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/builder"
"k8s.io/autoscaler/cluster-autoscaler/config"
"k8s.io/autoscaler/cluster-autoscaler/core"
@ -287,6 +290,10 @@ func buildAutoscaler() (core.Autoscaler, error) {
processors := ca_processors.DefaultProcessors()
processors.PodListProcessor = core.NewFilterOutSchedulablePodListProcessor()
if autoscalingOptions.CloudProviderName == cloudprovider.AzureProviderName {
processors.NodeGroupSetProcessor = &nodegroupset.BalancingNodeGroupSetProcessor{
Comparator: azure.IsNodeInfoSimilar}
}
opts := core.AutoscalerOptions{
AutoscalingOptions: autoscalingOptions,
@ -299,18 +306,7 @@ func buildAutoscaler() (core.Autoscaler, error) {
metrics.UpdateNapEnabled(autoscalingOptions.NodeAutoprovisioningEnabled)
// Create autoscaler.
ca, err := core.NewAutoscaler(opts)
if ca == nil || err != nil {
return ca, err
}
// Modify the NodeGroupSetProcessor.Comparator in autoscaler
cp := ca.GetCloudProvider()
processors.NodeGroupSetProcessor = &nodegroupset.BalancingNodeGroupSetProcessor{
Comparator: cp.IsNodeInfoSimilar,
}
return ca, err
return core.NewAutoscaler(opts)
}
func run(healthCheck *metrics.HealthCheck) {

View File

@ -33,9 +33,10 @@ const (
MaxFreeDifferenceRatio = 0.05
)
// IgnoredLabels define a set of basic labels that should be ignored when comparing the similarity
// of two nodes
var IgnoredLabels = map[string]bool{
// BasicIgnoredLabels define a set of basic labels that should be ignored when comparing the similarity
// of two nodes. Customized IgnoredLabels can be implemented in the corresponding codes of
// specific cloud provider and the BasicIgnoredLabels should always be considered part of them.
var BasicIgnoredLabels = map[string]bool{
apiv1.LabelHostname: true,
apiv1.LabelZoneFailureDomain: true,
apiv1.LabelZoneRegion: true,
@ -85,12 +86,12 @@ func compareLabels(nodes []*schedulernodeinfo.NodeInfo, ignoredLabels map[string
// are similar enough to likely be the same type of machine and if the set of labels
// is the same (except for a pre-defined set of labels like hostname or zone).
func IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
return IsNodeInfoSimilarExceptIgnoredLabels(n1, n2, IgnoredLabels)
return IsCloudProviderNodeInfoSimilar(n1, n2, BasicIgnoredLabels)
}
// IsNodeInfoSimilarExceptIgnoredLabels returns true if two NodeInfos are similar while
// ignoring the set of labels provided
func IsNodeInfoSimilarExceptIgnoredLabels(n1, n2 *schedulernodeinfo.NodeInfo, ignoredLabels map[string]bool) bool {
// IsCloudProviderNodeInfoSimilar remains the same logic of IsNodeInfoSimilar with the
// customized set of labels that should be ignored when comparing the similarity of two NodeInfos.
func IsCloudProviderNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo, ignoredLabels map[string]bool) bool {
capacity := make(map[apiv1.ResourceName][]resource.Quantity)
allocatable := make(map[apiv1.ResourceName][]resource.Quantity)
free := make(map[apiv1.ResourceName][]resource.Quantity)