2014-06-06 23:40:48 +00:00
/ *
Copyright 2014 Google Inc . All rights reserved .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
2014-06-11 23:02:08 +00:00
2014-06-06 23:40:48 +00:00
// apiserver is the main api server and master for the cluster.
// it is responsible for serving the cluster management API.
package main
import (
"flag"
2014-06-16 05:30:02 +00:00
"net"
2014-07-02 00:08:32 +00:00
"net/http"
2014-09-03 21:12:20 +00:00
"os"
2014-06-16 05:30:02 +00:00
"strconv"
2014-09-09 21:05:18 +00:00
"strings"
2014-07-18 03:54:54 +00:00
"time"
2014-06-06 23:40:48 +00:00
2014-09-26 23:28:30 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
2014-08-09 21:12:55 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
2014-09-16 14:04:12 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/capabilities"
2014-07-02 00:08:32 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
2014-06-17 17:50:42 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider"
2014-06-16 06:29:07 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
2014-09-26 23:28:30 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/resources"
2014-06-06 23:40:48 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
2014-08-30 06:19:32 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/version/verflag"
2014-06-25 03:51:57 +00:00
"github.com/golang/glog"
2014-06-06 23:40:48 +00:00
)
var (
2014-09-11 23:01:29 +00:00
port = flag . Uint ( "port" , 8080 , "The port to listen on. Default 8080" )
2014-10-04 04:34:30 +00:00
address = util . IP ( net . ParseIP ( "127.0.0.1" ) )
2014-09-11 17:04:13 +00:00
apiPrefix = flag . String ( "api_prefix" , "/api" , "The prefix for API requests on the server. Default '/api'" )
2014-09-11 23:01:29 +00:00
storageVersion = flag . String ( "storage_version" , "" , "The version to store resources with. Defaults to server preferred" )
2014-09-03 18:33:52 +00:00
cloudProvider = flag . String ( "cloud_provider" , "" , "The provider for cloud services. Empty string for no provider." )
cloudConfigFile = flag . String ( "cloud_config" , "" , "The path to the cloud provider configuration file. Empty string for no configuration file." )
minionRegexp = flag . String ( "minion_regexp" , "" , "If non empty, and -cloud_provider is specified, a regular expression for matching minion VMs" )
minionPort = flag . Uint ( "minion_port" , 10250 , "The port at which kubelet will be listening on the minions." )
2014-09-11 23:01:29 +00:00
healthCheckMinions = flag . Bool ( "health_check_minions" , true , "If true, health check minions and filter unhealthy ones. Default true" )
minionCacheTTL = flag . Duration ( "minion_cache_ttl" , 30 * time . Second , "Duration of time to cache minion information. Default 30 seconds" )
2014-09-03 18:33:52 +00:00
etcdServerList util . StringList
machineList util . StringList
corsAllowedOriginList util . StringList
2014-09-16 14:04:12 +00:00
allowPrivileged = flag . Bool ( "allow_privileged" , false , "If true, allow privileged containers." )
2014-09-26 23:28:30 +00:00
// TODO: Discover these by pinging the host machines, and rip out these flags.
nodeMilliCPU = flag . Int ( "node_milli_cpu" , 1000 , "The amount of MilliCPU provisioned on each node" )
nodeMemory = flag . Int ( "node_memory" , 3 * 1024 * 1024 * 1024 , "The amount of memory (in bytes) provisioned on each node" )
2014-06-06 23:40:48 +00:00
)
func init ( ) {
2014-10-04 04:34:30 +00:00
flag . Var ( & address , "address" , "The IP address on to serve on (set to 0.0.0.0 for all interfaces)" )
2014-07-20 14:48:47 +00:00
flag . Var ( & etcdServerList , "etcd_servers" , "List of etcd servers to watch (http://ip:port), comma separated" )
2014-06-06 23:40:48 +00:00
flag . Var ( & machineList , "machines" , "List of machines to schedule onto, comma separated." )
2014-09-03 18:33:52 +00:00
flag . Var ( & corsAllowedOriginList , "cors_allowed_origins" , "List of allowed origins for CORS, comma separated. An allowed origin can be a regular expression to support subdomain matching. If this list is empty CORS will not be enabled." )
2014-06-06 23:40:48 +00:00
}
2014-07-31 05:38:54 +00:00
func verifyMinionFlags ( ) {
if * cloudProvider == "" || * minionRegexp == "" {
if len ( machineList ) == 0 {
2014-09-15 18:13:17 +00:00
glog . Info ( "No machines specified!" )
2014-07-31 05:38:54 +00:00
}
return
}
if len ( machineList ) != 0 {
glog . Info ( "-machines is overwritten by -minion_regexp" )
}
}
2014-09-03 21:12:20 +00:00
func initCloudProvider ( name string , configFilePath string ) cloudprovider . Interface {
var config * os . File
if name == "" {
glog . Info ( "No cloud provider specified." )
return nil
}
if configFilePath != "" {
var err error
config , err = os . Open ( configFilePath )
if err != nil {
glog . Fatalf ( "Couldn't open cloud provider configuration %s: %#v" ,
configFilePath , err )
}
defer config . Close ( )
}
cloud , err := cloudprovider . GetCloudProvider ( name , config )
if err != nil {
glog . Fatalf ( "Couldn't init cloud provider %q: %#v" , name , err )
}
if cloud == nil {
glog . Fatalf ( "Unknown cloud provider: %s" , name )
}
return cloud
}
2014-06-06 23:40:48 +00:00
func main ( ) {
flag . Parse ( )
2014-06-25 03:51:57 +00:00
util . InitLogs ( )
defer util . FlushLogs ( )
2014-06-06 23:40:48 +00:00
2014-08-01 05:55:44 +00:00
verflag . PrintAndExitIfRequested ( )
2014-07-31 05:38:54 +00:00
verifyMinionFlags ( )
2014-06-06 23:40:48 +00:00
2014-08-15 23:42:37 +00:00
if len ( etcdServerList ) == 0 {
glog . Fatalf ( "-etcd_servers flag is required." )
}
2014-09-16 22:18:33 +00:00
capabilities . Initialize ( capabilities . Capabilities {
2014-09-16 14:04:12 +00:00
AllowPrivileged : * allowPrivileged ,
} )
2014-09-03 21:12:20 +00:00
cloud := initCloudProvider ( * cloudProvider , * cloudConfigFile )
2014-06-06 23:40:48 +00:00
2014-07-02 00:08:32 +00:00
podInfoGetter := & client . HTTPPodInfoGetter {
Client : http . DefaultClient ,
Port : * minionPort ,
}
2014-09-30 00:15:00 +00:00
// TODO: expose same flags as client.BindClientConfigFlags but for a server
clientConfig := & client . Config {
2014-10-04 04:34:30 +00:00
Host : net . JoinHostPort ( address . String ( ) , strconv . Itoa ( int ( * port ) ) ) ,
2014-09-30 00:15:00 +00:00
Version : * storageVersion ,
}
client , err := client . New ( clientConfig )
2014-08-28 13:56:38 +00:00
if err != nil {
glog . Fatalf ( "Invalid server address: %v" , err )
}
2014-07-18 20:22:26 +00:00
2014-09-11 23:01:29 +00:00
helper , err := master . NewEtcdHelper ( etcdServerList , * storageVersion )
if err != nil {
glog . Fatalf ( "Invalid storage version: %v" , err )
}
2014-08-15 23:42:37 +00:00
m := master . New ( & master . Config {
Client : client ,
Cloud : cloud ,
2014-09-11 23:01:29 +00:00
EtcdHelper : helper ,
2014-08-15 23:42:37 +00:00
HealthCheckMinions : * healthCheckMinions ,
Minions : machineList ,
MinionCacheTTL : * minionCacheTTL ,
MinionRegexp : * minionRegexp ,
PodInfoGetter : podInfoGetter ,
2014-09-26 23:28:30 +00:00
NodeResources : api . NodeResources {
Capacity : api . ResourceList {
resources . CPU : util . NewIntOrStringFromInt ( * nodeMilliCPU ) ,
resources . Memory : util . NewIntOrStringFromInt ( * nodeMemory ) ,
} ,
} ,
2014-08-15 23:42:37 +00:00
} )
2014-06-06 23:40:48 +00:00
2014-09-11 17:04:13 +00:00
mux := http . NewServeMux ( )
apiserver . NewAPIGroup ( m . API_v1beta1 ( ) ) . InstallREST ( mux , * apiPrefix + "/v1beta1" )
apiserver . NewAPIGroup ( m . API_v1beta2 ( ) ) . InstallREST ( mux , * apiPrefix + "/v1beta2" )
apiserver . InstallSupport ( mux )
2014-09-03 18:33:52 +00:00
2014-09-11 17:04:13 +00:00
handler := http . Handler ( mux )
2014-09-03 18:33:52 +00:00
if len ( corsAllowedOriginList ) > 0 {
2014-09-04 17:55:30 +00:00
allowedOriginRegexps , err := util . CompileRegexps ( corsAllowedOriginList )
if err != nil {
2014-09-09 21:05:18 +00:00
glog . Fatalf ( "Invalid CORS allowed origin, --cors_allowed_origins flag was set to %v - %v" , strings . Join ( corsAllowedOriginList , "," ) , err )
2014-09-04 17:55:30 +00:00
}
handler = apiserver . CORS ( handler , allowedOriginRegexps , nil , nil , "true" )
2014-09-03 18:33:52 +00:00
}
2014-09-11 17:04:13 +00:00
handler = apiserver . RecoverPanics ( handler )
2014-09-03 18:33:52 +00:00
2014-08-09 21:12:55 +00:00
s := & http . Server {
2014-10-04 04:34:30 +00:00
Addr : net . JoinHostPort ( address . String ( ) , strconv . Itoa ( int ( * port ) ) ) ,
2014-09-11 17:04:13 +00:00
Handler : handler ,
2014-08-18 17:32:29 +00:00
ReadTimeout : 5 * time . Minute ,
WriteTimeout : 5 * time . Minute ,
2014-08-09 21:12:55 +00:00
MaxHeaderBytes : 1 << 20 ,
}
glog . Fatal ( s . ListenAndServe ( ) )
2014-06-06 23:40:48 +00:00
}