// InstallAPI starts a Kubernetes master and registers the supported REST APIs // into the provided mux, then returns an array of strings indicating what // endpoints were started (these are format strings that will expect to be sent // a single string value). func (c *MasterConfig) InstallAPI(container *restful.Container) ([]string, error) { c.Master.RestfulContainer = container if c.Master.EnableCoreControllers { glog.V(2).Info("Using the lease endpoint reconciler") leaseStorage, err := c.Master.StorageFactory.New(kapi.Resource("apiServerIPInfo")) if err != nil { glog.Fatalf(err.Error()) } leaseTTL := uint64(master.DefaultEndpointReconcilerInterval + 5) // add 5 seconds for wiggle room masterLeases := election.NewLeases(leaseStorage, "/masterleases/", leaseTTL) storage, err := c.Master.StorageFactory.New(kapi.Resource("endpoints")) if err != nil { glog.Fatalf(err.Error()) } endpointsStorage := endpointsetcd.NewREST(generic.RESTOptions{ Storage: storage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 0, }) endpointRegistry := endpoint.NewRegistry(endpointsStorage) c.Master.EndpointReconcilerConfig = master.EndpointReconcilerConfig{ Reconciler: election.NewLeaseEndpointReconciler(endpointRegistry, masterLeases), Interval: master.DefaultEndpointReconcilerInterval, } } _, err := master.New(c.Master) if err != nil { return nil, err } messages := []string{} // v1 has to be printed separately since it's served from different endpoint than groups if configapi.HasKubernetesAPIVersion(c.Options, v1.SchemeGroupVersion) { messages = append(messages, fmt.Sprintf("Started Kubernetes API at %%s%s", KubeAPIPrefix)) } versions := []unversioned.GroupVersion{ extv1beta1.SchemeGroupVersion, batchv1.SchemeGroupVersion, autoscalingv1.SchemeGroupVersion, appsv1alpha1.SchemeGroupVersion, } for _, ver := range versions { if configapi.HasKubernetesAPIVersion(c.Options, ver) { messages = append(messages, fmt.Sprintf("Started Kubernetes API %s at %%s%s", ver.String(), KubeAPIGroupPrefix)) } } return messages, nil }
func newMasterLeases(storage storage.Interface) election.Leases { // leaseTTL is in seconds, i.e. 15 means 15 seconds; do NOT do 15*time.Second! leaseTTL := uint64((master.DefaultEndpointReconcilerInterval + 5*time.Second) / time.Second) // add 5 seconds for wiggle room return election.NewLeases(storage, "/masterleases/", leaseTTL) }