Skip to content

Commit 7ba71ae

Browse files
author
Akshay Kumar
committed
Merge pull request oracle#372 in OKE/oci-cloud-controller-manager from feature/serverless-1.24-service-controller to release-1.24
* commit 'd61ea944fc461864626a157bc721d3f5e4186023': Introducing custom service controller to support SKE clusters
2 parents b171898 + d61ea94 commit 7ba71ae

File tree

254 files changed

+34896
-67
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

254 files changed

+34896
-67
lines changed

cmd/cloud-provider-oci/app/cloud_provider_oci.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import (
5252
csicontroller "github.com/oracle/oci-cloud-controller-manager/cmd/oci-csi-controller-driver/csi-controller"
5353
"github.com/oracle/oci-cloud-controller-manager/cmd/oci-csi-controller-driver/csioptions"
5454
"github.com/oracle/oci-cloud-controller-manager/controllers"
55+
"github.com/oracle/oci-cloud-controller-manager/pkg/cloudprovider/providers/oci"
5556
providercfg "github.com/oracle/oci-cloud-controller-manager/pkg/cloudprovider/providers/oci/config"
5657
"github.com/oracle/oci-cloud-controller-manager/pkg/logging"
5758
"github.com/oracle/oci-cloud-controller-manager/pkg/metrics"
@@ -231,7 +232,8 @@ func run(logger *zap.SugaredLogger, config *cloudControllerManagerConfig.Complet
231232
defer wg.Done()
232233
// Run starts all the cloud controller manager control loops.
233234
cloudProvider := cloudInitializer(logger, config)
234-
controllerInitializers := cloudControllerManager.ConstructControllerInitializers(cloudControllerManager.DefaultInitFuncConstructors, config, cloudProvider)
235+
236+
controllerInitializers := cloudControllerManager.ConstructControllerInitializers(getInitFuncConstructors(), config, cloudProvider)
235237
// TODO move to newer cloudControllerManager dependency that provides a way to pass channel/context
236238
if err := cloudControllerManager.Run(config, cloudProvider, controllerInitializers, ctx.Done()); err != nil {
237239
logger.With(zap.Error(err)).Error("Error running cloud controller manager")
@@ -368,3 +370,19 @@ func getOCIClient(logger *zap.SugaredLogger, config *providercfg.Config) client.
368370
}
369371
return c
370372
}
373+
374+
func getInitFuncConstructors() map[string]cloudControllerManager.ControllerInitFuncConstructor{
375+
// Disable default service controller
376+
cloudControllerManager.ControllersDisabledByDefault.Insert("service")
377+
378+
// Add custom service controller init func
379+
defaultConstructors := cloudControllerManager.DefaultInitFuncConstructors
380+
defaultConstructors["oci-service"] = cloudControllerManager.ControllerInitFuncConstructor{
381+
InitContext: cloudControllerManager.ControllerInitContext{
382+
ClientName: "service-controller",
383+
},
384+
Constructor: oci.StartOciServiceControllerWrapper,
385+
}
386+
387+
return defaultConstructors
388+
}

cmd/oci-cloud-controller-manager/main.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
"os"
2222
"time"
2323

24-
_ "github.com/oracle/oci-cloud-controller-manager/pkg/cloudprovider/providers/oci"
24+
"github.com/oracle/oci-cloud-controller-manager/pkg/cloudprovider/providers/oci"
2525
"github.com/oracle/oci-cloud-controller-manager/pkg/logging"
2626
"github.com/spf13/pflag"
2727
"go.uber.org/zap"
@@ -53,7 +53,7 @@ func main() {
5353
}
5454

5555
fss := cliflag.NamedFlagSets{}
56-
command := app.NewCloudControllerManagerCommand(s, cloudInitializer, app.DefaultInitFuncConstructors, fss, wait.NeverStop)
56+
command := app.NewCloudControllerManagerCommand(s, cloudInitializer, getInitFuncConstructors(), fss, wait.NeverStop)
5757

5858
// TODO: once we switch everything over to Cobra commands, we can go back to calling
5959
// utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the
@@ -94,3 +94,19 @@ func cloudInitializer(config *config.CompletedConfig) cloudprovider.Interface {
9494

9595
return cloud
9696
}
97+
98+
func getInitFuncConstructors() map[string]app.ControllerInitFuncConstructor{
99+
// Disable default service controller
100+
app.ControllersDisabledByDefault.Insert("service")
101+
102+
// Add custom service controller init func
103+
defaultConstructors := app.DefaultInitFuncConstructors
104+
defaultConstructors["oci-service"] = app.ControllerInitFuncConstructor{
105+
InitContext: app.ControllerInitContext{
106+
ClientName: "service-controller",
107+
},
108+
Constructor: oci.StartOciServiceControllerWrapper,
109+
}
110+
111+
return defaultConstructors
112+
}

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ require (
6161
github.com/spf13/cobra v1.4.0
6262
github.com/spf13/pflag v1.0.5
6363
github.com/spf13/viper v1.8.1
64+
github.com/stretchr/testify v1.7.0
6465
go.uber.org/zap v1.19.1
6566
golang.org/x/net v0.0.0-20220403103023-749bd193bc2b
6667
golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12
@@ -74,6 +75,7 @@ require (
7475
k8s.io/cloud-provider v0.24.1
7576
k8s.io/component-base v0.24.1
7677
k8s.io/component-helpers v0.24.1
78+
k8s.io/controller-manager v0.24.1
7779
k8s.io/csi-translation-lib v0.24.1
7880
k8s.io/klog v1.0.0
7981
k8s.io/klog/v2 v2.60.1
@@ -136,6 +138,7 @@ require (
136138
github.com/opencontainers/go-digest v1.0.0 // indirect
137139
github.com/opencontainers/selinux v1.10.0 // indirect
138140
github.com/pelletier/go-toml v1.9.3 // indirect
141+
github.com/pmezard/go-difflib v1.0.0 // indirect
139142
github.com/prometheus/client_model v0.2.0 // indirect
140143
github.com/prometheus/common v0.33.0 // indirect
141144
github.com/prometheus/procfs v0.7.3 // indirect
@@ -179,7 +182,6 @@ require (
179182
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
180183
gopkg.in/yaml.v3 v3.0.1 // indirect
181184
k8s.io/apiextensions-apiserver v0.24.1 // indirect
182-
k8s.io/controller-manager v0.24.1 // indirect
183185
k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661 // indirect
184186
k8s.io/kube-scheduler v0.0.0 // indirect
185187
k8s.io/kubectl v0.0.0 // indirect

manifests/cloud-controller-manager/oci-cloud-controller-manager-rbac.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,23 @@ rules:
133133
- list
134134
- watch
135135
- patch
136+
137+
- apiGroups:
138+
- ""
139+
resources:
140+
- endpointslices
141+
verbs:
142+
- get
143+
- list
144+
- watch
145+
146+
- apiGroups:
147+
- ""
148+
resources:
149+
- pods
150+
verbs:
151+
- get
152+
- list
136153
---
137154
kind: ClusterRoleBinding
138155
apiVersion: rbac.authorization.k8s.io/v1beta1

pkg/cloudprovider/providers/oci/ccm.go

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,19 @@ import (
2626
"go.uber.org/zap"
2727
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2828
"k8s.io/apimachinery/pkg/util/wait"
29+
utilfeature "k8s.io/apiserver/pkg/util/feature"
2930
"k8s.io/client-go/informers"
3031
clientset "k8s.io/client-go/kubernetes"
3132
listersv1 "k8s.io/client-go/listers/core/v1"
33+
discoverylistersv1 "k8s.io/client-go/listers/discovery/v1"
3234
"k8s.io/client-go/tools/cache"
3335
cloudprovider "k8s.io/cloud-provider"
36+
cloudControllerManager "k8s.io/cloud-provider/app"
37+
"k8s.io/cloud-provider/app/config"
38+
cloudcontrollerconfig "k8s.io/cloud-provider/app/config"
39+
genericcontrollermanager "k8s.io/controller-manager/app"
40+
"k8s.io/controller-manager/controller"
41+
"k8s.io/klog/v2"
3442

3543
providercfg "github.com/oracle/oci-cloud-controller-manager/pkg/cloudprovider/providers/oci/config"
3644
"github.com/oracle/oci-cloud-controller-manager/pkg/metrics"
@@ -58,7 +66,8 @@ type CloudProvider struct {
5866
// NodeLister provides a cache to lookup nodes for deleting a load balancer.
5967
// Due to limitations in the OCI API around going from an IP to a subnet
6068
// we use the node lister to go from IP -> node / provider id -> ... -> subnet
61-
NodeLister listersv1.NodeLister
69+
NodeLister listersv1.NodeLister
70+
EndpointSliceLister discoverylistersv1.EndpointSliceLister
6271

6372
client client.Interface
6473
kubeclient clientset.Interface
@@ -175,15 +184,21 @@ func (cp *CloudProvider) Initialize(clientBuilder cloudprovider.ControllerClient
175184

176185
nodeInformer := factory.Core().V1().Nodes()
177186
go nodeInformer.Informer().Run(wait.NeverStop)
187+
178188
serviceInformer := factory.Core().V1().Services()
179189
go serviceInformer.Informer().Run(wait.NeverStop)
190+
191+
endpointSliceInformer := factory.Discovery().V1().EndpointSlices()
192+
go endpointSliceInformer.Informer().Run(wait.NeverStop)
193+
180194
go nodeInfoController.Run(wait.NeverStop)
181195

182196
cp.logger.Info("Waiting for node informer cache to sync")
183-
if !cache.WaitForCacheSync(wait.NeverStop, nodeInformer.Informer().HasSynced, serviceInformer.Informer().HasSynced) {
197+
if !cache.WaitForCacheSync(wait.NeverStop, nodeInformer.Informer().HasSynced, serviceInformer.Informer().HasSynced, endpointSliceInformer.Informer().HasSynced) {
184198
utilruntime.HandleError(fmt.Errorf("Timed out waiting for informers to sync"))
185199
}
186200
cp.NodeLister = nodeInformer.Lister()
201+
cp.EndpointSliceLister = endpointSliceInformer.Lister()
187202

188203
cp.securityListManagerFactory = func(mode string) securityListManager {
189204
if cp.config.LoadBalancer.Disabled {
@@ -248,3 +263,31 @@ func (cp *CloudProvider) HasClusterID() bool {
248263
func instanceCacheKeyFn(obj interface{}) (string, error) {
249264
return *obj.(*core.Instance).Id, nil
250265
}
266+
267+
func StartOciServiceControllerWrapper(initContext cloudControllerManager.ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) cloudControllerManager.InitFunc {
268+
return func(ctx context.Context, controllerContext genericcontrollermanager.ControllerContext) (controller.Interface, bool, error) {
269+
return startOciServiceController(ctx, initContext, completedConfig, cloud)
270+
}
271+
}
272+
273+
func startOciServiceController(ctx context.Context, initContext cloudControllerManager.ControllerInitContext, completedConfig *config.CompletedConfig, cloud cloudprovider.Interface) (controller.Interface, bool, error) {
274+
// Start the service controller
275+
serviceController, err := NewServiceController(
276+
cloud,
277+
completedConfig.ClientBuilder.ClientOrDie(initContext.ClientName),
278+
completedConfig.SharedInformers.Core().V1().Services(),
279+
completedConfig.SharedInformers.Core().V1().Nodes(),
280+
completedConfig.SharedInformers.Discovery().V1().EndpointSlices(),
281+
completedConfig.ComponentConfig.KubeCloudShared.ClusterName,
282+
5*time.Second,
283+
utilfeature.DefaultFeatureGate,
284+
)
285+
if err != nil {
286+
klog.Errorf("Failed to start OCI service controller: %v", err)
287+
return nil, false, err
288+
}
289+
290+
go serviceController.Run(ctx, int(completedConfig.ComponentConfig.ServiceController.ConcurrentServiceSyncs))
291+
292+
return nil, true, nil
293+
}

0 commit comments

Comments
 (0)