Skip to content

Commit 1af81c2

Browse files
authored
Merge pull request kubernetes#128197 from aojea/extract_provider_flags
disable cloud-provider code from kube-controller-manager
2 parents 122fa7c + 8d6769f commit 1af81c2

File tree

7 files changed

+93
-195
lines changed

7 files changed

+93
-195
lines changed

cluster/gce/gci/configure-helper.sh

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2224,9 +2224,6 @@ function start-kube-controller-manager {
22242224
if [[ -n "${SERVICE_CLUSTER_IP_RANGE:-}" ]]; then
22252225
params+=("--service-cluster-ip-range=${SERVICE_CLUSTER_IP_RANGE}")
22262226
fi
2227-
if [[ -n "${CONCURRENT_SERVICE_SYNCS:-}" ]]; then
2228-
params+=("--concurrent-service-syncs=${CONCURRENT_SERVICE_SYNCS}")
2229-
fi
22302227
if [[ "${NETWORK_PROVIDER:-}" == "kubenet" ]]; then
22312228
params+=("--allocate-node-cidrs=true")
22322229
elif [[ -n "${ALLOCATE_NODE_CIDRS:-}" ]]; then
@@ -2235,10 +2232,6 @@ function start-kube-controller-manager {
22352232
if [[ -n "${TERMINATED_POD_GC_THRESHOLD:-}" ]]; then
22362233
params+=("--terminated-pod-gc-threshold=${TERMINATED_POD_GC_THRESHOLD}")
22372234
fi
2238-
if [[ "${ENABLE_IP_ALIASES:-}" == 'true' ]]; then
2239-
params+=("--cidr-allocator-type=${NODE_IPAM_MODE}")
2240-
params+=("--configure-cloud-routes=false")
2241-
fi
22422235
if [[ -n "${FEATURE_GATES:-}" ]]; then
22432236
params+=("--feature-gates=${FEATURE_GATES}")
22442237
fi

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

Lines changed: 0 additions & 72 deletions
This file was deleted.

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

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ import (
5353
"k8s.io/client-go/tools/leaderelection/resourcelock"
5454
certutil "k8s.io/client-go/util/cert"
5555
"k8s.io/client-go/util/keyutil"
56-
cloudprovider "k8s.io/cloud-provider"
5756
cliflag "k8s.io/component-base/cli/flag"
5857
"k8s.io/component-base/cli/globalflag"
5958
"k8s.io/component-base/configz"
@@ -95,16 +94,6 @@ const (
9594
ConfigzName = "kubecontrollermanager.config.k8s.io"
9695
)
9796

98-
// ControllerLoopMode is the kube-controller-manager's mode of running controller loops that are cloud provider dependent
99-
type ControllerLoopMode int
100-
101-
const (
102-
// IncludeCloudLoops means the kube-controller-manager include the controller loops that are cloud provider dependent
103-
IncludeCloudLoops ControllerLoopMode = iota
104-
// ExternalLoops means the kube-controller-manager exclude the controller loops that are cloud provider dependent
105-
ExternalLoops
106-
)
107-
10897
// NewControllerManagerCommand creates a *cobra.Command object with default parameters
10998
func NewControllerManagerCommand() *cobra.Command {
11099
_, _ = utilversion.DefaultComponentGlobalsRegistry.ComponentGlobalsOrRegister(
@@ -396,15 +385,6 @@ type ControllerContext struct {
396385
// requested.
397386
RESTMapper *restmapper.DeferredDiscoveryRESTMapper
398387

399-
// Cloud is the cloud provider interface for the controllers to use.
400-
// It must be initialized and ready to use.
401-
Cloud cloudprovider.Interface
402-
403-
// Control for which control loops to be run
404-
// IncludeCloudLoops is for a kube-controller-manager running all loops
405-
// ExternalLoops is for a kube-controller-manager running with a cloud-controller-manager
406-
LoopMode ControllerLoopMode
407-
408388
// InformersStarted is closed after all of the controllers have been initialized and are running. After this point it is safe,
409389
// for an individual controller to start the shared informers. Before it is closed, they should not.
410390
InformersStarted chan struct{}
@@ -644,20 +624,12 @@ func CreateControllerContext(ctx context.Context, s *config.CompletedConfig, roo
644624
restMapper.Reset()
645625
}, 30*time.Second, ctx.Done())
646626

647-
cloud, loopMode, err := createCloudProvider(klog.FromContext(ctx), s.ComponentConfig.KubeCloudShared.CloudProvider.Name, s.ComponentConfig.KubeCloudShared.ExternalCloudVolumePlugin,
648-
s.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile, s.ComponentConfig.KubeCloudShared.AllowUntaggedCloud, sharedInformers)
649-
if err != nil {
650-
return ControllerContext{}, err
651-
}
652-
653627
controllerContext := ControllerContext{
654628
ClientBuilder: clientBuilder,
655629
InformerFactory: sharedInformers,
656630
ObjectOrMetadataInformerFactory: informerfactory.NewInformerFactory(sharedInformers, metadataInformers),
657631
ComponentConfig: s.ComponentConfig,
658632
RESTMapper: restMapper,
659-
Cloud: cloud,
660-
LoopMode: loopMode,
661633
InformersStarted: make(chan struct{}),
662634
ResyncPeriod: ResyncPeriod(s),
663635
ControllerManagerMetrics: controllersmetrics.NewControllerManagerMetrics("kube-controller-manager"),
@@ -702,12 +674,6 @@ func StartControllers(ctx context.Context, controllerCtx ControllerContext, cont
702674
}
703675
}
704676

705-
// Initialize the cloud provider with a reference to the clientBuilder only after token controller
706-
// has started in case the cloud provider uses the client builder.
707-
if controllerCtx.Cloud != nil {
708-
controllerCtx.Cloud.Initialize(controllerCtx.ClientBuilder, ctx.Done())
709-
}
710-
711677
// Each controller is passed a context where the logger has the name of
712678
// the controller set through WithName. That name then becomes the prefix of
713679
// of all log messages emitted by that controller.
@@ -751,8 +717,8 @@ func StartController(ctx context.Context, controllerCtx ControllerContext, contr
751717
}
752718
}
753719

754-
if controllerDescriptor.IsCloudProviderController() && controllerCtx.LoopMode != IncludeCloudLoops {
755-
logger.Info("Skipping a cloud provider controller", "controller", controllerName, "loopMode", controllerCtx.LoopMode)
720+
if controllerDescriptor.IsCloudProviderController() {
721+
logger.Info("Skipping a cloud provider controller", "controller", controllerName)
756722
return nil, nil
757723
}
758724

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,7 @@ func TestNoCloudProviderControllerStarted(t *testing.T) {
225225
ctx, cancel := context.WithCancel(ctx)
226226
defer cancel()
227227

228-
controllerCtx := ControllerContext{
229-
Cloud: nil,
230-
LoopMode: IncludeCloudLoops,
231-
}
228+
controllerCtx := ControllerContext{}
232229
controllerCtx.ComponentConfig.Generic.Controllers = []string{"*"}
233230
for _, controller := range NewControllerDescriptors() {
234231
if !controller.IsCloudProviderController() {

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

Lines changed: 8 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ import (
3636
clientset "k8s.io/client-go/kubernetes"
3737
"k8s.io/client-go/metadata"
3838
restclient "k8s.io/client-go/rest"
39-
cloudnodelifecyclecontroller "k8s.io/cloud-provider/controllers/nodelifecycle"
40-
routecontroller "k8s.io/cloud-provider/controllers/route"
41-
servicecontroller "k8s.io/cloud-provider/controllers/service"
4239
cpnames "k8s.io/cloud-provider/names"
4340
"k8s.io/component-base/featuregate"
4441
"k8s.io/controller-manager/controller"
@@ -92,26 +89,8 @@ func newServiceLBControllerDescriptor() *ControllerDescriptor {
9289

9390
func startServiceLBController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {
9491
logger := klog.FromContext(ctx)
95-
if controllerContext.Cloud == nil {
96-
logger.Info("Warning: service-controller is set, but no cloud provider specified. Will not configure service controller.")
97-
return nil, false, nil
98-
}
99-
100-
serviceController, err := servicecontroller.New(
101-
controllerContext.Cloud,
102-
controllerContext.ClientBuilder.ClientOrDie("service-controller"),
103-
controllerContext.InformerFactory.Core().V1().Services(),
104-
controllerContext.InformerFactory.Core().V1().Nodes(),
105-
controllerContext.ComponentConfig.KubeCloudShared.ClusterName,
106-
utilfeature.DefaultFeatureGate,
107-
)
108-
if err != nil {
109-
// This error shouldn't fail. It lives like this as a legacy.
110-
logger.Error(err, "Failed to start service controller.")
111-
return nil, false, nil
112-
}
113-
go serviceController.Run(ctx, int(controllerContext.ComponentConfig.ServiceController.ConcurrentServiceSyncs), controllerContext.ControllerManagerMetrics)
114-
return nil, true, nil
92+
logger.Info("Warning: service-controller is set, but no cloud provider functionality is available in kube-controller-manger (KEP-2395). Will not configure service controller.")
93+
return nil, false, nil
11594
}
11695
func newNodeIpamControllerDescriptor() *ControllerDescriptor {
11796
return &ControllerDescriptor{
@@ -133,11 +112,7 @@ func startNodeIpamController(ctx context.Context, controllerContext ControllerCo
133112

134113
if controllerContext.ComponentConfig.KubeCloudShared.CIDRAllocatorType == string(ipam.CloudAllocatorType) {
135114
// Cannot run cloud ipam controller if cloud provider is nil (--cloud-provider not set or set to 'external')
136-
if controllerContext.Cloud == nil {
137-
return nil, false, errors.New("--cidr-allocator-type is set to 'CloudAllocator' but cloud provider is not configured")
138-
}
139-
// As part of the removal of all the cloud providers from kubernetes, this support will be removed as well
140-
klog.Warningf("DEPRECATED: 'CloudAllocator' bas been deprecated and will be removed in a future release.")
115+
return nil, false, errors.New("--cidr-allocator-type is set to 'CloudAllocator' but cloud provider is not configured")
141116
}
142117

143118
clusterCIDRs, err := validateCIDRs(controllerContext.ComponentConfig.KubeCloudShared.ClusterCIDR)
@@ -182,7 +157,7 @@ func startNodeIpamController(ctx context.Context, controllerContext ControllerCo
182157
nodeIpamController, err := nodeipamcontroller.NewNodeIpamController(
183158
ctx,
184159
controllerContext.InformerFactory.Core().V1().Nodes(),
185-
controllerContext.Cloud,
160+
nil, // no cloud provider on kube-controller-manager since v1.31 (KEP-2395)
186161
controllerContext.ClientBuilder.ClientOrDie("node-controller"),
187162
clusterCIDRs,
188163
serviceCIDR,
@@ -266,27 +241,8 @@ func newCloudNodeLifecycleControllerDescriptor() *ControllerDescriptor {
266241

267242
func startCloudNodeLifecycleController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {
268243
logger := klog.FromContext(ctx)
269-
if controllerContext.Cloud == nil {
270-
logger.Info("Warning: node-controller is set, but no cloud provider specified. Will not configure node lifecyle controller.")
271-
return nil, false, nil
272-
}
273-
274-
cloudNodeLifecycleController, err := cloudnodelifecyclecontroller.NewCloudNodeLifecycleController(
275-
controllerContext.InformerFactory.Core().V1().Nodes(),
276-
// cloud node lifecycle controller uses existing cluster role from node-controller
277-
controllerContext.ClientBuilder.ClientOrDie("node-controller"),
278-
controllerContext.Cloud,
279-
controllerContext.ComponentConfig.KubeCloudShared.NodeMonitorPeriod.Duration,
280-
)
281-
if err != nil {
282-
// the controller manager should continue to run if the "Instances" interface is not
283-
// supported, though it's unlikely for a cloud provider to not support it
284-
logger.Error(err, "Failed to start cloud node lifecycle controller")
285-
return nil, false, nil
286-
}
287-
288-
go cloudNodeLifecycleController.Run(ctx, controllerContext.ControllerManagerMetrics)
289-
return nil, true, nil
244+
logger.Info("Warning: node-controller is set, but no cloud provider functionality is available in kube-controller-manger (KEP-2395). Will not configure node lifecyle controller.")
245+
return nil, false, nil
290246
}
291247

292248
func newNodeRouteControllerDescriptor() *ControllerDescriptor {
@@ -300,32 +256,8 @@ func newNodeRouteControllerDescriptor() *ControllerDescriptor {
300256

301257
func startNodeRouteController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {
302258
logger := klog.FromContext(ctx)
303-
if !controllerContext.ComponentConfig.KubeCloudShared.AllocateNodeCIDRs || !controllerContext.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes {
304-
logger.Info("Will not configure cloud provider routes for allocate-node-cidrs", "CIDRs", controllerContext.ComponentConfig.KubeCloudShared.AllocateNodeCIDRs, "routes", controllerContext.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes)
305-
return nil, false, nil
306-
}
307-
if controllerContext.Cloud == nil {
308-
logger.Info("Warning: configure-cloud-routes is set, but no cloud provider specified. Will not configure cloud provider routes.")
309-
return nil, false, nil
310-
}
311-
routes, ok := controllerContext.Cloud.Routes()
312-
if !ok {
313-
logger.Info("Warning: configure-cloud-routes is set, but cloud provider does not support routes. Will not configure cloud provider routes.")
314-
return nil, false, nil
315-
}
316-
317-
clusterCIDRs, err := validateCIDRs(controllerContext.ComponentConfig.KubeCloudShared.ClusterCIDR)
318-
if err != nil {
319-
return nil, false, err
320-
}
321-
322-
routeController := routecontroller.New(routes,
323-
controllerContext.ClientBuilder.ClientOrDie("route-controller"),
324-
controllerContext.InformerFactory.Core().V1().Nodes(),
325-
controllerContext.ComponentConfig.KubeCloudShared.ClusterName,
326-
clusterCIDRs)
327-
go routeController.Run(ctx, controllerContext.ComponentConfig.KubeCloudShared.RouteReconciliationPeriod.Duration, controllerContext.ControllerManagerMetrics)
328-
return nil, true, nil
259+
logger.Info("Warning: configure-cloud-routes is set, but no cloud provider functionality is available in kube-controller-manger (KEP-2395). Will not configure cloud provider routes.")
260+
return nil, false, nil
329261
}
330262

331263
func newPersistentVolumeBinderControllerDescriptor() *ControllerDescriptor {

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
restclient "k8s.io/client-go/rest"
3434
"k8s.io/client-go/tools/clientcmd"
3535
"k8s.io/client-go/tools/record"
36+
cloudprovider "k8s.io/cloud-provider"
3637
cpnames "k8s.io/cloud-provider/names"
3738
cpoptions "k8s.io/cloud-provider/options"
3839
cliflag "k8s.io/component-base/cli/flag"
@@ -50,6 +51,7 @@ import (
5051
kubectrlmgrconfigscheme "k8s.io/kubernetes/pkg/controller/apis/config/scheme"
5152
"k8s.io/kubernetes/pkg/controller/garbagecollector"
5253
garbagecollectorconfig "k8s.io/kubernetes/pkg/controller/garbagecollector/config"
54+
"k8s.io/kubernetes/pkg/controller/nodeipam/ipam"
5355
netutils "k8s.io/utils/net"
5456

5557
// add the kubernetes feature gates
@@ -452,6 +454,16 @@ func (s *KubeControllerManagerOptions) Validate(allControllers []string, disable
452454
errs = append(errs, s.Metrics.Validate()...)
453455
errs = append(errs, utilversion.ValidateKubeEffectiveVersion(s.ComponentGlobalsRegistry.EffectiveVersionFor(utilversion.DefaultKubeComponent)))
454456

457+
// in-tree cloud providers are disabled since v1.31 (KEP-2395)
458+
if len(s.KubeCloudShared.CloudProvider.Name) > 0 && !cloudprovider.IsExternal(s.KubeCloudShared.CloudProvider.Name) {
459+
cloudprovider.DisableWarningForProvider(s.KubeCloudShared.CloudProvider.Name)
460+
errs = append(errs, cloudprovider.ErrorForDisabledProvider(s.KubeCloudShared.CloudProvider.Name))
461+
}
462+
463+
if len(s.KubeCloudShared.CIDRAllocatorType) > 0 && s.KubeCloudShared.CIDRAllocatorType != string(ipam.RangeAllocatorType) {
464+
errs = append(errs, fmt.Errorf("built-in cloud providers are disabled. The ipam %s is not available", s.KubeCloudShared.CIDRAllocatorType))
465+
}
466+
455467
// TODO: validate component config, master and kubeconfig
456468

457469
return utilerrors.NewAggregate(errs)

0 commit comments

Comments
 (0)