// Start begins the core controller loops that must exist for bootstrapping // a cluster. func (c *Controller) Start() { if c.runner != nil { return } repairPortals := servicecontroller.NewRepair(c.PortalIPInterval, c.ServiceRegistry, c.PortalNet, c.ServiceIPRegistry) repairNodePorts := portallocatorcontroller.NewRepair(c.ServiceNodePortInterval, c.ServiceRegistry, c.ServiceNodePorts, c.ServiceNodePortRegistry) // run all of the controllers once prior to returning from Start. if err := repairPortals.RunOnce(); err != nil { glog.Errorf("Unable to perform initial IP allocation check: %v", err) } if err := repairNodePorts.RunOnce(); err != nil { glog.Errorf("Unable to perform initial service nodePort check: %v", err) } if err := c.UpdateKubernetesService(); err != nil { glog.Errorf("Unable to perform initial Kubernetes service initialization: %v", err) } if err := c.UpdateKubernetesROService(); err != nil { glog.Errorf("Unable to perform initial Kubernetes RO service initialization: %v", err) } c.runner = util.NewRunner(c.RunKubernetesService, c.RunKubernetesROService, repairPortals.RunUntil, repairNodePorts.RunUntil) c.runner.Start() }
// New returns a new instance of Master from the given config. // Certain config fields will be set to a default value if unset, // including: // PortalNet // MasterCount // ReadOnlyPort // ReadWritePort // PublicAddress // Certain config fields must be specified, including: // KubeletClient // Public fields: // Handler -- The returned master has a field TopHandler which is an // http.Handler which handles all the endpoints provided by the master, // including the API, the UI, and miscelaneous debugging endpoints. All // these are subject to authorization and authentication. // InsecureHandler -- an http.Handler which handles all the same // endpoints as Handler, but no authorization and authentication is done. // Public methods: // HandleWithAuth -- Allows caller to add an http.Handler for an endpoint // that uses the same authentication and authorization (if any is configured) // as the master's built-in endpoints. // If the caller wants to add additional endpoints not using the master's // auth, then the caller should create a handler for those endpoints, which delegates the // any unhandled paths to "Handler". func New(c *Config) *Master { setDefaults(c) minionRegistry := makeMinionRegistry(c) serviceRegistry := etcd.NewRegistry(c.EtcdHelper, nil) boundPodFactory := &pod.BasicBoundPodFactory{ ServiceRegistry: serviceRegistry, MasterServiceNamespace: c.MasterServiceNamespace, } if c.KubeletClient == nil { glog.Fatalf("master.New() called with config.KubeletClient == nil") } m := &Master{ podRegistry: etcd.NewRegistry(c.EtcdHelper, boundPodFactory), controllerRegistry: etcd.NewRegistry(c.EtcdHelper, nil), serviceRegistry: serviceRegistry, endpointRegistry: etcd.NewRegistry(c.EtcdHelper, nil), bindingRegistry: etcd.NewRegistry(c.EtcdHelper, boundPodFactory), eventRegistry: event.NewEtcdRegistry(c.EtcdHelper, uint64(c.EventTTL.Seconds())), minionRegistry: minionRegistry, client: c.Client, portalNet: c.PortalNet, rootWebService: new(restful.WebService), enableLogsSupport: c.EnableLogsSupport, enableUISupport: c.EnableUISupport, enableSwaggerSupport: c.EnableSwaggerSupport, apiPrefix: c.APIPrefix, corsAllowedOriginList: c.CorsAllowedOriginList, authenticator: c.Authenticator, authorizer: c.Authorizer, admissionControl: c.AdmissionControl, v1beta3: c.EnableV1Beta3, nodeIPCache: NewIPCache(c.Cloud, util.RealClock{}, 30*time.Second), masterCount: c.MasterCount, readOnlyServer: net.JoinHostPort(c.PublicAddress, strconv.Itoa(int(c.ReadOnlyPort))), readWriteServer: net.JoinHostPort(c.PublicAddress, strconv.Itoa(int(c.ReadWritePort))), } if c.RestfulContainer != nil { m.mux = c.RestfulContainer.ServeMux m.handlerContainer = c.RestfulContainer } else { mux := http.NewServeMux() m.mux = mux m.handlerContainer = NewHandlerContainer(mux) } m.masterServices = util.NewRunner(m.serviceWriterLoop, m.roServiceWriterLoop) m.init(c) return m }
// New returns a new instance of Master from the given config. // Certain config fields will be set to a default value if unset, // including: // PortalNet // MasterCount // ReadOnlyPort // ReadWritePort // PublicAddress // Certain config fields must be specified, including: // KubeletClient // Public fields: // Handler -- The returned master has a field TopHandler which is an // http.Handler which handles all the endpoints provided by the master, // including the API, the UI, and miscelaneous debugging endpoints. All // these are subject to authorization and authentication. // InsecureHandler -- an http.Handler which handles all the same // endpoints as Handler, but no authorization and authentication is done. // Public methods: // HandleWithAuth -- Allows caller to add an http.Handler for an endpoint // that uses the same authentication and authorization (if any is configured) // as the master's built-in endpoints. // If the caller wants to add additional endpoints not using the master's // auth, then the caller should create a handler for those endpoints, which delegates the // any unhandled paths to "Handler". func New(c *Config) *Master { setDefaults(c) minionRegistry := makeMinionRegistry(c) serviceRegistry := etcd.NewRegistry(c.EtcdHelper, nil) boundPodFactory := &pod.BasicBoundPodFactory{ ServiceRegistry: serviceRegistry, } if c.KubeletClient == nil { glog.Fatalf("master.New() called with config.KubeletClient == nil") } mx := http.NewServeMux() m := &Master{ podRegistry: etcd.NewRegistry(c.EtcdHelper, boundPodFactory), controllerRegistry: etcd.NewRegistry(c.EtcdHelper, nil), serviceRegistry: serviceRegistry, endpointRegistry: etcd.NewRegistry(c.EtcdHelper, nil), bindingRegistry: etcd.NewRegistry(c.EtcdHelper, boundPodFactory), eventRegistry: event.NewEtcdRegistry(c.EtcdHelper, uint64(c.EventTTL.Seconds())), minionRegistry: minionRegistry, client: c.Client, portalNet: c.PortalNet, mux: mx, handlerContainer: NewHandlerContainer(mx), rootWebService: new(restful.WebService), enableLogsSupport: c.EnableLogsSupport, enableUISupport: c.EnableUISupport, apiPrefix: c.APIPrefix, corsAllowedOriginList: c.CorsAllowedOriginList, authenticator: c.Authenticator, authorizer: c.Authorizer, masterCount: c.MasterCount, readOnlyServer: net.JoinHostPort(c.PublicAddress, strconv.Itoa(int(c.ReadOnlyPort))), readWriteServer: net.JoinHostPort(c.PublicAddress, strconv.Itoa(int(c.ReadWritePort))), } m.masterServices = util.NewRunner(m.serviceWriterLoop, m.roServiceWriterLoop) m.init(c) return m }
// Start begins the core controller loops that must exist for bootstrapping // a cluster. func (c *Controller) Start() { if c.runner != nil { return } repairClusterIPs := servicecontroller.NewRepair(c.ServiceClusterIPInterval, c.ServiceRegistry, c.ServiceClusterIPRange, c.ServiceClusterIPRegistry) repairNodePorts := portallocatorcontroller.NewRepair(c.ServiceNodePortInterval, c.ServiceRegistry, c.ServiceNodePortRange, c.ServiceNodePortRegistry) // run all of the controllers once prior to returning from Start. if err := repairClusterIPs.RunOnce(); err != nil { // If we fail to repair cluster IPs apiserver is useless. We should restart and retry. glog.Fatalf("Unable to perform initial IP allocation check: %v", err) } if err := repairNodePorts.RunOnce(); err != nil { // If we fail to repair node ports apiserver is useless. We should restart and retry. glog.Fatalf("Unable to perform initial service nodePort check: %v", err) } if err := c.UpdateKubernetesService(); err != nil { glog.Errorf("Unable to perform initial Kubernetes service initialization: %v", err) } c.runner = util.NewRunner(c.RunKubernetesService, repairClusterIPs.RunUntil, repairNodePorts.RunUntil) c.runner.Start() }
// New returns a new instance of Master from the given config. // Certain config fields will be set to a default value if unset, // including: // PortalNet // MasterCount // ReadOnlyPort // ReadWritePort // PublicAddress // Certain config fields must be specified, including: // KubeletClient // Public fields: // Handler -- The returned master has a field TopHandler which is an // http.Handler which handles all the endpoints provided by the master, // including the API, the UI, and miscelaneous debugging endpoints. All // these are subject to authorization and authentication. // InsecureHandler -- an http.Handler which handles all the same // endpoints as Handler, but no authorization and authentication is done. // Public methods: // HandleWithAuth -- Allows caller to add an http.Handler for an endpoint // that uses the same authentication and authorization (if any is configured) // as the master's built-in endpoints. // If the caller wants to add additional endpoints not using the master's // auth, then the caller should create a handler for those endpoints, which delegates the // any unhandled paths to "Handler". func New(c *Config) *Master { setDefaults(c) if c.KubeletClient == nil { glog.Fatalf("master.New() called with config.KubeletClient == nil") } // Select the first two valid IPs from portalNet to use as the master service portalIPs serviceReadOnlyIP, err := service.GetIndexedIP(c.PortalNet, 1) if err != nil { glog.Fatalf("Failed to generate service read-only IP for master service: %v", err) } serviceReadWriteIP, err := service.GetIndexedIP(c.PortalNet, 2) if err != nil { glog.Fatalf("Failed to generate service read-write IP for master service: %v", err) } glog.V(4).Infof("Setting master service IPs based on PortalNet subnet to %q (read-only) and %q (read-write).", serviceReadOnlyIP, serviceReadWriteIP) m := &Master{ portalNet: c.PortalNet, rootWebService: new(restful.WebService), enableLogsSupport: c.EnableLogsSupport, enableUISupport: c.EnableUISupport, enableSwaggerSupport: c.EnableSwaggerSupport, enableProfiling: c.EnableProfiling, apiPrefix: c.APIPrefix, corsAllowedOriginList: c.CorsAllowedOriginList, authenticator: c.Authenticator, authorizer: c.Authorizer, admissionControl: c.AdmissionControl, v1beta3: !c.DisableV1Beta3, requestContextMapper: c.RequestContextMapper, cacheTimeout: c.CacheTimeout, masterCount: c.MasterCount, externalHost: c.ExternalHost, clusterIP: c.PublicAddress, publicReadOnlyPort: c.ReadOnlyPort, publicReadWritePort: c.ReadWritePort, serviceReadOnlyIP: serviceReadOnlyIP, // TODO: serviceReadOnlyPort should be passed in as an argument, it may not always be 80 serviceReadOnlyPort: 80, serviceReadWriteIP: serviceReadWriteIP, // TODO: serviceReadWritePort should be passed in as an argument, it may not always be 443 serviceReadWritePort: 443, } if c.RestfulContainer != nil { m.mux = c.RestfulContainer.ServeMux m.handlerContainer = c.RestfulContainer } else { mux := http.NewServeMux() m.mux = mux m.handlerContainer = NewHandlerContainer(mux) } // Use CurlyRouter to be able to use regular expressions in paths. Regular expressions are required in paths for example for proxy (where the path is proxy/{kind}/{name}/{*}) m.handlerContainer.Router(restful.CurlyRouter{}) m.muxHelper = &apiserver.MuxHelper{m.mux, []string{}} m.masterServices = util.NewRunner(m.serviceWriterLoop, m.roServiceWriterLoop) m.init(c) return m }