// Start starts the apiserver, returns when apiserver is ready. func (a *APIServer) Start() error { config := options.NewServerRunOptions() config.Etcd.StorageConfig.ServerList = []string{getEtcdClientURL()} // TODO: Current setup of etcd in e2e-node tests doesn't support etcd v3 // protocol. We should migrate it to use the same infrastructure as all // other tests (pkg/storage/etcd/testing). config.Etcd.StorageConfig.Type = "etcd2" _, ipnet, err := net.ParseCIDR(clusterIPRange) if err != nil { return err } config.ServiceClusterIPRange = *ipnet config.AllowPrivileged = true errCh := make(chan error) go func() { defer close(errCh) err := apiserver.Run(config) if err != nil { errCh <- fmt.Errorf("run apiserver error: %v", err) } }() err = readinessCheck("apiserver", []string{apiserverHealthCheckURL}, errCh) if err != nil { return err } return nil }
func TestAPIServerDefaults(t *testing.T) { defaults := apiserveroptions.NewServerRunOptions() // This is a snapshot of the default config // If the default changes (new fields are added, or default values change), we want to know // Once we've reacted to the changes appropriately in BuildKubernetesMasterConfig(), update this expected default to match the new upstream defaults expectedDefaults := &apiserveroptions.ServerRunOptions{ GenericServerRunOptions: &genericapiserveroptions.ServerRunOptions{ AnonymousAuth: true, BindAddress: net.ParseIP("0.0.0.0"), CertDirectory: "/var/run/kubernetes", InsecureBindAddress: net.ParseIP("127.0.0.1"), InsecurePort: 8080, LongRunningRequestRE: "(/|^)((watch|proxy)(/|$)|(logs?|portforward|exec|attach)/?$)", MaxRequestsInFlight: 400, SecurePort: 6443, EnableProfiling: true, EnableGarbageCollection: true, EnableWatchCache: true, MinRequestTimeout: 1800, ServiceNodePortRange: genericapiserveroptions.DefaultServiceNodePortRange, RuntimeConfig: utilconfig.ConfigurationMap{}, StorageVersions: registered.AllPreferredGroupVersions(), MasterCount: 1, DefaultStorageVersions: registered.AllPreferredGroupVersions(), StorageConfig: storagebackend.Config{ ServerList: nil, Prefix: "/registry", DeserializationCacheSize: 0, }, DefaultStorageMediaType: "application/json", AdmissionControl: "AlwaysAdmit", AuthorizationMode: "AlwaysAllow", DeleteCollectionWorkers: 1, MasterServiceNamespace: "default", AuthorizationWebhookCacheAuthorizedTTL: 5 * time.Minute, AuthorizationWebhookCacheUnauthorizedTTL: 30 * time.Second, }, EventTTL: 1 * time.Hour, KubeletConfig: kubeletclient.KubeletClientConfig{ Port: 10250, PreferredAddressTypes: []string{ string(apiv1.NodeHostName), string(apiv1.NodeInternalIP), string(apiv1.NodeExternalIP), string(apiv1.NodeLegacyHostIP), }, EnableHttps: true, HTTPTimeout: time.Duration(5) * time.Second, }, WebhookTokenAuthnCacheTTL: 2 * time.Minute, } if !reflect.DeepEqual(defaults, expectedDefaults) { t.Logf("expected defaults, actual defaults: \n%s", diff.ObjectReflectDiff(expectedDefaults, defaults)) t.Errorf("Got different defaults than expected, adjust in BuildKubernetesMasterConfig and update expectedDefaults") } }
// NewKubeAPIServer creates a new hyperkube Server object that includes the // description and flags. func NewKubeAPIServer() *Server { s := options.NewServerRunOptions() hks := Server{ SimpleUsage: "apiserver", Long: "The main API entrypoint and interface to the storage system. The API server is also the focal point for all authorization decisions.", Run: func(_ *Server, args []string) error { return app.Run(s) }, } s.AddFlags(hks.Flags()) return &hks }
// NewAPIServerCommand creates a *cobra.Command object with default parameters func NewAPIServerCommand() *cobra.Command { s := options.NewServerRunOptions() s.AddFlags(pflag.CommandLine) cmd := &cobra.Command{ Use: "kube-apiserver", Long: `The Kubernetes API server validates and configures data for the api objects which include pods, services, replicationcontrollers, and others. The API Server services REST operations and provides the frontend to the cluster's shared state through which all other components interact.`, Run: func(cmd *cobra.Command, args []string) { }, } return cmd }
func main() { rand.Seed(time.Now().UTC().UnixNano()) s := options.NewServerRunOptions() s.AddFlags(pflag.CommandLine) flag.InitFlags() logs.InitLogs() defer logs.FlushLogs() verflag.PrintAndExitIfRequested() if err := app.Run(s); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } }
func TestLongRunningRequestRegexp(t *testing.T) { regexp := regexp.MustCompile(options.NewServerRunOptions().GenericServerRunOptions.LongRunningRequestRE) dontMatch := []string{ "/api/v1/watch-namespace/", "/api/v1/namespace-proxy/", "/api/v1/namespace-watch", "/api/v1/namespace-proxy", "/api/v1/namespace-portforward/pods", "/api/v1/portforward/pods", ". anything", "/ that", } doMatch := []string{ "/api/v1/pods/watch", "/api/v1/watch/stuff", "/api/v1/default/service/proxy", "/api/v1/pods/proxy/path/to/thing", "/api/v1/namespaces/myns/pods/mypod/log", "/api/v1/namespaces/myns/pods/mypod/logs", "/api/v1/namespaces/myns/pods/mypod/portforward", "/api/v1/namespaces/myns/pods/mypod/exec", "/api/v1/namespaces/myns/pods/mypod/attach", "/api/v1/namespaces/myns/pods/mypod/log/", "/api/v1/namespaces/myns/pods/mypod/logs/", "/api/v1/namespaces/myns/pods/mypod/portforward/", "/api/v1/namespaces/myns/pods/mypod/exec/", "/api/v1/namespaces/myns/pods/mypod/attach/", "/api/v1/watch/namespaces/myns/pods", } for _, path := range dontMatch { if regexp.MatchString(path) { t.Errorf("path should not have match regexp but did: %s", path) } } for _, path := range doMatch { if !regexp.MatchString(path) { t.Errorf("path should have match regexp did not: %s", path) } } }
// Start starts the apiserver, returns when apiserver is ready. func (a *APIServer) Start() error { config := options.NewServerRunOptions() config.GenericServerRunOptions.StorageConfig.ServerList = []string{getEtcdClientURL()} _, ipnet, err := net.ParseCIDR(clusterIPRange) if err != nil { return err } config.GenericServerRunOptions.ServiceClusterIPRange = *ipnet config.AllowPrivileged = true errCh := make(chan error) go func() { defer close(errCh) err := apiserver.Run(config) if err != nil { errCh <- fmt.Errorf("run apiserver error: %v", err) } }() err = readinessCheck("apiserver", []string{apiserverHealthCheckURL}, errCh) if err != nil { return err } return nil }