Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cluster-autoscaler/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ GOOS?=linux
GOARCH?=$(shell go env GOARCH)
REGISTRY?=gcr.io/k8s-staging-autoscaling
DOCKER_NETWORK?=default
SUPPORTED_BUILD_TAGS=$(shell ls cloudprovider/builder/ | grep -e '^builder_.*\.go' | sed 's/builder_\(.*\)\.go/\1/')
SUPPORTED_BUILD_TAGS=$(shell ls cloudprovider/router/ | grep -e '^router_.*\.go' | sed 's/router_\(.*\)\.go/\1/')
ifdef BUILD_TAGS
TAGS_FLAG=--tags ${BUILD_TAGS}
PROVIDER=-${BUILD_TAGS}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,22 @@ import (
apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/builder"
"k8s.io/autoscaler/cluster-autoscaler/config/dynamic"
coreoptions "k8s.io/autoscaler/cluster-autoscaler/core/options"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/autoscaler/cluster-autoscaler/utils/gpu"
"k8s.io/client-go/informers"
klog "k8s.io/klog/v2"
)

func init() {
builder.RegisterCloudProvider(cloudprovider.AlicloudProviderName, func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider {
return BuildAlicloud(opts, do, rl)
})
builder.SetDefaultCloudProvider(cloudprovider.AlicloudProviderName)
}

