diff --git a/pkg/kubelet/cadvisor/cadvisor_fake.go b/pkg/kubelet/cadvisor/cadvisor_fake.go index 18683ceb0d8..569d2a68e61 100644 --- a/pkg/kubelet/cadvisor/cadvisor_fake.go +++ b/pkg/kubelet/cadvisor/cadvisor_fake.go @@ -28,6 +28,10 @@ type Fake struct { var _ Interface = new(Fake) +func (c *Fake) Start() error { + return nil +} + func (c *Fake) ContainerInfo(name string, req *cadvisorApi.ContainerInfoRequest) (*cadvisorApi.ContainerInfo, error) { return new(cadvisorApi.ContainerInfo), nil } diff --git a/pkg/kubelet/cadvisor/cadvisor_linux.go b/pkg/kubelet/cadvisor/cadvisor_linux.go index 339c0340209..34195dee767 100644 --- a/pkg/kubelet/cadvisor/cadvisor_linux.go +++ b/pkg/kubelet/cadvisor/cadvisor_linux.go @@ -57,10 +57,6 @@ func New(port uint) (Interface, error) { if err != nil { return nil, err } - err = m.Start() - if err != nil { - return nil, err - } cadvisorClient := &cadvisorClient{ Manager: m, @@ -73,10 +69,13 @@ func New(port uint) (Interface, error) { return nil, err } } - return cadvisorClient, nil } +func (cc *cadvisorClient) Start() error { + return cc.Manager.Start() +} + func (cc *cadvisorClient) exportHTTP(port uint) error { mux := http.NewServeMux() err := cadvisorHttp.RegisterHandlers(mux, cc, "", "", "", "", "/metrics") diff --git a/pkg/kubelet/cadvisor/cadvisor_mock.go b/pkg/kubelet/cadvisor/cadvisor_mock.go index 3e3a2c3e7d9..3649ce14987 100644 --- a/pkg/kubelet/cadvisor/cadvisor_mock.go +++ b/pkg/kubelet/cadvisor/cadvisor_mock.go @@ -29,6 +29,11 @@ type Mock struct { var _ Interface = new(Mock) +func (c *Mock) Start() error { + args := c.Called() + return args.Error(1) +} + // ContainerInfo is a mock implementation of Interface.ContainerInfo. func (c *Mock) ContainerInfo(name string, req *cadvisorApi.ContainerInfoRequest) (*cadvisorApi.ContainerInfo, error) { args := c.Called(name, req) diff --git a/pkg/kubelet/cadvisor/cadvisor_unsupported.go b/pkg/kubelet/cadvisor/cadvisor_unsupported.go index ca232346d58..08bfd9c2c41 100644 --- a/pkg/kubelet/cadvisor/cadvisor_unsupported.go +++ b/pkg/kubelet/cadvisor/cadvisor_unsupported.go @@ -37,6 +37,10 @@ func New(port uint) (Interface, error) { var unsupportedErr = errors.New("cAdvisor is unsupported in this build") +func (cu *cadvisorUnsupported) Start() error { + return unsupportedErr +} + func (cu *cadvisorUnsupported) DockerContainer(name string, req *cadvisorApi.ContainerInfoRequest) (cadvisorApi.ContainerInfo, error) { return cadvisorApi.ContainerInfo{}, unsupportedErr } diff --git a/pkg/kubelet/cadvisor/types.go b/pkg/kubelet/cadvisor/types.go index 8b855b52a43..6aabdc71e6b 100644 --- a/pkg/kubelet/cadvisor/types.go +++ b/pkg/kubelet/cadvisor/types.go @@ -24,6 +24,7 @@ import ( // Interface is an abstract interface for testability. It abstracts the interface to cAdvisor. type Interface interface { + Start() error DockerContainer(name string, req *cadvisorApi.ContainerInfoRequest) (cadvisorApi.ContainerInfo, error) ContainerInfo(name string, req *cadvisorApi.ContainerInfoRequest) (*cadvisorApi.ContainerInfo, error) SubcontainerInfo(name string, req *cadvisorApi.ContainerInfoRequest) (map[string]*cadvisorApi.ContainerInfo, error) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 7068ce81de1..f13f13a9b2f 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -656,6 +656,12 @@ func (kl *Kubelet) Run(updates <-chan PodUpdate) { glog.Errorf("Failed to start ImageManager, images may not be garbage collected: %v", err) } + err = kl.cadvisor.Start() + if err != nil { + kl.recorder.Eventf(kl.nodeRef, "kubeletSetupFailed", "Failed to start CAdvisor %v", err) + glog.Errorf("Failed to start CAdvisor, system may not be properly monitored: %v", err) + } + err = kl.containerManager.Start() if err != nil { kl.recorder.Eventf(kl.nodeRef, "kubeletSetupFailed", "Failed to start ContainerManager %v", err)