2015-01-30 23:31:36 +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 .
* /
2015-02-08 04:07:00 +00:00
// Package app implements a server that runs a set of active
2015-01-30 23:31:36 +00:00
// components. This includes replication controllers, service endpoints and
// nodes.
2015-02-08 04:07:00 +00:00
package app
2015-01-30 23:31:36 +00:00
import (
"net"
"net/http"
2015-03-13 15:44:11 +00:00
"net/http/pprof"
2015-01-30 23:31:36 +00:00
"strconv"
"time"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider"
nodeControllerPkg "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/controller"
replicationControllerPkg "github.com/GoogleCloudPlatform/kubernetes/pkg/controller"
"github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports"
2015-03-20 16:49:03 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/namespace"
2015-01-30 23:31:36 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/resourcequota"
"github.com/GoogleCloudPlatform/kubernetes/pkg/service"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/golang/glog"
"github.com/spf13/pflag"
)
2015-02-25 00:15:59 +00:00
// CMServer is the main context object for the controller manager.
2015-01-30 23:31:36 +00:00
type CMServer struct {
Port int
Address util . IP
ClientConfig client . Config
CloudProvider string
CloudConfigFile string
MinionRegexp string
NodeSyncPeriod time . Duration
ResourceQuotaSyncPeriod time . Duration
2015-03-20 16:49:03 +00:00
NamespaceSyncPeriod time . Duration
2015-01-30 23:31:36 +00:00
RegisterRetryCount int
MachineList util . StringList
2015-01-15 01:05:48 +00:00
SyncNodeList bool
2015-02-24 06:43:58 +00:00
SyncNodeStatus bool
2015-03-31 11:17:12 +00:00
NodeMonitorGracePeriod time . Duration
NodeStartupGracePeriod time . Duration
NodeMonitorPeriod time . Duration
NodeStatusUpdateRetry int
2015-02-07 19:53:42 +00:00
PodEvictionTimeout time . Duration
2015-04-02 15:13:13 +00:00
DeletingPodsQps float32
DeletingPodsBurst int
2015-01-30 23:31:36 +00:00
// TODO: Discover these by pinging the host machines, and rip out these params.
NodeMilliCPU int64
NodeMemory resource . Quantity
2015-03-13 15:44:11 +00:00
KubeletConfig client . KubeletConfig
2015-04-01 12:52:28 +00:00
ClusterName string
2015-03-13 15:44:11 +00:00
EnableProfiling bool
2015-01-30 23:31:36 +00:00
}
2015-02-07 19:53:42 +00:00
// NewCMServer creates a new CMServer with a default config.
2015-01-30 23:31:36 +00:00
func NewCMServer ( ) * CMServer {
s := CMServer {
Port : ports . ControllerManagerPort ,
Address : util . IP ( net . ParseIP ( "127.0.0.1" ) ) ,
NodeSyncPeriod : 10 * time . Second ,
ResourceQuotaSyncPeriod : 10 * time . Second ,
2015-03-24 14:44:34 +00:00
NamespaceSyncPeriod : 1 * time . Minute ,
2015-01-30 23:31:36 +00:00
RegisterRetryCount : 10 ,
2015-02-07 19:53:42 +00:00
PodEvictionTimeout : 5 * time . Minute ,
2015-01-30 23:31:36 +00:00
NodeMilliCPU : 1000 ,
NodeMemory : resource . MustParse ( "3Gi" ) ,
2015-01-15 01:05:48 +00:00
SyncNodeList : true ,
2015-01-30 23:31:36 +00:00
KubeletConfig : client . KubeletConfig {
Port : ports . KubeletPort ,
2015-04-01 23:19:17 +00:00
EnableHttps : true ,
2015-03-19 01:11:39 +00:00
HTTPTimeout : time . Duration ( 5 ) * time . Second ,
2015-01-30 23:31:36 +00:00
} ,
2015-04-01 12:52:28 +00:00
ClusterName : "kubernetes" ,
2015-01-30 23:31:36 +00:00
}
return & s
}
// AddFlags adds flags for a specific CMServer to the specified FlagSet
func ( s * CMServer ) AddFlags ( fs * pflag . FlagSet ) {
fs . IntVar ( & s . Port , "port" , s . Port , "The port that the controller-manager's http service runs on" )
fs . Var ( & s . Address , "address" , "The IP address to serve on (set to 0.0.0.0 for all interfaces)" )
2015-04-09 17:12:52 +00:00
s . ClientConfig . QPS = 20.0
s . ClientConfig . Burst = 30
2015-01-30 23:31:36 +00:00
client . BindClientConfigFlags ( fs , & s . ClientConfig )
fs . StringVar ( & s . CloudProvider , "cloud_provider" , s . CloudProvider , "The provider for cloud services. Empty string for no provider." )
fs . StringVar ( & s . CloudConfigFile , "cloud_config" , s . CloudConfigFile , "The path to the cloud provider configuration file. Empty string for no configuration file." )
2015-01-15 01:05:48 +00:00
fs . StringVar ( & s . MinionRegexp , "minion_regexp" , s . MinionRegexp , "If non empty, and --cloud_provider is specified, a regular expression for matching minion VMs." )
2015-01-30 23:31:36 +00:00
fs . DurationVar ( & s . NodeSyncPeriod , "node_sync_period" , s . NodeSyncPeriod , "" +
"The period for syncing nodes from cloudprovider. Longer periods will result in " +
"fewer calls to cloud provider, but may delay addition of new nodes to cluster." )
fs . DurationVar ( & s . ResourceQuotaSyncPeriod , "resource_quota_sync_period" , s . ResourceQuotaSyncPeriod , "The period for syncing quota usage status in the system" )
2015-03-20 16:49:03 +00:00
fs . DurationVar ( & s . NamespaceSyncPeriod , "namespace_sync_period" , s . NamespaceSyncPeriod , "The period for syncing namespace life-cycle updates" )
2015-02-07 19:53:42 +00:00
fs . DurationVar ( & s . PodEvictionTimeout , "pod_eviction_timeout" , s . PodEvictionTimeout , "The grace peroid for deleting pods on failed nodes." )
2015-04-02 15:13:13 +00:00
fs . Float32Var ( & s . DeletingPodsQps , "deleting_pods_qps" , 0.1 , "Number of nodes per second on which pods are deleted in case of node failure." )
fs . IntVar ( & s . DeletingPodsBurst , "deleting_pods_burst" , 10 , "Number of nodes on which pods are bursty deleted in case of node failure. For more details look into RateLimiter." )
2015-01-30 23:31:36 +00:00
fs . IntVar ( & s . RegisterRetryCount , "register_retry_count" , s . RegisterRetryCount , "" +
"The number of retries for initial node registration. Retry interval equals node_sync_period." )
fs . Var ( & s . MachineList , "machines" , "List of machines to schedule onto, comma separated." )
2015-01-15 01:05:48 +00:00
fs . BoolVar ( & s . SyncNodeList , "sync_nodes" , s . SyncNodeList , "If true, and --cloud_provider is specified, sync nodes from the cloud provider. Default true." )
2015-03-27 14:09:51 +00:00
fs . BoolVar ( & s . SyncNodeStatus , "sync_node_status" , s . SyncNodeStatus ,
"DEPRECATED. Does not have any effect now and it will be removed in a later release." )
fs . DurationVar ( & s . NodeMonitorGracePeriod , "node_monitor_grace_period" , 40 * time . Second ,
"Amount of time which we allow running Node to be unresponsive before marking it unhealty. " +
"Must be N times more than kubelet's nodeStatusUpdateFrequency, " +
"where N means number of retries allowed for kubelet to post node status." )
fs . DurationVar ( & s . NodeStartupGracePeriod , "node_startup_grace_period" , 60 * time . Second ,
"Amount of time which we allow starting Node to be unresponsive before marking it unhealty." )
fs . DurationVar ( & s . NodeMonitorPeriod , "node_monitor_period" , 5 * time . Second ,
"The period for syncing NodeStatus in NodeController." )
2015-01-30 23:31:36 +00:00
// TODO: Discover these by pinging the host machines, and rip out these flags.
// TODO: in the meantime, use resource.QuantityFlag() instead of these
fs . Int64Var ( & s . NodeMilliCPU , "node_milli_cpu" , s . NodeMilliCPU , "The amount of MilliCPU provisioned on each node" )
fs . Var ( resource . NewQuantityFlagValue ( & s . NodeMemory ) , "node_memory" , "The amount of memory (in bytes) provisioned on each node" )
client . BindKubeletClientConfigFlags ( fs , & s . KubeletConfig )
2015-04-01 12:52:28 +00:00
fs . StringVar ( & s . ClusterName , "cluster_name" , s . ClusterName , "The instance prefix for the cluster" )
fs . BoolVar ( & s . EnableProfiling , "profiling" , false , "Enable profiling via web interface host:port/debug/pprof/" )
2015-01-30 23:31:36 +00:00
}
func ( s * CMServer ) verifyMinionFlags ( ) {
2015-01-15 01:05:48 +00:00
if ! s . SyncNodeList && s . MinionRegexp != "" {
glog . Info ( "--minion_regexp is ignored by --sync_nodes=false" )
}
2015-01-30 23:31:36 +00:00
if s . CloudProvider == "" || s . MinionRegexp == "" {
if len ( s . MachineList ) == 0 {
glog . Info ( "No machines specified!" )
}
return
}
if len ( s . MachineList ) != 0 {
glog . Info ( "--machines is overwritten by --minion_regexp" )
}
}
// Run runs the CMServer. This should never exit.
func ( s * CMServer ) Run ( _ [ ] string ) error {
s . verifyMinionFlags ( )
if len ( s . ClientConfig . Host ) == 0 {
glog . Fatal ( "usage: controller-manager --master <master>" )
}
kubeClient , err := client . New ( & s . ClientConfig )
if err != nil {
glog . Fatalf ( "Invalid API configuration: %v" , err )
}
2015-03-13 15:44:11 +00:00
go func ( ) {
if s . EnableProfiling {
mux := http . NewServeMux ( )
mux . HandleFunc ( "/debug/pprof/" , pprof . Index )
mux . HandleFunc ( "/debug/pprof/profile" , pprof . Profile )
mux . HandleFunc ( "/debug/pprof/symbol" , pprof . Symbol )
}
http . ListenAndServe ( net . JoinHostPort ( s . Address . String ( ) , strconv . Itoa ( s . Port ) ) , nil )
} ( )
2015-01-30 23:31:36 +00:00
endpoints := service . NewEndpointController ( kubeClient )
go util . Forever ( func ( ) { endpoints . SyncServiceEndpoints ( ) } , time . Second * 10 )
controllerManager := replicationControllerPkg . NewReplicationManager ( kubeClient )
2015-03-01 02:40:57 +00:00
controllerManager . Run ( replicationControllerPkg . DefaultSyncPeriod )
2015-01-30 23:31:36 +00:00
kubeletClient , err := client . NewKubeletClient ( & s . KubeletConfig )
if err != nil {
glog . Fatalf ( "Failure to start kubelet client: %v" , err )
}
2015-01-15 01:05:48 +00:00
2015-01-30 23:31:36 +00:00
cloud := cloudprovider . InitCloudProvider ( s . CloudProvider , s . CloudConfigFile )
nodeResources := & api . NodeResources {
Capacity : api . ResourceList {
api . ResourceCPU : * resource . NewMilliQuantity ( s . NodeMilliCPU , resource . DecimalSI ) ,
api . ResourceMemory : s . NodeMemory ,
} ,
}
2015-02-07 19:53:42 +00:00
2015-03-27 14:09:51 +00:00
if s . SyncNodeStatus {
glog . Warning ( "DEPRECATION NOTICE: sync_node_status flag is being deprecated. It has no effect now and it will be removed in a future version." )
}
2015-02-08 22:32:37 +00:00
nodeController := nodeControllerPkg . NewNodeController ( cloud , s . MinionRegexp , s . MachineList , nodeResources ,
2015-03-31 11:17:12 +00:00
kubeClient , kubeletClient , s . RegisterRetryCount , s . PodEvictionTimeout , util . NewTokenBucketRateLimiter ( s . DeletingPodsQps , s . DeletingPodsBurst ) ,
2015-04-08 11:05:33 +00:00
s . NodeMonitorGracePeriod , s . NodeStartupGracePeriod , s . NodeMonitorPeriod , s . ClusterName )
2015-03-27 14:09:51 +00:00
nodeController . Run ( s . NodeSyncPeriod , s . SyncNodeList )
2015-01-30 23:31:36 +00:00
resourceQuotaManager := resourcequota . NewResourceQuotaManager ( kubeClient )
resourceQuotaManager . Run ( s . ResourceQuotaSyncPeriod )
2015-03-20 16:49:03 +00:00
namespaceManager := namespace . NewNamespaceManager ( kubeClient )
namespaceManager . Run ( s . NamespaceSyncPeriod )
2015-01-30 23:31:36 +00:00
select { }
return nil
}