2015-09-01 13:35:38 +00:00
/ *
Copyright 2015 The Kubernetes Authors 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 .
* /
package main
import (
"fmt"
"runtime"
2015-09-01 13:35:38 +00:00
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/record"
2015-09-01 13:35:38 +00:00
client "k8s.io/kubernetes/pkg/client/unversioned"
2016-03-01 22:15:55 +00:00
clientset "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
2015-09-01 13:35:38 +00:00
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
2016-02-25 23:40:44 +00:00
cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing"
2015-10-10 00:09:53 +00:00
"k8s.io/kubernetes/pkg/kubelet/cm"
2015-09-01 13:35:38 +00:00
"k8s.io/kubernetes/pkg/kubelet/dockertools"
2015-09-01 13:35:38 +00:00
"k8s.io/kubernetes/pkg/kubemark"
2015-09-01 13:35:38 +00:00
proxyconfig "k8s.io/kubernetes/pkg/proxy/config"
2016-03-11 05:33:16 +00:00
"k8s.io/kubernetes/pkg/util/flag"
2015-09-01 13:35:38 +00:00
fakeiptables "k8s.io/kubernetes/pkg/util/iptables/testing"
"k8s.io/kubernetes/pkg/util/sets"
2015-09-01 13:35:38 +00:00
"github.com/golang/glog"
"github.com/spf13/pflag"
)
2015-09-01 13:35:38 +00:00
type HollowNodeConfig struct {
KubeconfigPath string
KubeletPort int
KubeletReadOnlyPort int
2015-09-01 13:35:38 +00:00
Morph string
2015-09-01 13:35:38 +00:00
NodeName string
ServerPort int
2016-04-19 07:35:32 +00:00
ContentType string
2015-09-01 13:35:38 +00:00
}
2016-03-02 15:21:16 +00:00
const (
maxPods = 110
)
2015-09-01 13:35:38 +00:00
var knownMorphs = sets . NewString ( "kubelet" , "proxy" )
2015-09-01 13:35:38 +00:00
func ( c * HollowNodeConfig ) addFlags ( fs * pflag . FlagSet ) {
fs . StringVar ( & c . KubeconfigPath , "kubeconfig" , "/kubeconfig/kubeconfig" , "Path to kubeconfig file." )
fs . IntVar ( & c . KubeletPort , "kubelet-port" , 10250 , "Port on which HollowKubelet should be listening." )
fs . IntVar ( & c . KubeletReadOnlyPort , "kubelet-read-only-port" , 10255 , "Read-only port on which Kubelet is listening." )
fs . StringVar ( & c . NodeName , "name" , "fake-node" , "Name of this Hollow Node." )
fs . IntVar ( & c . ServerPort , "api-server-port" , 443 , "Port on which API server is listening." )
2015-09-01 13:35:38 +00:00
fs . StringVar ( & c . Morph , "morph" , "" , fmt . Sprintf ( "Specifies into which Hollow component this binary should morph. Allowed values: %v" , knownMorphs . List ( ) ) )
2016-04-19 07:35:32 +00:00
fs . StringVar ( & c . ContentType , "kube-api-content-type" , "application/json" , "ContentType of requests sent to apiserver. Passing application/vnd.kubernetes.protobuf is an experimental feature now." )
2015-09-01 13:35:38 +00:00
}
2016-04-19 07:35:32 +00:00
func ( c * HollowNodeConfig ) createClientFromFile ( ) ( * client . Client , error ) {
clientConfig , err := clientcmd . LoadFromFile ( c . KubeconfigPath )
2015-09-01 13:35:38 +00:00
if err != nil {
2016-04-19 07:35:32 +00:00
return nil , fmt . Errorf ( "error while loading kubeconfig from file %v: %v" , c . KubeconfigPath , err )
2015-09-01 13:35:38 +00:00
}
2016-04-19 07:35:32 +00:00
config , err := clientcmd . NewDefaultClientConfig ( * clientConfig , & clientcmd . ConfigOverrides { } ) . ClientConfig ( )
2015-09-01 13:35:38 +00:00
if err != nil {
return nil , fmt . Errorf ( "error while creating kubeconfig: %v" , err )
}
2016-04-19 07:35:32 +00:00
config . ContentType = c . ContentType
2015-09-01 13:35:38 +00:00
client , err := client . New ( config )
if err != nil {
return nil , fmt . Errorf ( "error while creating client: %v" , err )
}
return client , nil
}
2015-09-01 13:35:38 +00:00
func main ( ) {
runtime . GOMAXPROCS ( runtime . NumCPU ( ) )
2015-09-01 13:35:38 +00:00
config := HollowNodeConfig { }
config . addFlags ( pflag . CommandLine )
2016-03-11 05:33:16 +00:00
flag . InitFlags ( )
2015-09-01 13:35:38 +00:00
2015-09-01 13:35:38 +00:00
if ! knownMorphs . Has ( config . Morph ) {
2016-01-29 19:35:04 +00:00
glog . Fatalf ( "Unknown morph: %v. Allowed values: %v" , config . Morph , knownMorphs . List ( ) )
2015-09-01 13:35:38 +00:00
}
// create a client to communicate with API server.
2016-04-19 07:35:32 +00:00
cl , err := config . createClientFromFile ( )
2016-02-01 22:30:47 +00:00
clientset := clientset . FromUnversionedClient ( cl )
2015-09-01 13:35:38 +00:00
if err != nil {
glog . Fatal ( "Failed to create a Client. Exiting." )
}
2015-09-01 13:35:38 +00:00
if config . Morph == "kubelet" {
2016-02-25 23:40:44 +00:00
cadvisorInterface := new ( cadvisortest . Fake )
2015-10-10 00:09:53 +00:00
containerManager := cm . NewStubContainerManager ( )
2015-09-01 13:35:38 +00:00
2015-11-19 21:59:18 +00:00
fakeDockerClient := dockertools . NewFakeDockerClient ( )
2015-09-01 13:35:38 +00:00
fakeDockerClient . EnableSleep = true
hollowKubelet := kubemark . NewHollowKubelet (
config . NodeName ,
2016-02-01 22:30:47 +00:00
clientset ,
2015-09-01 13:35:38 +00:00
cadvisorInterface ,
fakeDockerClient ,
config . KubeletPort ,
config . KubeletReadOnlyPort ,
2015-10-10 00:09:53 +00:00
containerManager ,
2016-03-02 15:21:16 +00:00
maxPods ,
2015-09-01 13:35:38 +00:00
)
hollowKubelet . Run ( )
}
if config . Morph == "proxy" {
eventBroadcaster := record . NewBroadcaster ( )
recorder := eventBroadcaster . NewRecorder ( api . EventSource { Component : "kube-proxy" , Host : config . NodeName } )
iptInterface := fakeiptables . NewFake ( )
serviceConfig := proxyconfig . NewServiceConfig ( )
serviceConfig . RegisterHandler ( & kubemark . FakeProxyHandler { } )
endpointsConfig := proxyconfig . NewEndpointsConfig ( )
endpointsConfig . RegisterHandler ( & kubemark . FakeProxyHandler { } )
hollowProxy := kubemark . NewHollowProxyOrDie ( config . NodeName , cl , endpointsConfig , serviceConfig , iptInterface , eventBroadcaster , recorder )
hollowProxy . Run ( )
}
2015-09-01 13:35:38 +00:00
}