// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver. func (c *Config) Complete() completedConfig { c.GenericConfig.Complete() serviceIPRange, apiServerServiceIP, err := DefaultServiceIPRange(c.ServiceIPRange) if err != nil { glog.Fatalf("Error determining service IP ranges: %v", err) } if c.ServiceIPRange.IP == nil { c.ServiceIPRange = serviceIPRange } if c.APIServerServiceIP == nil { c.APIServerServiceIP = apiServerServiceIP } discoveryAddresses := genericapiserver.DefaultDiscoveryAddresses{DefaultAddress: c.GenericConfig.ExternalAddress} discoveryAddresses.DiscoveryCIDRRules = append(discoveryAddresses.DiscoveryCIDRRules, genericapiserver.DiscoveryCIDRRule{IPRange: c.ServiceIPRange, Address: net.JoinHostPort(c.APIServerServiceIP.String(), strconv.Itoa(c.APIServerServicePort))}) c.GenericConfig.DiscoveryAddresses = discoveryAddresses if c.ServiceNodePortRange.Size == 0 { // TODO: Currently no way to specify an empty range (do we need to allow this?) // We should probably allow this for clouds that don't require NodePort to do load-balancing (GCE) // but then that breaks the strict nestedness of ServiceType. // Review post-v1 c.ServiceNodePortRange = options.DefaultServiceNodePortRange glog.Infof("Node port range unspecified. Defaulting to %v.", c.ServiceNodePortRange) } // enable swagger UI only if general UI support is on c.GenericConfig.EnableSwaggerUI = c.GenericConfig.EnableSwaggerUI && c.EnableUISupport if c.EndpointReconcilerConfig.Interval == 0 { c.EndpointReconcilerConfig.Interval = DefaultEndpointReconcilerInterval } if c.EndpointReconcilerConfig.Reconciler == nil { // use a default endpoint reconciler if nothing is set endpointClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) c.EndpointReconcilerConfig.Reconciler = NewMasterCountEndpointReconciler(c.MasterCount, endpointClient) } // this has always been hardcoded true in the past c.GenericConfig.EnableMetrics = true return completedConfig{c} }
// NewForConfigOrDie creates a new Clientset for the given config and // panics if there is an error in the config. func NewForConfigOrDie(c *restclient.Config) *Clientset { var cs Clientset cs.CoreClient = internalversioncore.NewForConfigOrDie(c) cs.AppsClient = internalversionapps.NewForConfigOrDie(c) cs.AuthenticationClient = internalversionauthentication.NewForConfigOrDie(c) cs.AuthorizationClient = internalversionauthorization.NewForConfigOrDie(c) cs.AutoscalingClient = internalversionautoscaling.NewForConfigOrDie(c) cs.BatchClient = internalversionbatch.NewForConfigOrDie(c) cs.CertificatesClient = internalversioncertificates.NewForConfigOrDie(c) cs.ExtensionsClient = internalversionextensions.NewForConfigOrDie(c) cs.PolicyClient = internalversionpolicy.NewForConfigOrDie(c) cs.RbacClient = internalversionrbac.NewForConfigOrDie(c) cs.StorageClient = internalversionstorage.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) return &cs }
func (m *Master) InstallLegacyAPI(c *Config, restOptionsGetter generic.RESTOptionsGetter, legacyRESTStorageProvider corerest.LegacyRESTStorageProvider) { legacyRESTStorage, apiGroupInfo, err := legacyRESTStorageProvider.NewLegacyRESTStorage(restOptionsGetter) if err != nil { glog.Fatalf("Error building core storage: %v", err) } if c.EnableCoreControllers { coreClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) bootstrapController := c.NewBootstrapController(legacyRESTStorage, coreClient, coreClient) if err := m.GenericAPIServer.AddPostStartHook("bootstrap-controller", bootstrapController.PostStartHook); err != nil { glog.Fatalf("Error registering PostStartHook %q: %v", "bootstrap-controller", err) } } if err := m.GenericAPIServer.InstallLegacyAPIGroup(genericapiserver.DefaultLegacyAPIPrefix, &apiGroupInfo); err != nil { glog.Fatalf("Error in registering group versions: %v", err) } }
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver. func (c *Config) Complete() completedConfig { c.GenericConfig.Complete() // enable swagger UI only if general UI support is on c.GenericConfig.EnableSwaggerUI = c.GenericConfig.EnableSwaggerUI && c.EnableUISupport if c.EndpointReconcilerConfig.Interval == 0 { c.EndpointReconcilerConfig.Interval = DefaultEndpointReconcilerInterval } if c.EndpointReconcilerConfig.Reconciler == nil { // use a default endpoint reconciler if nothing is set endpointClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) c.EndpointReconcilerConfig.Reconciler = NewMasterCountEndpointReconciler(c.GenericConfig.MasterCount, endpointClient) } return completedConfig{c} }
// TODO this needs to be refactored so we have a way to add general health checks to genericapiserver // TODO profiling should be generic func (m *Master) InstallGeneralEndpoints(c *Config) { // Run the tunneler. healthzChecks := []healthz.HealthzChecker{} if c.Tunneler != nil { nodeClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes() c.Tunneler.Run(nodeAddressProvider{nodeClient}.externalAddresses) healthzChecks = append(healthzChecks, healthz.NamedCheck("SSH Tunnel Check", genericapiserver.TunnelSyncHealthChecker(c.Tunneler))) prometheus.NewGaugeFunc(prometheus.GaugeOpts{ Name: "apiserver_proxy_tunnel_sync_latency_secs", Help: "The time since the last successful synchronization of the SSH tunnels for proxy requests.", }, func() float64 { return float64(c.Tunneler.SecondsSinceSync()) }) } healthz.InstallHandler(&m.GenericAPIServer.HandlerContainer.NonSwaggerRoutes, healthzChecks...) if c.GenericConfig.EnableProfiling { routes.MetricsWithReset{}.Install(m.GenericAPIServer.HandlerContainer) } else { routes.DefaultMetrics{}.Install(m.GenericAPIServer.HandlerContainer) } }
// New returns a new instance of Master from the given config. // Certain config fields will be set to a default value if unset. // Certain config fields must be specified, including: // KubeletClientConfig func (c completedConfig) New() (*Master, error) { if reflect.DeepEqual(c.KubeletClientConfig, kubeletclient.KubeletClientConfig{}) { return nil, fmt.Errorf("Master.New() called with empty config.KubeletClientConfig") } s, err := c.Config.GenericConfig.SkipComplete().New() // completion is done in Complete, no need for a second time if err != nil { return nil, err } if c.EnableUISupport { routes.UIRedirect{}.Install(s.HandlerContainer) } if c.EnableLogsSupport { routes.Logs{}.Install(s.HandlerContainer) } m := &Master{ GenericAPIServer: s, } restOptionsFactory := restOptionsFactory{ deleteCollectionWorkers: c.DeleteCollectionWorkers, enableGarbageCollection: c.GenericConfig.EnableGarbageCollection, storageFactory: c.StorageFactory, } if c.EnableWatchCache { restOptionsFactory.storageDecorator = registry.StorageWithCacher } else { restOptionsFactory.storageDecorator = generic.UndecoratedStorage } // install legacy rest storage if c.GenericConfig.APIResourceConfigSource.AnyResourcesForVersionEnabled(apiv1.SchemeGroupVersion) { legacyRESTStorageProvider := corerest.LegacyRESTStorageProvider{ StorageFactory: c.StorageFactory, ProxyTransport: c.ProxyTransport, KubeletClientConfig: c.KubeletClientConfig, EventTTL: c.EventTTL, ServiceIPRange: c.ServiceIPRange, ServiceNodePortRange: c.ServiceNodePortRange, LoopbackClientConfig: c.GenericConfig.LoopbackClientConfig, } m.InstallLegacyAPI(c.Config, restOptionsFactory.NewFor, legacyRESTStorageProvider) } restStorageProviders := []genericapiserver.RESTStorageProvider{ appsrest.RESTStorageProvider{}, authenticationrest.RESTStorageProvider{Authenticator: c.GenericConfig.Authenticator}, authorizationrest.RESTStorageProvider{Authorizer: c.GenericConfig.Authorizer}, autoscalingrest.RESTStorageProvider{}, batchrest.RESTStorageProvider{}, certificatesrest.RESTStorageProvider{}, extensionsrest.RESTStorageProvider{ResourceInterface: thirdparty.NewThirdPartyResourceServer(s, c.StorageFactory)}, policyrest.RESTStorageProvider{}, rbacrest.RESTStorageProvider{AuthorizerRBACSuperUser: c.GenericConfig.AuthorizerRBACSuperUser}, storagerest.RESTStorageProvider{}, } m.InstallAPIs(c.Config.GenericConfig.APIResourceConfigSource, restOptionsFactory.NewFor, restStorageProviders...) if c.Tunneler != nil { m.installTunneler(c.Tunneler, coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes()) } return m, nil }