diff --git a/cmd/cloud-controller-manager/BUILD b/cmd/cloud-controller-manager/BUILD index aac1159749a..b3cd40080be 100644 --- a/cmd/cloud-controller-manager/BUILD +++ b/cmd/cloud-controller-manager/BUILD @@ -5,9 +5,6 @@ licenses(["notice"]) load( "@io_bazel_rules_go//go:def.bzl", "go_binary", - "go_library", - "go_test", - "cgo_library", ) go_binary( diff --git a/cmd/cloud-controller-manager/app/BUILD b/cmd/cloud-controller-manager/app/BUILD index 996464b0de8..4a597874d32 100644 --- a/cmd/cloud-controller-manager/app/BUILD +++ b/cmd/cloud-controller-manager/app/BUILD @@ -4,10 +4,7 @@ licenses(["notice"]) load( "@io_bazel_rules_go//go:def.bzl", - "go_binary", "go_library", - "go_test", - "cgo_library", ) go_library( @@ -17,8 +14,8 @@ go_library( deps = [ "//cmd/cloud-controller-manager/app/options:go_default_library", "//pkg/api/v1:go_default_library", - "//pkg/client/clientset_generated/release_1_5:go_default_library", - "//pkg/client/clientset_generated/release_1_5/typed/core/v1:go_default_library", + "//pkg/client/clientset_generated/clientset:go_default_library", + "//pkg/client/clientset_generated/clientset/typed/core/v1:go_default_library", "//pkg/client/leaderelection:go_default_library", "//pkg/client/leaderelection/resourcelock:go_default_library", "//pkg/client/record:go_default_library", diff --git a/cmd/cloud-controller-manager/app/controllermanager.go b/cmd/cloud-controller-manager/app/controllermanager.go index e4e2fa4bb4d..8e6f4b2889d 100644 --- a/cmd/cloud-controller-manager/app/controllermanager.go +++ b/cmd/cloud-controller-manager/app/controllermanager.go @@ -14,12 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package app implements a server that runs a set of active -// components. This includes replication controllers, service endpoints and -// nodes. -// -// CAUTION: If you update code in this file, you may need to also update code -// in contrib/mesos/pkg/controllermanager/controllermanager.go package app import ( @@ -33,8 +27,8 @@ import ( "k8s.io/kubernetes/cmd/cloud-controller-manager/app/options" "k8s.io/kubernetes/pkg/api/v1" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" - v1core "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/core/v1" + clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" + v1core "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1" "k8s.io/kubernetes/pkg/client/leaderelection" "k8s.io/kubernetes/pkg/client/leaderelection/resourcelock" "k8s.io/kubernetes/pkg/client/record" @@ -61,20 +55,14 @@ const ( ControllerStartJitter = 1.0 ) -// NewControllerManagerCommand creates a *cobra.Command object with default parameters -func NewControllerManagerCommand() *cobra.Command { - s := options.NewExternalCMServer() +// NewCloudControllerManagerCommand creates a *cobra.Command object with default parameters +func NewCloudControllerManagerCommand() *cobra.Command { + s := options.NewCloudControllerManagerServer() s.AddFlags(pflag.CommandLine) cmd := &cobra.Command{ Use: "cloud-controller-manager", - Long: `The Kubernetes controller manager is a daemon that embeds -the core control loops shipped with Kubernetes. In applications of robotics and -automation, a control loop is a non-terminating loop that regulates the state of -the system. In Kubernetes, a controller is a control loop that watches the shared -state of the cluster through the apiserver and makes changes attempting to move the -current state towards the desired state. Examples of controllers that ship with -Kubernetes today are the replication controller, endpoints controller, namespace -controller, and serviceaccounts controller.`, + Long: `The Cloud controller manager is a daemon that embeds +the cloud specific control loops shipped with Kubernetes.`, Run: func(cmd *cobra.Command, args []string) { }, } @@ -82,7 +70,8 @@ controller, and serviceaccounts controller.`, return cmd } -func ResyncPeriod(s *options.ExternalCMServer) func() time.Duration { +// ResyncPeriod computes the time interval a shared informer waits before resyncing with the api server +func ResyncPeriod(s *options.CloudControllerManagerServer) func() time.Duration { return func() time.Duration { factor := rand.Float64() + 1 return time.Duration(float64(s.MinResyncPeriod.Nanoseconds()) * factor) @@ -90,7 +79,7 @@ func ResyncPeriod(s *options.ExternalCMServer) func() time.Duration { } // Run runs the ExternalCMServer. This should never exit. -func Run(s *options.ExternalCMServer, cloud cloudprovider.Interface) error { +func Run(s *options.CloudControllerManagerServer, cloud cloudprovider.Interface) error { if c, err := configz.New("componentconfig"); err == nil { c.Set(s.KubeControllerManagerConfiguration) } else { @@ -101,6 +90,7 @@ func Run(s *options.ExternalCMServer, cloud cloudprovider.Interface) error { return err } + // Set the ContentType of the requests from kube client kubeconfig.ContentConfig.ContentType = s.ContentType // Override kubeconfig qps/burst settings from flags kubeconfig.QPS = s.KubeAPIQPS @@ -111,6 +101,7 @@ func Run(s *options.ExternalCMServer, cloud cloudprovider.Interface) error { } leaderElectionClient := clientset.NewForConfigOrDie(restclient.AddUserAgent(kubeconfig, "leader-election")) + // Start the external controller manager server go func() { mux := http.NewServeMux() healthz.InstallHandler(mux) @@ -159,12 +150,13 @@ func Run(s *options.ExternalCMServer, cloud cloudprovider.Interface) error { panic("unreachable") } + // Identity used to distinguish between multiple cloud controller manager instances id, err := os.Hostname() if err != nil { return err } - // TODO: enable other lock types + // Lock required for leader election rl := resourcelock.EndpointsLock{ EndpointsMeta: v1.ObjectMeta{ Namespace: "kube-system", @@ -177,6 +169,7 @@ func Run(s *options.ExternalCMServer, cloud cloudprovider.Interface) error { }, } + // Try and become the leader and start cloud controller manager loops leaderelection.RunOrDie(leaderelection.LeaderElectionConfig{ Lock: &rl, LeaseDuration: s.LeaderElection.LeaseDuration.Duration, @@ -192,7 +185,9 @@ func Run(s *options.ExternalCMServer, cloud cloudprovider.Interface) error { panic("unreachable") } -func StartControllers(s *options.ExternalCMServer, kubeconfig *restclient.Config, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}, recorder record.EventRecorder, cloud cloudprovider.Interface) error { +// StartControllers starts the cloud specific controller loops. +func StartControllers(s *options.CloudControllerManagerServer, kubeconfig *restclient.Config, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}, recorder record.EventRecorder, cloud cloudprovider.Interface) error { + // Function to build the kube client object client := func(serviceAccountName string) clientset.Interface { return rootClientBuilder.ClientOrDie(serviceAccountName) } @@ -203,6 +198,7 @@ func StartControllers(s *options.ExternalCMServer, kubeconfig *restclient.Config glog.Warningf("Unsuccessful parsing of cluster CIDR %v: %v", s.ClusterCIDR, err) } + // Start the CloudNodeController nodeController, err := nodecontroller.NewCloudNodeController( sharedInformers.Nodes(), client("cloud-node-controller"), cloud, @@ -213,6 +209,7 @@ func StartControllers(s *options.ExternalCMServer, kubeconfig *restclient.Config nodeController.Run() time.Sleep(wait.Jitter(s.ControllerStartInterval.Duration, ControllerStartJitter)) + // Start the service controller serviceController, err := servicecontroller.New(cloud, client("service-controller"), s.ClusterName) if err != nil { glog.Errorf("Failed to start service controller: %v", err) @@ -221,6 +218,7 @@ func StartControllers(s *options.ExternalCMServer, kubeconfig *restclient.Config } time.Sleep(wait.Jitter(s.ControllerStartInterval.Duration, ControllerStartJitter)) + // If CIDRs should be allocated for pods and set on the CloudProvider, then start the route controller if s.AllocateNodeCIDRs && s.ConfigureCloudRoutes { if routes, ok := cloud.Routes(); !ok { glog.Warning("configure-cloud-routes is set, but cloud provider does not support routes. Will not configure cloud provider routes.") diff --git a/cmd/cloud-controller-manager/app/options/BUILD b/cmd/cloud-controller-manager/app/options/BUILD index 769db121132..cc1f41a8605 100644 --- a/cmd/cloud-controller-manager/app/options/BUILD +++ b/cmd/cloud-controller-manager/app/options/BUILD @@ -4,10 +4,7 @@ licenses(["notice"]) load( "@io_bazel_rules_go//go:def.bzl", - "go_binary", "go_library", - "go_test", - "cgo_library", ) go_library( diff --git a/cmd/cloud-controller-manager/app/options/options.go b/cmd/cloud-controller-manager/app/options/options.go index 1da8b823bb0..b1db26ae7b9 100644 --- a/cmd/cloud-controller-manager/app/options/options.go +++ b/cmd/cloud-controller-manager/app/options/options.go @@ -14,10 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package options provides the flags used for the controller manager. -// -// CAUTION: If you update code in this file, you may need to also update code -// in contrib/mesos/pkg/controllermanager/controllermanager.go package options import ( @@ -32,23 +28,22 @@ import ( "github.com/spf13/pflag" ) -// ExternalCMServer is the main context object for the controller manager. -type ExternalCMServer struct { +// CloudControllerMangerServer is the main context object for the controller manager. +type CloudControllerManagerServer struct { componentconfig.KubeControllerManagerConfiguration Master string Kubeconfig string } -// NewCMServer creates a new ExternalCMServer with a default config. -func NewExternalCMServer() *ExternalCMServer { - s := ExternalCMServer{ +// NewCloudControllerManagerServer creates a new ExternalCMServer with a default config. +func NewCloudControllerManagerServer() *CloudControllerManagerServer { + s := CloudControllerManagerServer{ KubeControllerManagerConfiguration: componentconfig.KubeControllerManagerConfiguration{ - Port: ports.ControllerManagerPort, + Port: ports.CloudControllerManagerPort, Address: "0.0.0.0", ConcurrentServiceSyncs: 1, MinResyncPeriod: metav1.Duration{Duration: 12 * time.Hour}, - RegisterRetryCount: 10, NodeMonitorPeriod: metav1.Duration{Duration: 5 * time.Second}, ClusterName: "kubernetes", ConfigureCloudRoutes: true, @@ -57,10 +52,6 @@ func NewExternalCMServer() *ExternalCMServer { KubeAPIBurst: 30, LeaderElection: leaderelection.DefaultLeaderElectionConfiguration(), ControllerStartInterval: metav1.Duration{Duration: 0 * time.Second}, - EnableGarbageCollector: true, - ConcurrentGCSyncs: 20, - ClusterSigningCertFile: "/etc/kubernetes/ca/ca.pem", - ClusterSigningKeyFile: "/etc/kubernetes/ca/ca.key", }, } s.LeaderElection.LeaderElect = true @@ -68,8 +59,8 @@ func NewExternalCMServer() *ExternalCMServer { } // AddFlags adds flags for a specific ExternalCMServer to the specified FlagSet -func (s *ExternalCMServer) AddFlags(fs *pflag.FlagSet) { - fs.Int32Var(&s.Port, "port", s.Port, "The port that the controller-manager's http service runs on") +func (s *CloudControllerManagerServer) AddFlags(fs *pflag.FlagSet) { + fs.Int32Var(&s.Port, "port", s.Port, "The port that the cloud-controller-manager's http service runs on") fs.Var(componentconfig.IPVar{Val: &s.Address}, "address", "The IP address to serve on (set to 0.0.0.0 for all interfaces)") fs.StringVar(&s.CloudProvider, "cloud-provider", s.CloudProvider, "The provider of cloud services. Empty for no provider.") fs.StringVar(&s.CloudConfigFile, "cloud-config", s.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") diff --git a/cmd/cloud-controller-manager/controller-manager.go b/cmd/cloud-controller-manager/controller-manager.go index 2ce65417ccc..a465fec3596 100644 --- a/cmd/cloud-controller-manager/controller-manager.go +++ b/cmd/cloud-controller-manager/controller-manager.go @@ -15,7 +15,7 @@ limitations under the License. */ // The external controller manager is responsible for running controller loops that -// are cloud provider dependent. It uses the API to listen for new events on resources. +// are cloud provider dependent. It uses the API to listen to new events on resources. package main @@ -43,7 +43,7 @@ func init() { } func main() { - s := options.NewExternalCMServer() + s := options.NewCloudControllerManagerServer() s.AddFlags(pflag.CommandLine) flag.InitFlags() diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index 8cd656a8c44..f280b232cac 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -378,9 +378,7 @@ func StartControllers(controllers map[string]InitFunc, s *options.CMServer, root time.Sleep(wait.Jitter(s.ControllerStartInterval.Duration, ControllerStartJitter)) if s.AllocateNodeCIDRs && s.ConfigureCloudRoutes { - if s.CloudProvider == "external" { - glog.Warning("configure-cloud-routes is set, but external cloudprovider is specified. This manager will not configure cloud provider routes.") - } else if cloud == nil { + if cloud == nil { glog.Warning("configure-cloud-routes is set, but no cloud provider specified. Will not configure cloud provider routes.") } else if routes, ok := cloud.Routes(); !ok { glog.Warning("configure-cloud-routes is set, but cloud provider does not support routes. Will not configure cloud provider routes.") diff --git a/pkg/cloudprovider/plugins.go b/pkg/cloudprovider/plugins.go index 99d9758ed0f..c6083e0a859 100644 --- a/pkg/cloudprovider/plugins.go +++ b/pkg/cloudprovider/plugins.go @@ -90,11 +90,6 @@ func InitCloudProvider(name string, configFilePath string) (Interface, error) { var cloud Interface var err error - if name == "external" { - glog.Info("cloud provider external specified.") - return nil, nil - } - if name == "" { glog.Info("No cloud provider specified.") return nil, nil diff --git a/pkg/controller/cloud/BUILD b/pkg/controller/cloud/BUILD index 16f758aa9bb..d61579dde11 100644 --- a/pkg/controller/cloud/BUILD +++ b/pkg/controller/cloud/BUILD @@ -4,10 +4,8 @@ licenses(["notice"]) load( "@io_bazel_rules_go//go:def.bzl", - "go_binary", "go_library", "go_test", - "cgo_library", ) go_library( @@ -17,8 +15,8 @@ go_library( deps = [ "//pkg/api/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library", - "//pkg/client/clientset_generated/release_1_5:go_default_library", - "//pkg/client/clientset_generated/release_1_5/typed/core/v1:go_default_library", + "//pkg/client/clientset_generated/clientset:go_default_library", + "//pkg/client/clientset_generated/clientset/typed/core/v1:go_default_library", "//pkg/client/record:go_default_library", "//pkg/cloudprovider:go_default_library", "//pkg/controller/informers:go_default_library", @@ -37,7 +35,7 @@ go_test( deps = [ "//pkg/api/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library", - "//pkg/client/clientset_generated/release_1_5/fake:go_default_library", + "//pkg/client/clientset_generated/clientset/fake:go_default_library", "//pkg/client/record:go_default_library", "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/fake:go_default_library", diff --git a/pkg/controller/cloud/nodecontroller.go b/pkg/controller/cloud/nodecontroller.go index 48d4bb7937a..c0d9016038e 100644 --- a/pkg/controller/cloud/nodecontroller.go +++ b/pkg/controller/cloud/nodecontroller.go @@ -24,8 +24,8 @@ import ( "k8s.io/kubernetes/pkg/api/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" - v1core "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/core/v1" + clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" + v1core "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1" "k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/controller/informers" @@ -55,6 +55,7 @@ const ( retrySleepTime = 20 * time.Millisecond ) +// NewCloudNodeController creates a CloudNodeController object func NewCloudNodeController( nodeInformer informers.NodeInformer, kubeClient clientset.Interface, diff --git a/pkg/controller/cloud/nodecontroller_test.go b/pkg/controller/cloud/nodecontroller_test.go index 45c61d56dba..1c8c1f1c57b 100644 --- a/pkg/controller/cloud/nodecontroller_test.go +++ b/pkg/controller/cloud/nodecontroller_test.go @@ -23,7 +23,7 @@ import ( "github.com/golang/glog" "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/fake" + "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/client/record" diff --git a/pkg/master/ports/ports.go b/pkg/master/ports/ports.go index 6aa97963d5a..4f3eed88969 100644 --- a/pkg/master/ports/ports.go +++ b/pkg/master/ports/ports.go @@ -29,6 +29,9 @@ const ( // ControllerManagerPort is the default port for the controller manager status server. // May be overridden by a flag at startup. ControllerManagerPort = 10252 + // CloudControllerManagerPort is the default port for the cloud controller manager server. + // This value may be overriden by a flag at startup. + CloudControllerManagerPort = 10253 // KubeletReadOnlyPort exposes basic read-only services from the kubelet. // May be overridden by a flag at startup. // This is necessary for heapster to collect monitoring stats from the kubelet