const (
// GPULabel is the label added to nodes with GPU resource.
GPULabel = "aliyun.accelerator/nvidia_name"
Expand Down
9 changes: 9 additions & 0 deletions cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,23 @@ import (
apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/builder"
"k8s.io/autoscaler/cluster-autoscaler/config"
coreoptions "k8s.io/autoscaler/cluster-autoscaler/core/options"
"k8s.io/autoscaler/cluster-autoscaler/simulator/framework"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/autoscaler/cluster-autoscaler/utils/gpu"
"k8s.io/client-go/informers"
klog "k8s.io/klog/v2"
)

func init() {
builder.RegisterCloudProvider(cloudprovider.AwsProviderName, func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider {
return BuildAWS(opts, do, rl)
})
builder.SetDefaultCloudProvider(cloudprovider.AwsProviderName)
}

const (
// GPULabel is the label added to nodes with GPU resource.
GPULabel = "k8s.amazonaws.com/accelerator"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,21 @@ import (
apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/builder"
coreoptions "k8s.io/autoscaler/cluster-autoscaler/core/options"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/autoscaler/cluster-autoscaler/utils/gpu"
"k8s.io/client-go/informers"
klog "k8s.io/klog/v2"
)

func init() {
builder.RegisterCloudProvider(cloudprovider.AzureProviderName, func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider {
return BuildAzure(opts, do, rl)
})
builder.SetDefaultCloudProvider(cloudprovider.AzureProviderName)
}

const (
// GPULabel is the label added to nodes with GPU resource.
GPULabel = AKSLabelKeyPrefixValue + "accelerator"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,24 @@ import (
apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/builder"
"k8s.io/autoscaler/cluster-autoscaler/config"
"k8s.io/autoscaler/cluster-autoscaler/config/dynamic"
coreoptions "k8s.io/autoscaler/cluster-autoscaler/core/options"
"k8s.io/autoscaler/cluster-autoscaler/simulator/framework"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/autoscaler/cluster-autoscaler/utils/gpu"
"k8s.io/client-go/informers"
klog "k8s.io/klog/v2"
)

func init() {
builder.RegisterCloudProvider(cloudprovider.BaiducloudProviderName, func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider {
return BuildBaiducloud(opts, do, rl)
})
builder.SetDefaultCloudProvider(cloudprovider.BaiducloudProviderName)
}

const (
// GPULabel is the label added to nodes with GPU resource.
GPULabel = "baidu/nvidia_name"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,21 @@ import (
apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/builder"
coreoptions "k8s.io/autoscaler/cluster-autoscaler/core/options"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/autoscaler/cluster-autoscaler/utils/gpu"
"k8s.io/client-go/informers"
klog "k8s.io/klog/v2"
)

func init() {
builder.RegisterCloudProvider(cloudprovider.BizflyCloudProviderName, func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider {
return BuildBizflyCloud(opts, do, rl)
})
builder.SetDefaultCloudProvider(cloudprovider.BizflyCloudProviderName)
}

var _ cloudprovider.CloudProvider = (*bizflycloudCloudProvider)(nil)

const (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,21 @@ import (
brightbox "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/brightbox/gobrightbox"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/brightbox/gobrightbox/status"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/brightbox/k8ssdk"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/builder"
coreoptions "k8s.io/autoscaler/cluster-autoscaler/core/options"
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
"k8s.io/autoscaler/cluster-autoscaler/utils/gpu"
"k8s.io/client-go/informers"
klog "k8s.io/klog/v2"
)

func init() {
builder.RegisterCloudProvider(cloudprovider.BrightboxProviderName, func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider {
return BuildBrightbox(opts, do, rl)
})
builder.SetDefaultCloudProvider(cloudprovider.BrightboxProviderName)
}

const (
// GPULabel is added to nodes with GPU resource
GPULabel = "cloud.brightbox.com/gpu-node"
Expand Down
76 changes: 76 additions & 0 deletions cluster-autoscaler/cloudprovider/builder/builder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
Copyright 2018 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package builder

import (
"sort"

"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
coreoptions "k8s.io/autoscaler/cluster-autoscaler/core/options"
"k8s.io/client-go/informers"
"k8s.io/klog/v2"
)

// CloudProviderBuilder builds a cloud provider from provided parameters.
type CloudProviderBuilder func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider

var (
cloudProviderBuilders = make(map[string]CloudProviderBuilder)
defaultCloudProvider string
)

// RegisterCloudProvider registers a cloud provider builder.
func RegisterCloudProvider(name string, builder CloudProviderBuilder) {
if _, ok := cloudProviderBuilders[name]; ok {
klog.Fatalf("Cloud provider %s already registered", name)
}
cloudProviderBuilders[name] = builder
}

// GetCloudProviderBuilder returns a cloud provider builder by name.
func GetCloudProviderBuilder(name string) (CloudProviderBuilder, bool) {
builder, ok := cloudProviderBuilders[name]
return builder, ok
}

// AvailableCloudProviders returns the list of supported cloud providers.
func AvailableCloudProviders() []string {
providers := make([]string, 0, len(cloudProviderBuilders))
for name := range cloudProviderBuilders {
providers = append(providers, name)
}
sort.Strings(providers)
return providers
}

// SetDefaultCloudProvider sets the default cloud provider name.
func SetDefaultCloudProvider(name string) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like we lost setting the default provider in the flow with provider-specific tags. It seems like we could restore it pretty easily:

  • In the init() functions in cloudprovider/<provider_name>, add aSetDefaultCloudProvider() call. This preserves the previous behavior of not having to pass the cloud provider flag if you build with a provider-specific tag.
  • In router_all.go, add an init() function that calls SetDefaultCloudProvider(gce) to preserve the GCE default when you build with no tags.

WDYT?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

One thing to notice about this approach is the order of initialization of packages. We need the router package and effectively all cloud providers to be initialized before flags, so that the default cloud provider and available ones is initialized:

cloudProviderFlag           = flag.String("cloud-provider", cloudBuilder.DefaultCloudProvider(),
	"Cloud provider type. Available values: ["+strings.Join(cloudBuilder.AvailableCloudProviders(), ",")+"]")

Fortunately, the import path of the router ("k8s.io/autoscaler/cluster-autoscaler/cloudprovider/router") is before the path of the flags ("k8s.io/autoscaler/cluster-autoscaler/config/flags") in the lexical order.

defaultCloudProvider = name
}

// GetDefaultCloudProvider returns the default cloud provider name.
func GetDefaultCloudProvider() string {
return defaultCloudProvider
}

// DefaultCloudProvider returns the default cloud provider name.
func DefaultCloudProvider() string {
if def := GetDefaultCloudProvider(); def != "" {
return def
}
return cloudprovider.GceProviderName
}
44 changes: 0 additions & 44 deletions cluster-autoscaler/cloudprovider/builder/builder_alicloud.go

This file was deleted.

Loading