Skip to content

Commit 1b71b94

Browse files
authored
Merge pull request kubernetes#127711 from elmiko/correct-provider-deprecation-logic
Correct cloud provider detection logic to be more representative of deprecation and disablement status
2 parents b4ce3a5 + 38fe239 commit 1b71b94

File tree

5 files changed

+28
-79
lines changed

5 files changed

+28
-79
lines changed

cmd/kube-controller-manager/app/cloudproviders.go

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ package app
1919
import (
2020
"fmt"
2121

22-
utilfeature "k8s.io/apiserver/pkg/util/feature"
2322
"k8s.io/klog/v2"
24-
"k8s.io/kubernetes/pkg/features"
2523

2624
"k8s.io/client-go/informers"
2725
cloudprovider "k8s.io/cloud-provider"
@@ -32,29 +30,28 @@ import (
3230
func createCloudProvider(logger klog.Logger, cloudProvider string, externalCloudVolumePlugin string, cloudConfigFile string,
3331
allowUntaggedCloud bool, sharedInformers informers.SharedInformerFactory) (cloudprovider.Interface, ControllerLoopMode, error) {
3432
var cloud cloudprovider.Interface
35-
var loopMode ControllerLoopMode
3633
var err error
37-
38-
if utilfeature.DefaultFeatureGate.Enabled(features.DisableCloudProviders) && cloudprovider.IsDeprecatedInternal(cloudProvider) {
39-
cloudprovider.DisableWarningForProvider(cloudProvider)
40-
return nil, ExternalLoops, fmt.Errorf(
41-
"cloud provider %q was specified, but built-in cloud providers are disabled. Please set --cloud-provider=external and migrate to an external cloud provider",
42-
cloudProvider)
43-
}
34+
loopMode := ExternalLoops
4435

4536
if cloudprovider.IsExternal(cloudProvider) {
46-
loopMode = ExternalLoops
4737
if externalCloudVolumePlugin == "" {
4838
// externalCloudVolumePlugin is temporary until we split all cloud providers out.
4939
// So we just tell the caller that we need to run ExternalLoops without any cloud provider.
5040
return nil, loopMode, nil
5141
}
5242
cloud, err = cloudprovider.InitCloudProvider(externalCloudVolumePlugin, cloudConfigFile)
5343
} else {
54-
cloudprovider.DeprecationWarningForProvider(cloudProvider)
55-
56-
loopMode = IncludeCloudLoops
57-
cloud, err = cloudprovider.InitCloudProvider(cloudProvider, cloudConfigFile)
44+
// in the case where the cloudProvider is not set, we need to inform the caller that there
45+
// is no cloud provider and that the default loops should be used, and there is no error.
46+
// this will cause the kube-controller-manager to start the default controller contexts
47+
// without being attached to a specific cloud.
48+
if len(cloudProvider) == 0 {
49+
loopMode = IncludeCloudLoops
50+
} else {
51+
// for all other cloudProvider values the internal cloud loops are disabled
52+
cloudprovider.DisableWarningForProvider(cloudProvider)
53+
err = cloudprovider.ErrorForDisabledProvider(cloudProvider)
54+
}
5855
}
5956
if err != nil {
6057
return nil, loopMode, fmt.Errorf("cloud provider could not be initialized: %v", err)

cmd/kubelet/app/server.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -651,16 +651,10 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend
651651
}
652652

653653
if kubeDeps.Cloud == nil {
654-
if !cloudprovider.IsExternal(s.CloudProvider) {
655-
cloudprovider.DeprecationWarningForProvider(s.CloudProvider)
656-
cloud, err := cloudprovider.InitCloudProvider(s.CloudProvider, s.CloudConfigFile)
657-
if err != nil {
658-
return err
659-
}
660-
if cloud != nil {
661-
klog.V(2).InfoS("Successfully initialized cloud provider", "cloudProvider", s.CloudProvider, "cloudConfigFile", s.CloudConfigFile)
662-
}
663-
kubeDeps.Cloud = cloud
654+
if !cloudprovider.IsExternal(s.CloudProvider) && len(s.CloudProvider) != 0 {
655+
// internal cloud provider loops are disabled
656+
cloudprovider.DisableWarningForProvider(s.CloudProvider)
657+
return cloudprovider.ErrorForDisabledProvider(s.CloudProvider)
664658
}
665659
}
666660

pkg/kubeapiserver/options/cloudprovider.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func (opts *CloudProviderOptions) Validate() []error {
4242

4343
switch {
4444
case opts.CloudProvider == "":
45-
case opts.CloudProvider == "external":
45+
case cloudprovider.IsExternal(opts.CloudProvider):
4646
if !utilfeature.DefaultFeatureGate.Enabled(features.DisableCloudProviders) {
4747
errs = append(errs, fmt.Errorf("when using --cloud-provider set to '%s', "+
4848
"please set DisableCloudProviders feature to true", opts.CloudProvider))
@@ -51,15 +51,6 @@ func (opts *CloudProviderOptions) Validate() []error {
5151
errs = append(errs, fmt.Errorf("when using --cloud-provider set to '%s', "+
5252
"please set DisableKubeletCloudCredentialProviders feature to true", opts.CloudProvider))
5353
}
54-
case cloudprovider.IsDeprecatedInternal(opts.CloudProvider):
55-
if utilfeature.DefaultFeatureGate.Enabled(features.DisableCloudProviders) {
56-
errs = append(errs, fmt.Errorf("when using --cloud-provider set to '%s', "+
57-
"please set DisableCloudProviders feature to false", opts.CloudProvider))
58-
}
59-
if utilfeature.DefaultFeatureGate.Enabled(features.DisableKubeletCloudCredentialProviders) {
60-
errs = append(errs, fmt.Errorf("when using --cloud-provider set to '%s', "+
61-
"please set DisableKubeletCloudCredentialProviders feature to false", opts.CloudProvider))
62-
}
6354
default:
6455
errs = append(errs, fmt.Errorf("unknown --cloud-provider: %s", opts.CloudProvider))
6556
}

pkg/kubelet/kubelet.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
386386
return nil, fmt.Errorf("invalid sync frequency %d", kubeCfg.SyncFrequency.Duration)
387387
}
388388

389-
if utilfeature.DefaultFeatureGate.Enabled(features.DisableCloudProviders) && cloudprovider.IsDeprecatedInternal(cloudProvider) {
389+
if !cloudprovider.IsExternal(cloudProvider) && len(cloudProvider) != 0 {
390390
cloudprovider.DisableWarningForProvider(cloudProvider)
391391
return nil, fmt.Errorf("cloud provider %q was specified, but built-in cloud providers are disabled. Please set --cloud-provider=external and migrate to an external cloud provider", cloudProvider)
392392
}

staging/src/k8s.io/cloud-provider/plugins.go

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,8 @@ type Factory func(config io.Reader) (Interface, error)
3333

3434
// All registered cloud providers.
3535
var (
36-
providersMutex sync.Mutex
37-
providers = make(map[string]Factory)
38-
deprecatedCloudProviders = []struct {
39-
name string
40-
external bool
41-
detail string
42-
}{}
36+
providersMutex sync.Mutex
37+
providers = make(map[string]Factory)
4338
)
4439

4540
const externalCloudProvider = "external"
@@ -85,47 +80,19 @@ func IsExternal(name string) bool {
8580
return name == externalCloudProvider
8681
}
8782

88-
// IsDeprecatedInternal is responsible for preventing cloud.Interface
89-
// from being initialized in kubelet, kube-controller-manager or kube-api-server
90-
func IsDeprecatedInternal(name string) bool {
91-
for _, provider := range deprecatedCloudProviders {
92-
if provider.name == name {
93-
return true
94-
}
95-
}
96-
97-
return false
98-
}
99-
10083
// DisableWarningForProvider logs information about disabled cloud provider state
10184
func DisableWarningForProvider(providerName string) {
102-
for _, provider := range deprecatedCloudProviders {
103-
if provider.name == providerName {
104-
klog.Infof("INFO: Please make sure you are running external cloud controller manager binary for provider %q."+
105-
"In-tree cloud providers are currently disabled. Refer to https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/cloud-provider/sample"+
106-
"for example implementation.", providerName)
107-
detail := fmt.Sprintf("Please reach to sig-cloud-provider and use 'external' cloud provider for %q: %s", providerName, provider.detail)
108-
klog.Warningf("WARNING: %q built-in cloud provider is now disabled. %s", providerName, detail)
109-
break
110-
}
85+
if !IsExternal(providerName) {
86+
klog.Infof("INFO: Please make sure you are running an external cloud controller manager binary for provider %q."+
87+
"In-tree cloud providers are disabled. Refer to https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/cloud-provider/sample "+
88+
"for an example implementation.", providerName)
89+
klog.Warningf("WARNING: built-in cloud providers are disabled. Please set \"--cloud-provider=external\" and migrate to an external cloud controller manager for provider %q", providerName)
11190
}
11291
}
11392

114-
// DeprecationWarningForProvider logs information about deprecated cloud provider state
115-
func DeprecationWarningForProvider(providerName string) {
116-
for _, provider := range deprecatedCloudProviders {
117-
if provider.name != providerName {
118-
continue
119-
}
120-
121-
detail := provider.detail
122-
if provider.external {
123-
detail = fmt.Sprintf("Please use 'external' cloud provider for %s: %s", providerName, provider.detail)
124-
}
125-
126-
klog.Warningf("WARNING: %s built-in cloud provider is now deprecated. %s", providerName, detail)
127-
break
128-
}
93+
// ErrorForDisabledProvider returns an error formatted with the supplied provider name
94+
func ErrorForDisabledProvider(providerName string) error {
95+
return fmt.Errorf("cloud provider %q was specified, but built-in cloud providers are disabled. Please set --cloud-provider=external and migrate to an external cloud provider", providerName)
12996
}
13097

13198
// InitCloudProvider creates an instance of the named cloud provider.

0 commit comments

Comments
 (0)