From 498fa39af28e951a91e2b82f521a06b6f909cd62 Mon Sep 17 00:00:00 2001 From: cici37 Date: Mon, 25 Jan 2021 12:52:02 -0800 Subject: [PATCH] Separate example func and add README.md --- cmd/cloud-controller-manager/README.md | 14 +++++++++++++ cmd/cloud-controller-manager/main.go | 20 ------------------- .../nodeipamcontroller.go | 20 +++++++++++++++++++ .../k8s.io/cloud-provider/sample/README.md | 4 ++-- 4 files changed, 36 insertions(+), 22 deletions(-) create mode 100644 cmd/cloud-controller-manager/README.md diff --git a/cmd/cloud-controller-manager/README.md b/cmd/cloud-controller-manager/README.md new file mode 100644 index 00000000000..7248ce39e47 --- /dev/null +++ b/cmd/cloud-controller-manager/README.md @@ -0,0 +1,14 @@ +# cloud-controller-manager/example + +This directory provides an example of how to leverage CCM extension mechanism. + +## Purpose + +Begin with 1.20, all cloud providers should not copy over or vendor in `k8s.io/kubernetes/cmd/cloud-controller-manager`. Inside this directory, an example is included to demonstrate how to leverage CCM extension mechanism to add a controller. +Please refer to `k8s.io/cloud-provider/sample` if you do not have the requirement of adding/deleting controllers in CCM. + +## Things you should NOT do + +1. Vendor in `k8s.io/cmd/cloud-controller-manager`. +2. Directly modify anything under `k8s.io/cmd/cloud-controller-manager` in this repo. +3. Make specific cloud provider changes here. diff --git a/cmd/cloud-controller-manager/main.go b/cmd/cloud-controller-manager/main.go index f9ff9a57080..73d0feb1bc1 100644 --- a/cmd/cloud-controller-manager/main.go +++ b/cmd/cloud-controller-manager/main.go @@ -26,7 +26,6 @@ package main import ( "math/rand" - "net/http" "os" "time" @@ -40,10 +39,7 @@ import ( "k8s.io/component-base/logs" _ "k8s.io/component-base/metrics/prometheus/clientgo" // load all the prometheus client-go plugins _ "k8s.io/component-base/metrics/prometheus/version" // for version metric registration - genericcontrollermanager "k8s.io/controller-manager/app" "k8s.io/klog/v2" - nodeipamcontrolleroptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options" - nodeipamconfig "k8s.io/kubernetes/pkg/controller/nodeipam/config" // For existing cloud providers, the option to import legacy providers is still available. // e.g. _"k8s.io/legacy-cloud-providers/" ) @@ -115,19 +111,3 @@ func cloudInitializer(config *cloudcontrollerconfig.CompletedConfig) cloudprovid return cloud } - -func startNodeIpamControllerWrapper(completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) app.InitFunc { - fs := pflag.NewFlagSet("fs", pflag.ContinueOnError) - var nodeIPAMControllerOptions nodeipamcontrolleroptions.NodeIPAMControllerOptions - nodeIPAMControllerOptions.AddFlags(fs) - errors := nodeIPAMControllerOptions.Validate() - if len(errors) > 0 { - klog.Fatal("NodeIPAM controller values are not properly.") - } - var nodeIPAMConfig nodeipamconfig.NodeIPAMControllerConfiguration - nodeIPAMControllerOptions.ApplyTo(&nodeIPAMConfig) - - return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) { - return startNodeIpamController(completedConfig, nodeIPAMConfig, ctx, cloud) - } -} diff --git a/cmd/cloud-controller-manager/nodeipamcontroller.go b/cmd/cloud-controller-manager/nodeipamcontroller.go index b96fa6c80c7..3d6d928db60 100644 --- a/cmd/cloud-controller-manager/nodeipamcontroller.go +++ b/cmd/cloud-controller-manager/nodeipamcontroller.go @@ -22,16 +22,20 @@ package main import ( "errors" "fmt" + "github.com/spf13/pflag" + "net" "net/http" "strings" utilfeature "k8s.io/apiserver/pkg/util/feature" cloudprovider "k8s.io/cloud-provider" + "k8s.io/cloud-provider/app" cloudcontrollerconfig "k8s.io/cloud-provider/app/config" genericcontrollermanager "k8s.io/controller-manager/app" "k8s.io/controller-manager/pkg/features" "k8s.io/klog/v2" + nodeipamcontrolleroptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options" nodeipamcontroller "k8s.io/kubernetes/pkg/controller/nodeipam" nodeipamconfig "k8s.io/kubernetes/pkg/controller/nodeipam/config" "k8s.io/kubernetes/pkg/controller/nodeipam/ipam" @@ -45,6 +49,22 @@ const ( defaultNodeMaskCIDRIPv6 = 64 ) +func startNodeIpamControllerWrapper(completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) app.InitFunc { + fs := pflag.NewFlagSet("fs", pflag.ContinueOnError) + var nodeIPAMControllerOptions nodeipamcontrolleroptions.NodeIPAMControllerOptions + nodeIPAMControllerOptions.AddFlags(fs) + errors := nodeIPAMControllerOptions.Validate() + if len(errors) > 0 { + klog.Fatal("NodeIPAM controller values are not properly.") + } + var nodeIPAMConfig nodeipamconfig.NodeIPAMControllerConfiguration + nodeIPAMControllerOptions.ApplyTo(&nodeIPAMConfig) + + return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) { + return startNodeIpamController(completedConfig, nodeIPAMConfig, ctx, cloud) + } +} + func startNodeIpamController(ccmConfig *cloudcontrollerconfig.CompletedConfig, nodeIPAMConfig nodeipamconfig.NodeIPAMControllerConfiguration, ctx genericcontrollermanager.ControllerContext, cloud cloudprovider.Interface) (http.Handler, bool, error) { var serviceCIDR *net.IPNet var secondaryServiceCIDR *net.IPNet diff --git a/staging/src/k8s.io/cloud-provider/sample/README.md b/staging/src/k8s.io/cloud-provider/sample/README.md index 26f8ac19ea4..369ee82ba55 100644 --- a/staging/src/k8s.io/cloud-provider/sample/README.md +++ b/staging/src/k8s.io/cloud-provider/sample/README.md @@ -4,9 +4,9 @@ This directory provides sample code about how all cloud providers should leverag ## Purpose -Begin with 1.20, all cloud providers should not copy over or vender in `k8s.io/kubernetes/cmd/cloud-controller-manager`. Inside this directory, some sample code will be provided to demonstrate how cloud providers should leverage cloud-controller-manager. +Begin with 1.20, all cloud providers should not copy over or vendor in `k8s.io/kubernetes/cmd/cloud-controller-manager`. Inside this directory, some sample code will be provided to demonstrate how cloud providers should leverage cloud-controller-manager. -## Steps cloud providers shoud follow +## Steps cloud providers should follow 1. Have your external repo under k8s.io. e.g. `k8s.io/cloud-provider-` 2. Create `main.go` file under your external repo CCM directory. Please refer to `basic_main.go` for a minimum working sample.