// NewAPIServer creates a new APIServer object with default parameters func NewAPIServer() *APIServer { s := APIServer{ InsecurePort: 8080, InsecureBindAddress: util.IP(net.ParseIP("127.0.0.1")), BindAddress: util.IP(net.ParseIP("0.0.0.0")), SecurePort: 6443, APIRate: 10.0, APIBurst: 200, APIPrefix: "/api", ExpAPIPrefix: "/experimental", EventTTL: 1 * time.Hour, AuthorizationMode: "AlwaysAllow", AdmissionControl: "AlwaysAdmit", EtcdPathPrefix: master.DefaultEtcdPathPrefix, EnableLogsSupport: true, MasterServiceNamespace: api.NamespaceDefault, ClusterName: "kubernetes", CertDirectory: "/var/run/kubernetes", RuntimeConfig: make(util.ConfigurationMap), KubeletConfig: client.KubeletConfig{ Port: ports.KubeletPort, EnableHttps: true, HTTPTimeout: time.Duration(5) * time.Second, }, } return &s }
// NewProxyServer creates a new ProxyServer object with default parameters func NewProxyServer() *ProxyServer { return &ProxyServer{ BindAddress: util.IP(net.ParseIP("0.0.0.0")), HealthzPort: 10249, HealthzBindAddress: util.IP(net.ParseIP("127.0.0.1")), OOMScoreAdj: -899, ResourceContainer: "/kube-proxy", } }
// SimpleRunKubelet is a simple way to start a Kubelet talking to dockerEndpoint, using an API Client. // Under the hood it calls RunKubelet (below) func SimpleKubelet(client *client.Client, dockerClient dockertools.DockerInterface, hostname, rootDir, manifestURL, address string, port uint, masterServiceNamespace string, volumePlugins []volume.VolumePlugin, tlsOptions *kubelet.TLSOptions, cadvisorInterface cadvisor.Interface, configFilePath string, cloud cloudprovider.Interface, osInterface kubecontainer.OSInterface) *KubeletConfig { imageGCPolicy := kubelet.ImageGCPolicy{ HighThresholdPercent: 90, LowThresholdPercent: 80, } diskSpacePolicy := kubelet.DiskSpacePolicy{ DockerFreeDiskMB: 256, RootFreeDiskMB: 256, } kcfg := KubeletConfig{ KubeClient: client, DockerClient: dockerClient, HostnameOverride: hostname, RootDirectory: rootDir, ManifestURL: manifestURL, PodInfraContainerImage: dockertools.PodInfraContainerImage, Port: port, Address: util.IP(net.ParseIP(address)), EnableServer: true, EnableDebuggingHandlers: true, HTTPCheckFrequency: 1 * time.Second, FileCheckFrequency: 1 * time.Second, SyncFrequency: 3 * time.Second, MinimumGCAge: 10 * time.Second, MaxPerPodContainerCount: 2, MaxContainerCount: 100, RegisterNode: true, MasterServiceNamespace: masterServiceNamespace, VolumePlugins: volumePlugins, TLSOptions: tlsOptions, CadvisorInterface: cadvisorInterface, ConfigFile: configFilePath, ImageGCPolicy: imageGCPolicy, DiskSpacePolicy: diskSpacePolicy, Cloud: cloud, NodeStatusUpdateFrequency: 10 * time.Second, ResourceContainer: "/kubelet", OSInterface: osInterface, CgroupRoot: "", ContainerRuntime: "docker", Mounter: mount.New(), DockerDaemonContainer: "/docker-daemon", SystemContainer: "", MaxPods: 32, DockerExecHandler: &dockertools.NativeExecHandler{}, } return &kcfg }
// NewSchedulerServer creates a new SchedulerServer with default parameters func NewSchedulerServer() *SchedulerServer { s := SchedulerServer{ Port: ports.SchedulerPort, Address: util.IP(net.ParseIP("127.0.0.1")), AlgorithmProvider: factory.DefaultProvider, } return &s }
// NewKubeletServer will create a new KubeletServer with default values. func NewKubeletServer() *KubeletServer { return &KubeletServer{ SyncFrequency: 10 * time.Second, FileCheckFrequency: 20 * time.Second, HTTPCheckFrequency: 20 * time.Second, EnableServer: true, Address: util.IP(net.ParseIP("0.0.0.0")), Port: ports.KubeletPort, ReadOnlyPort: ports.KubeletReadOnlyPort, PodInfraContainerImage: dockertools.PodInfraContainerImage, RootDirectory: defaultRootDir, RegistryBurst: 10, EnableDebuggingHandlers: true, MinimumGCAge: 1 * time.Minute, MaxPerPodContainerCount: 2, MaxContainerCount: 100, AuthPath: util.NewStringFlag("/var/lib/kubelet/kubernetes_auth"), // deprecated KubeConfig: util.NewStringFlag("/var/lib/kubelet/kubeconfig"), CadvisorPort: 4194, HealthzPort: 10248, HealthzBindAddress: util.IP(net.ParseIP("127.0.0.1")), RegisterNode: true, // will be ignored if no apiserver is configured OOMScoreAdj: -900, MasterServiceNamespace: api.NamespaceDefault, ImageGCHighThresholdPercent: 90, ImageGCLowThresholdPercent: 80, LowDiskSpaceThresholdMB: 256, NetworkPluginName: "", NetworkPluginDir: "/usr/libexec/kubernetes/kubelet-plugins/net/exec/", HostNetworkSources: kubelet.FileSource, CertDirectory: "/var/run/kubernetes", NodeStatusUpdateFrequency: 10 * time.Second, ResourceContainer: "/kubelet", CgroupRoot: "", ContainerRuntime: "docker", DockerDaemonContainer: "/docker-daemon", SystemContainer: "", ConfigureCBR0: false, DockerExecHandlerName: "native", } }
func NewKubeletExecutorServer() *KubeletExecutorServer { k := &KubeletExecutorServer{ KubeletServer: app.NewKubeletServer(), SuicideTimeout: config.DefaultSuicideTimeout, cgroupPrefix: config.DefaultCgroupPrefix, } if pwd, err := os.Getwd(); err != nil { log.Warningf("failed to determine current directory: %v", err) } else { k.RootDirectory = pwd // mesos sandbox dir } k.Address = util.IP(net.ParseIP(defaultBindingAddress())) k.ShutdownFD = -1 // indicates unspecified FD return k }
// NewCMServer creates a new CMServer with a default config. func NewCMServer() *CMServer { s := CMServer{ Port: ports.ControllerManagerPort, Address: util.IP(net.ParseIP("127.0.0.1")), ConcurrentEndpointSyncs: 5, ConcurrentRCSyncs: 5, ServiceSyncPeriod: 5 * time.Minute, NodeSyncPeriod: 10 * time.Second, ResourceQuotaSyncPeriod: 10 * time.Second, NamespaceSyncPeriod: 5 * time.Minute, PVClaimBinderSyncPeriod: 10 * time.Second, RegisterRetryCount: 10, PodEvictionTimeout: 5 * time.Minute, ClusterName: "kubernetes", } return &s }
// RunKubelet starts the Kubelet. func (c *NodeConfig) RunKubelet() { // TODO: clean this up and make it more formal (service named 'dns'?). Use multiple ports. clusterDNS := c.KubeletConfig.ClusterDNS if clusterDNS == nil { if service, err := c.Client.Endpoints(kapi.NamespaceDefault).Get("kubernetes"); err == nil { if ip, ok := firstIP(service, 53); ok { if err := cmdutil.WaitForSuccessfulDial(false, "tcp", fmt.Sprintf("%s:%d", ip, 53), 50*time.Millisecond, 0, 2); err == nil { c.KubeletConfig.ClusterDNS = util.IP(net.ParseIP(ip)) } } } } c.KubeletConfig.DockerClient = c.DockerClient // updated by NodeConfig.EnsureVolumeDir c.KubeletConfig.RootDirectory = c.VolumeDir go func() { glog.Fatal(c.KubeletServer.Run(c.KubeletConfig)) }() }
// NewSchedulerServer creates a new SchedulerServer with default parameters func NewSchedulerServer() *SchedulerServer { s := SchedulerServer{ Port: ports.SchedulerPort, Address: util.IP(net.ParseIP("127.0.0.1")), FailoverTimeout: time.Duration((1 << 62) - 1).Seconds(), RunProxy: true, ExecutorSuicideTimeout: execcfg.DefaultSuicideTimeout, ExecutorCgroupPrefix: execcfg.DefaultCgroupPrefix, DefaultContainerCPULimit: mresource.DefaultDefaultContainerCPULimit, DefaultContainerMemLimit: mresource.DefaultDefaultContainerMemLimit, MinionLogMaxSize: minioncfg.DefaultLogMaxSize(), MinionLogMaxBackups: minioncfg.DefaultLogMaxBackups, MinionLogMaxAgeInDays: minioncfg.DefaultLogMaxAgeInDays, MesosAuthProvider: sasl.ProviderName, MesosMaster: defaultMesosMaster, MesosUser: defaultMesosUser, ReconcileInterval: defaultReconcileInterval, ReconcileCooldown: defaultReconcileCooldown, Checkpoint: true, FrameworkName: defaultFrameworkName, HA: false, mux: http.NewServeMux(), KubeletCadvisorPort: 4194, // copied from github.com/GoogleCloudPlatform/kubernetes/blob/release-0.14/cmd/kubelet/app/server.go KubeletSyncFrequency: 10 * time.Second, } // cache this for later use. also useful in case the original binary gets deleted, e.g. // during upgrades, development deployments, etc. if filename, err := osext.Executable(); err != nil { log.Fatalf("failed to determine path to currently running executable: %v", err) } else { s.executable = filename s.KMPath = filename } return &s }
func BuildKubernetesNodeConfig(options configapi.NodeConfig) (*NodeConfig, error) { kubeClient, _, err := configapi.GetKubeClient(options.MasterKubeConfig) if err != nil { return nil, err } if options.NodeName == "localhost" { glog.Warningf(`Using "localhost" as node name will not resolve from all locations`) } var dnsIP net.IP if len(options.DNSIP) > 0 { dnsIP = net.ParseIP(options.DNSIP) if dnsIP == nil { return nil, fmt.Errorf("Invalid DNS IP: %s", options.DNSIP) } } clientCAs, err := util.CertPoolFromFile(options.ServingInfo.ClientCA) if err != nil { return nil, err } imageTemplate := variable.NewDefaultImageTemplate() imageTemplate.Format = options.ImageConfig.Format imageTemplate.Latest = options.ImageConfig.Latest var path string var fileCheckInterval int64 if options.PodManifestConfig != nil { path = options.PodManifestConfig.Path fileCheckInterval = options.PodManifestConfig.FileCheckIntervalSeconds } var dockerExecHandler dockertools.ExecHandler switch options.DockerConfig.ExecHandlerName { case configapi.DockerExecHandlerNative: dockerExecHandler = &dockertools.NativeExecHandler{} case configapi.DockerExecHandlerNsenter: dockerExecHandler = &dockertools.NsenterExecHandler{} } kubeAddress, kubePortStr, err := net.SplitHostPort(options.ServingInfo.BindAddress) if err != nil { return nil, fmt.Errorf("cannot parse node address: %v", err) } kubePort, err := strconv.Atoi(kubePortStr) if err != nil { return nil, fmt.Errorf("cannot parse node port: %v", err) } address := util.IP{} if err := address.Set(kubeAddress); err != nil { return nil, err } // declare the OpenShift defaults from config server := kapp.NewKubeletServer() server.Config = path server.RootDirectory = options.VolumeDirectory server.HostnameOverride = options.NodeName server.AllowPrivileged = true server.RegisterNode = true server.Address = address server.Port = uint(kubePort) server.ReadOnlyPort = 0 // no read only access server.ClusterDNS = util.IP(dnsIP) server.ClusterDomain = options.DNSDomain server.NetworkPluginName = options.NetworkPluginName server.HostNetworkSources = strings.Join([]string{kubelet.ApiserverSource, kubelet.FileSource}, ",") server.HTTPCheckFrequency = 0 // no remote HTTP pod creation access server.FileCheckFrequency = time.Duration(fileCheckInterval) * time.Second server.PodInfraContainerImage = imageTemplate.ExpandOrDie("pod") // prevents kube from generating certs server.TLSCertFile = options.ServingInfo.ServerCert.CertFile server.TLSPrivateKeyFile = options.ServingInfo.ServerCert.KeyFile if value := cmdutil.Env("OPENSHIFT_CONTAINERIZED", ""); len(value) > 0 { server.Containerized = value == "true" } // resolve extended arguments // TODO: this should be done in config validation (along with the above) so we can provide // proper errors if err := cmdflags.Resolve(options.KubeletArguments, server.AddFlags); len(err) > 0 { return nil, errors.NewAggregate(err) } cfg, err := server.KubeletConfig() if err != nil { return nil, err } // provide any config overrides cfg.StreamingConnectionIdleTimeout = 5 * time.Minute // TODO: should be set cfg.KubeClient = kubeClient cfg.DockerExecHandler = dockerExecHandler // Make sure the node doesn't think it is in standalone mode // This is required for the node to enforce nodeSelectors on pods, to set hostIP on pod status updates, etc cfg.StandaloneMode = false // TODO: could be cleaner if configapi.UseTLS(options.ServingInfo) { cfg.TLSOptions = &kubelet.TLSOptions{ Config: &tls.Config{ // Change default from SSLv3 to TLSv1.0 (because of POODLE vulnerability) MinVersion: tls.VersionTLS10, // RequireAndVerifyClientCert lets us limit requests to ones with a valid client certificate ClientAuth: tls.RequireAndVerifyClientCert, ClientCAs: clientCAs, }, CertFile: options.ServingInfo.ServerCert.CertFile, KeyFile: options.ServingInfo.ServerCert.KeyFile, } } else { cfg.TLSOptions = nil } config := &NodeConfig{ BindAddress: options.ServingInfo.BindAddress, AllowDisabledDocker: options.AllowDisabledDocker, Client: kubeClient, VolumeDir: options.VolumeDirectory, KubeletServer: server, KubeletConfig: cfg, } return config, nil }