Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
2ad933e1
Commit
2ad933e1
authored
May 04, 2015
by
Victor Marmol
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #7674 from yujuhong/enable_runtime
Kubelet: replace DockerManager with the Runtime interface
parents
9927a85c
1ad4dd78
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
373 additions
and
61 deletions
+373
-61
docker_test.go
pkg/kubelet/dockertools/docker_test.go
+1
-2
fake_manager.go
pkg/kubelet/dockertools/fake_manager.go
+47
-0
manager.go
pkg/kubelet/dockertools/manager.go
+5
-6
manager_test.go
pkg/kubelet/dockertools/manager_test.go
+289
-8
kubelet.go
pkg/kubelet/kubelet.go
+27
-37
kubelet_test.go
pkg/kubelet/kubelet_test.go
+0
-0
pod_workers_test.go
pkg/kubelet/pod_workers_test.go
+1
-2
runonce.go
pkg/kubelet/runonce.go
+2
-2
runonce_test.go
pkg/kubelet/runonce_test.go
+1
-4
No files found.
pkg/kubelet/dockertools/docker_test.go
View file @
2ad933e1
...
@@ -28,7 +28,6 @@ import (
...
@@ -28,7 +28,6 @@ import (
"github.com/GoogleCloudPlatform/kubernetes/pkg/credentialprovider"
"github.com/GoogleCloudPlatform/kubernetes/pkg/credentialprovider"
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
kubeletProber
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/prober"
"github.com/GoogleCloudPlatform/kubernetes/pkg/types"
"github.com/GoogleCloudPlatform/kubernetes/pkg/types"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
docker
"github.com/fsouza/go-dockerclient"
docker
"github.com/fsouza/go-dockerclient"
...
@@ -553,7 +552,7 @@ func TestFindContainersByPod(t *testing.T) {
...
@@ -553,7 +552,7 @@ func TestFindContainersByPod(t *testing.T) {
}
}
fakeClient
:=
&
FakeDockerClient
{}
fakeClient
:=
&
FakeDockerClient
{}
np
,
_
:=
network
.
InitNetworkPlugin
([]
network
.
NetworkPlugin
{},
""
,
network
.
NewFakeHost
(
nil
))
np
,
_
:=
network
.
InitNetworkPlugin
([]
network
.
NetworkPlugin
{},
""
,
network
.
NewFakeHost
(
nil
))
containerManager
:=
New
DockerManager
(
fakeClient
,
&
record
.
FakeRecorder
{},
nil
,
nil
,
PodInfraContainerImage
,
0
,
0
,
""
,
kubecontainer
.
FakeOS
{},
np
,
&
kubeletProber
.
FakeProber
{}
,
nil
,
nil
,
nil
)
containerManager
:=
New
FakeDockerManager
(
fakeClient
,
&
record
.
FakeRecorder
{},
nil
,
nil
,
PodInfraContainerImage
,
0
,
0
,
""
,
kubecontainer
.
FakeOS
{},
np
,
nil
,
nil
,
nil
)
for
i
,
test
:=
range
tests
{
for
i
,
test
:=
range
tests
{
fakeClient
.
ContainerList
=
test
.
containerList
fakeClient
.
ContainerList
=
test
.
containerList
fakeClient
.
ExitedContainerList
=
test
.
exitedContainerList
fakeClient
.
ExitedContainerList
=
test
.
exitedContainerList
...
...
pkg/kubelet/dockertools/fake_manager.go
0 → 100644
View file @
2ad933e1
/*
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
dockertools
import
(
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/record"
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/prober"
kubeletTypes
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/types"
)
func
NewFakeDockerManager
(
client
DockerInterface
,
recorder
record
.
EventRecorder
,
readinessManager
*
kubecontainer
.
ReadinessManager
,
containerRefManager
*
kubecontainer
.
RefManager
,
podInfraContainerImage
string
,
qps
float32
,
burst
int
,
containerLogsDir
string
,
osInterface
kubecontainer
.
OSInterface
,
networkPlugin
network
.
NetworkPlugin
,
generator
kubecontainer
.
RunContainerOptionsGenerator
,
httpClient
kubeletTypes
.
HttpGetter
,
runtimeHooks
kubecontainer
.
RuntimeHooks
)
*
DockerManager
{
dm
:=
NewDockerManager
(
client
,
recorder
,
readinessManager
,
containerRefManager
,
podInfraContainerImage
,
qps
,
burst
,
containerLogsDir
,
osInterface
,
networkPlugin
,
generator
,
httpClient
,
runtimeHooks
)
dm
.
Puller
=
&
FakeDockerPuller
{}
dm
.
prober
=
prober
.
New
(
nil
,
readinessManager
,
containerRefManager
,
recorder
)
return
dm
}
pkg/kubelet/dockertools/manager.go
View file @
2ad933e1
...
@@ -91,10 +91,8 @@ type DockerManager struct {
...
@@ -91,10 +91,8 @@ type DockerManager struct {
// Network plugin.
// Network plugin.
networkPlugin
network
.
NetworkPlugin
networkPlugin
network
.
NetworkPlugin
// TODO(vmarmol): Make this non-public when we remove the circular dependency
// with prober.
// Health check prober.
// Health check prober.
P
rober
prober
.
Prober
p
rober
prober
.
Prober
// Generator of runtime container options.
// Generator of runtime container options.
generator
kubecontainer
.
RunContainerOptionsGenerator
generator
kubecontainer
.
RunContainerOptionsGenerator
...
@@ -117,7 +115,6 @@ func NewDockerManager(
...
@@ -117,7 +115,6 @@ func NewDockerManager(
containerLogsDir
string
,
containerLogsDir
string
,
osInterface
kubecontainer
.
OSInterface
,
osInterface
kubecontainer
.
OSInterface
,
networkPlugin
network
.
NetworkPlugin
,
networkPlugin
network
.
NetworkPlugin
,
prober
prober
.
Prober
,
generator
kubecontainer
.
RunContainerOptionsGenerator
,
generator
kubecontainer
.
RunContainerOptionsGenerator
,
httpClient
kubeletTypes
.
HttpGetter
,
httpClient
kubeletTypes
.
HttpGetter
,
runtimeHooks
kubecontainer
.
RuntimeHooks
)
*
DockerManager
{
runtimeHooks
kubecontainer
.
RuntimeHooks
)
*
DockerManager
{
...
@@ -164,11 +161,13 @@ func NewDockerManager(
...
@@ -164,11 +161,13 @@ func NewDockerManager(
dockerRoot
:
dockerRoot
,
dockerRoot
:
dockerRoot
,
containerLogsDir
:
containerLogsDir
,
containerLogsDir
:
containerLogsDir
,
networkPlugin
:
networkPlugin
,
networkPlugin
:
networkPlugin
,
Prober
:
prober
,
prober
:
nil
,
generator
:
generator
,
generator
:
generator
,
runtimeHooks
:
runtimeHooks
,
runtimeHooks
:
runtimeHooks
,
}
}
dm
.
runner
=
lifecycle
.
NewHandlerRunner
(
httpClient
,
dm
,
dm
)
dm
.
runner
=
lifecycle
.
NewHandlerRunner
(
httpClient
,
dm
,
dm
)
dm
.
prober
=
prober
.
New
(
dm
,
readinessManager
,
containerRefManager
,
recorder
)
return
dm
return
dm
}
}
...
@@ -1305,7 +1304,7 @@ func (dm *DockerManager) computePodContainerChanges(pod *api.Pod, runningPod kub
...
@@ -1305,7 +1304,7 @@ func (dm *DockerManager) computePodContainerChanges(pod *api.Pod, runningPod kub
continue
continue
}
}
result
,
err
:=
dm
.
P
rober
.
Probe
(
pod
,
podStatus
,
container
,
string
(
c
.
ID
),
c
.
Created
)
result
,
err
:=
dm
.
p
rober
.
Probe
(
pod
,
podStatus
,
container
,
string
(
c
.
ID
),
c
.
Created
)
if
err
!=
nil
{
if
err
!=
nil
{
// TODO(vmarmol): examine this logic.
// TODO(vmarmol): examine this logic.
glog
.
V
(
2
)
.
Infof
(
"probe no-error: %q"
,
container
.
Name
)
glog
.
V
(
2
)
.
Infof
(
"probe no-error: %q"
,
container
.
Name
)
...
...
pkg/kubelet/dockertools/manager_test.go
View file @
2ad933e1
...
@@ -17,28 +17,32 @@ limitations under the License.
...
@@ -17,28 +17,32 @@ limitations under the License.
package
dockertools
package
dockertools
import
(
import
(
"errors"
"fmt"
"fmt"
"reflect"
"reflect"
"sort"
"sort"
"testing"
"testing"
"time"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/record"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/record"
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
kubeprober
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/prober"
"github.com/GoogleCloudPlatform/kubernetes/pkg/probe"
"github.com/GoogleCloudPlatform/kubernetes/pkg/types"
"github.com/GoogleCloudPlatform/kubernetes/pkg/types"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
uexec
"github.com/GoogleCloudPlatform/kubernetes/pkg/util/exec"
"github.com/fsouza/go-dockerclient"
"github.com/fsouza/go-dockerclient"
)
)
func
NewFake
DockerManager
()
(
*
DockerManager
,
*
FakeDockerClient
)
{
func
newTest
DockerManager
()
(
*
DockerManager
,
*
FakeDockerClient
)
{
fakeDocker
:=
&
FakeDockerClient
{
Errors
:
make
(
map
[
string
]
error
),
RemovedImages
:
util
.
StringSet
{}}
fakeDocker
:=
&
FakeDockerClient
{
Errors
:
make
(
map
[
string
]
error
),
RemovedImages
:
util
.
StringSet
{}}
fakeRecorder
:=
&
record
.
FakeRecorder
{}
fakeRecorder
:=
&
record
.
FakeRecorder
{}
readinessManager
:=
kubecontainer
.
NewReadinessManager
()
readinessManager
:=
kubecontainer
.
NewReadinessManager
()
containerRefManager
:=
kubecontainer
.
NewRefManager
()
containerRefManager
:=
kubecontainer
.
NewRefManager
()
networkPlugin
,
_
:=
network
.
InitNetworkPlugin
([]
network
.
NetworkPlugin
{},
""
,
network
.
NewFakeHost
(
nil
))
networkPlugin
,
_
:=
network
.
InitNetworkPlugin
([]
network
.
NetworkPlugin
{},
""
,
network
.
NewFakeHost
(
nil
))
dockerManager
:=
NewFakeDockerManager
(
dockerManager
:=
NewDockerManager
(
fakeDocker
,
fakeDocker
,
fakeRecorder
,
fakeRecorder
,
readinessManager
,
readinessManager
,
...
@@ -49,7 +53,6 @@ func NewFakeDockerManager() (*DockerManager, *FakeDockerClient) {
...
@@ -49,7 +53,6 @@ func NewFakeDockerManager() (*DockerManager, *FakeDockerClient) {
networkPlugin
,
networkPlugin
,
nil
,
nil
,
nil
,
nil
,
nil
,
nil
)
nil
)
return
dockerManager
,
fakeDocker
return
dockerManager
,
fakeDocker
...
@@ -142,7 +145,7 @@ func verifyPods(a, b []*kubecontainer.Pod) bool {
...
@@ -142,7 +145,7 @@ func verifyPods(a, b []*kubecontainer.Pod) bool {
}
}
func
TestGetPods
(
t
*
testing
.
T
)
{
func
TestGetPods
(
t
*
testing
.
T
)
{
manager
,
fakeDocker
:=
NewFake
DockerManager
()
manager
,
fakeDocker
:=
newTest
DockerManager
()
dockerContainers
:=
[]
docker
.
APIContainers
{
dockerContainers
:=
[]
docker
.
APIContainers
{
{
{
ID
:
"1111"
,
ID
:
"1111"
,
...
@@ -195,7 +198,7 @@ func TestGetPods(t *testing.T) {
...
@@ -195,7 +198,7 @@ func TestGetPods(t *testing.T) {
}
}
func
TestListImages
(
t
*
testing
.
T
)
{
func
TestListImages
(
t
*
testing
.
T
)
{
manager
,
fakeDocker
:=
NewFake
DockerManager
()
manager
,
fakeDocker
:=
newTest
DockerManager
()
dockerImages
:=
[]
docker
.
APIImages
{{
ID
:
"1111"
},
{
ID
:
"2222"
},
{
ID
:
"3333"
}}
dockerImages
:=
[]
docker
.
APIImages
{{
ID
:
"1111"
},
{
ID
:
"2222"
},
{
ID
:
"3333"
}}
expected
:=
util
.
NewStringSet
([]
string
{
"1111"
,
"2222"
,
"3333"
}
...
)
expected
:=
util
.
NewStringSet
([]
string
{
"1111"
,
"2222"
,
"3333"
}
...
)
...
@@ -250,7 +253,7 @@ func dockerContainersToPod(containers DockerContainers) kubecontainer.Pod {
...
@@ -250,7 +253,7 @@ func dockerContainersToPod(containers DockerContainers) kubecontainer.Pod {
}
}
func
TestKillContainerInPod
(
t
*
testing
.
T
)
{
func
TestKillContainerInPod
(
t
*
testing
.
T
)
{
manager
,
fakeDocker
:=
NewFake
DockerManager
()
manager
,
fakeDocker
:=
newTest
DockerManager
()
pod
:=
&
api
.
Pod
{
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
api
.
ObjectMeta
{
...
@@ -296,7 +299,7 @@ func TestKillContainerInPod(t *testing.T) {
...
@@ -296,7 +299,7 @@ func TestKillContainerInPod(t *testing.T) {
}
}
func
TestKillContainerInPodWithError
(
t
*
testing
.
T
)
{
func
TestKillContainerInPodWithError
(
t
*
testing
.
T
)
{
manager
,
fakeDocker
:=
NewFake
DockerManager
()
manager
,
fakeDocker
:=
newTest
DockerManager
()
pod
:=
&
api
.
Pod
{
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
api
.
ObjectMeta
{
...
@@ -338,3 +341,281 @@ func TestKillContainerInPodWithError(t *testing.T) {
...
@@ -338,3 +341,281 @@ func TestKillContainerInPodWithError(t *testing.T) {
t
.
Errorf
(
"exepcted container entry ID '%v' to be found. states: %+v"
,
containerToSpare
.
ID
,
ready
)
t
.
Errorf
(
"exepcted container entry ID '%v' to be found. states: %+v"
,
containerToSpare
.
ID
,
ready
)
}
}
}
}
type
fakeExecProber
struct
{
result
probe
.
Result
err
error
}
func
(
p
fakeExecProber
)
Probe
(
_
uexec
.
Cmd
)
(
probe
.
Result
,
error
)
{
return
p
.
result
,
p
.
err
}
func
replaceProber
(
dm
*
DockerManager
,
result
probe
.
Result
,
err
error
)
{
fakeExec
:=
fakeExecProber
{
result
:
result
,
err
:
err
,
}
dm
.
prober
=
kubeprober
.
NewTestProber
(
fakeExec
,
dm
.
readinessManager
,
dm
.
containerRefManager
,
&
record
.
FakeRecorder
{})
return
}
// TestProbeContainer tests the functionality of probeContainer.
// Test cases are:
//
// No probe.
// Only LivenessProbe.
// Only ReadinessProbe.
// Both probes.
//
// Also, for each probe, there will be several cases covering whether the initial
// delay has passed, whether the probe handler will return Success, Failure,
// Unknown or error.
//
func
TestProbeContainer
(
t
*
testing
.
T
)
{
manager
,
_
:=
newTestDockerManager
()
dc
:=
&
docker
.
APIContainers
{
ID
:
"foobar"
,
Created
:
time
.
Now
()
.
Unix
(),
}
tests
:=
[]
struct
{
testContainer
api
.
Container
expectError
bool
expectedResult
probe
.
Result
expectedReadiness
bool
}{
// No probes.
{
testContainer
:
api
.
Container
{},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
// Only LivenessProbe.
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
100
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
},
expectedResult
:
probe
.
Unknown
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectedResult
:
probe
.
Failure
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectedResult
:
probe
.
Unknown
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectError
:
true
,
expectedResult
:
probe
.
Unknown
,
expectedReadiness
:
false
,
},
// Only ReadinessProbe.
{
testContainer
:
api
.
Container
{
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
100
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
{
testContainer
:
api
.
Container
{
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
{
testContainer
:
api
.
Container
{
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
{
testContainer
:
api
.
Container
{
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectError
:
false
,
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
// Both LivenessProbe and ReadinessProbe.
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
100
},
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
100
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
100
},
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
100
},
},
expectedResult
:
probe
.
Unknown
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
},
expectedResult
:
probe
.
Unknown
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
},
expectedResult
:
probe
.
Unknown
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
},
},
expectedResult
:
probe
.
Failure
,
expectedReadiness
:
false
,
},
{
testContainer
:
api
.
Container
{
LivenessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
ReadinessProbe
:
&
api
.
Probe
{
InitialDelaySeconds
:
-
100
,
Handler
:
api
.
Handler
{
Exec
:
&
api
.
ExecAction
{},
},
},
},
expectedResult
:
probe
.
Success
,
expectedReadiness
:
true
,
},
}
for
_
,
test
:=
range
tests
{
if
test
.
expectError
{
replaceProber
(
manager
,
test
.
expectedResult
,
errors
.
New
(
"error"
))
}
else
{
replaceProber
(
manager
,
test
.
expectedResult
,
nil
)
}
result
,
err
:=
manager
.
prober
.
Probe
(
&
api
.
Pod
{},
api
.
PodStatus
{},
test
.
testContainer
,
dc
.
ID
,
dc
.
Created
)
if
test
.
expectError
&&
err
==
nil
{
t
.
Error
(
"Expected error but did no error was returned."
)
}
if
!
test
.
expectError
&&
err
!=
nil
{
t
.
Errorf
(
"Expected error but got: %v"
,
err
)
}
if
test
.
expectedResult
!=
result
{
t
.
Errorf
(
"Expected result was %v but probeContainer() returned %v"
,
test
.
expectedResult
,
result
)
}
if
test
.
expectedReadiness
!=
manager
.
readinessManager
.
GetReadiness
(
dc
.
ID
)
{
t
.
Errorf
(
"Expected readiness was %v but probeContainer() set %v"
,
test
.
expectedReadiness
,
manager
.
readinessManager
.
GetReadiness
(
dc
.
ID
))
}
}
}
pkg/kubelet/kubelet.go
View file @
2ad933e1
...
@@ -245,39 +245,32 @@ func NewMainKubelet(
...
@@ -245,39 +245,32 @@ func NewMainKubelet(
klet
.
networkPlugin
=
plug
klet
.
networkPlugin
=
plug
}
}
// TODO(vmarmol,yjhong): Use container runtime.
// Initialize the runtime.
// Initialize the runtime.
switch
containerRuntime
{
switch
containerRuntime
{
case
"docker"
:
case
"docker"
:
// Only supported one for now, continue.
// Only supported one for now, continue.
klet
.
containerRuntime
=
dockertools
.
NewDockerManager
(
dockerClient
,
recorder
,
readinessManager
,
containerRefManager
,
podInfraContainerImage
,
pullQPS
,
pullBurst
,
containerLogsDir
,
osInterface
,
klet
.
networkPlugin
,
klet
,
klet
.
httpClient
,
newKubeletRuntimeHooks
(
recorder
))
default
:
default
:
return
nil
,
fmt
.
Errorf
(
"unsupported container runtime %q specified"
,
containerRuntime
)
return
nil
,
fmt
.
Errorf
(
"unsupported container runtime %q specified"
,
containerRuntime
)
}
}
containerManager
:=
dockertools
.
NewDockerManager
(
dockerClient
,
recorder
,
readinessManager
,
containerRefManager
,
podInfraContainerImage
,
pullQPS
,
pullBurst
,
containerLogsDir
,
osInterface
,
klet
.
networkPlugin
,
nil
,
klet
,
klet
.
httpClient
,
newKubeletRuntimeHooks
(
recorder
))
klet
.
runner
=
containerManager
klet
.
containerManager
=
containerManager
klet
.
runner
=
klet
.
containerRuntime
klet
.
podManager
=
newBasicPodManager
(
klet
.
kubeClient
)
klet
.
podManager
=
newBasicPodManager
(
klet
.
kubeClient
)
klet
.
prober
=
prober
.
New
(
klet
.
runner
,
klet
.
readinessManager
,
klet
.
containerRefManager
,
klet
.
recorder
)
// TODO(vmarmol): Remove when the circular dependency is removed :(
runtimeCache
,
err
:=
kubecontainer
.
NewRuntimeCache
(
klet
.
containerRuntime
)
containerManager
.
Prober
=
klet
.
prober
runtimeCache
,
err
:=
kubecontainer
.
NewRuntimeCache
(
containerManager
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -355,9 +348,6 @@ type Kubelet struct {
...
@@ -355,9 +348,6 @@ type Kubelet struct {
// Network plugin.
// Network plugin.
networkPlugin
network
.
NetworkPlugin
networkPlugin
network
.
NetworkPlugin
// Healthy check prober.
prober
prober
.
Prober
// Container readiness state manager.
// Container readiness state manager.
readinessManager
*
kubecontainer
.
ReadinessManager
readinessManager
*
kubecontainer
.
ReadinessManager
...
@@ -389,8 +379,8 @@ type Kubelet struct {
...
@@ -389,8 +379,8 @@ type Kubelet struct {
// Reference to this node.
// Reference to this node.
nodeRef
*
api
.
ObjectReference
nodeRef
*
api
.
ObjectReference
//
Manage containers
.
//
Container runtime
.
container
Manager
*
dockertools
.
DockerManager
container
Runtime
kubecontainer
.
Runtime
// nodeStatusUpdateFrequency specifies how often kubelet posts node status to master.
// nodeStatusUpdateFrequency specifies how often kubelet posts node status to master.
// Note: be cautious when changing the constant, it must work with nodeMonitorGracePeriod
// Note: be cautious when changing the constant, it must work with nodeMonitorGracePeriod
...
@@ -883,7 +873,7 @@ func parseResolvConf(reader io.Reader) (nameservers []string, searches []string,
...
@@ -883,7 +873,7 @@ func parseResolvConf(reader io.Reader) (nameservers []string, searches []string,
// Kill all running containers in a pod (includes the pod infra container).
// Kill all running containers in a pod (includes the pod infra container).
func
(
kl
*
Kubelet
)
killPod
(
pod
kubecontainer
.
Pod
)
error
{
func
(
kl
*
Kubelet
)
killPod
(
pod
kubecontainer
.
Pod
)
error
{
return
kl
.
container
Manager
.
KillPod
(
pod
)
return
kl
.
container
Runtime
.
KillPod
(
pod
)
}
}
type
empty
struct
{}
type
empty
struct
{}
...
@@ -961,7 +951,7 @@ func (kl *Kubelet) syncPod(pod *api.Pod, mirrorPod *api.Pod, runningPod kubecont
...
@@ -961,7 +951,7 @@ func (kl *Kubelet) syncPod(pod *api.Pod, mirrorPod *api.Pod, runningPod kubecont
return
err
return
err
}
}
err
=
kl
.
container
Manager
.
SyncPod
(
pod
,
runningPod
,
podStatus
)
err
=
kl
.
container
Runtime
.
SyncPod
(
pod
,
runningPod
,
podStatus
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -1153,7 +1143,7 @@ func (kl *Kubelet) SyncPods(allPods []*api.Pod, podSyncTypes map[types.UID]metri
...
@@ -1153,7 +1143,7 @@ func (kl *Kubelet) SyncPods(allPods []*api.Pod, podSyncTypes map[types.UID]metri
// in the cache. We need to bypass the cach to get the latest set of
// in the cache. We need to bypass the cach to get the latest set of
// running pods to clean up the volumes.
// running pods to clean up the volumes.
// TODO: Evaluate the performance impact of bypassing the runtime cache.
// TODO: Evaluate the performance impact of bypassing the runtime cache.
runningPods
,
err
=
kl
.
container
Manager
.
GetPods
(
false
)
runningPods
,
err
=
kl
.
container
Runtime
.
GetPods
(
false
)
if
err
!=
nil
{
if
err
!=
nil
{
glog
.
Errorf
(
"Error listing containers: %#v"
,
err
)
glog
.
Errorf
(
"Error listing containers: %#v"
,
err
)
return
err
return
err
...
@@ -1350,10 +1340,10 @@ func (kl *Kubelet) syncLoop(updates <-chan PodUpdate, handler SyncHandler) {
...
@@ -1350,10 +1340,10 @@ func (kl *Kubelet) syncLoop(updates <-chan PodUpdate, handler SyncHandler) {
// Returns the container runtime version for this Kubelet.
// Returns the container runtime version for this Kubelet.
func
(
kl
*
Kubelet
)
GetContainerRuntimeVersion
()
(
kubecontainer
.
Version
,
error
)
{
func
(
kl
*
Kubelet
)
GetContainerRuntimeVersion
()
(
kubecontainer
.
Version
,
error
)
{
if
kl
.
container
Manager
==
nil
{
if
kl
.
container
Runtime
==
nil
{
return
nil
,
fmt
.
Errorf
(
"no container runtime"
)
return
nil
,
fmt
.
Errorf
(
"no container runtime"
)
}
}
return
kl
.
container
Manager
.
Version
()
return
kl
.
container
Runtime
.
Version
()
}
}
func
(
kl
*
Kubelet
)
validatePodPhase
(
podStatus
*
api
.
PodStatus
)
error
{
func
(
kl
*
Kubelet
)
validatePodPhase
(
podStatus
*
api
.
PodStatus
)
error
{
...
@@ -1393,7 +1383,7 @@ func (kl *Kubelet) GetKubeletContainerLogs(podFullName, containerName, tail stri
...
@@ -1393,7 +1383,7 @@ func (kl *Kubelet) GetKubeletContainerLogs(podFullName, containerName, tail stri
// waiting state.
// waiting state.
return
err
return
err
}
}
return
kl
.
container
Manager
.
GetContainerLogs
(
containerID
,
tail
,
follow
,
stdout
,
stderr
)
return
kl
.
container
Runtime
.
GetContainerLogs
(
containerID
,
tail
,
follow
,
stdout
,
stderr
)
}
}
// GetHostname Returns the hostname as the kubelet sees it.
// GetHostname Returns the hostname as the kubelet sees it.
...
@@ -1663,7 +1653,7 @@ func (kl *Kubelet) generatePodStatus(pod *api.Pod) (api.PodStatus, error) {
...
@@ -1663,7 +1653,7 @@ func (kl *Kubelet) generatePodStatus(pod *api.Pod) (api.PodStatus, error) {
glog
.
V
(
3
)
.
Infof
(
"Generating status for %q"
,
podFullName
)
glog
.
V
(
3
)
.
Infof
(
"Generating status for %q"
,
podFullName
)
spec
:=
&
pod
.
Spec
spec
:=
&
pod
.
Spec
podStatus
,
err
:=
kl
.
container
Manager
.
GetPodStatus
(
pod
)
podStatus
,
err
:=
kl
.
container
Runtime
.
GetPodStatus
(
pod
)
if
err
!=
nil
{
if
err
!=
nil
{
// Error handling
// Error handling
...
@@ -1713,7 +1703,7 @@ func (kl *Kubelet) ServeLogs(w http.ResponseWriter, req *http.Request) {
...
@@ -1713,7 +1703,7 @@ func (kl *Kubelet) ServeLogs(w http.ResponseWriter, req *http.Request) {
// It returns nil if not found.
// It returns nil if not found.
// TODO(yifan): Move this to runtime once the runtime interface has been all implemented.
// TODO(yifan): Move this to runtime once the runtime interface has been all implemented.
func
(
kl
*
Kubelet
)
findContainer
(
podFullName
string
,
podUID
types
.
UID
,
containerName
string
)
(
*
kubecontainer
.
Container
,
error
)
{
func
(
kl
*
Kubelet
)
findContainer
(
podFullName
string
,
podUID
types
.
UID
,
containerName
string
)
(
*
kubecontainer
.
Container
,
error
)
{
pods
,
err
:=
kl
.
container
Manager
.
GetPods
(
false
)
pods
,
err
:=
kl
.
container
Runtime
.
GetPods
(
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -1765,7 +1755,7 @@ func (kl *Kubelet) PortForward(podFullName string, podUID types.UID, port uint16
...
@@ -1765,7 +1755,7 @@ func (kl *Kubelet) PortForward(podFullName string, podUID types.UID, port uint16
return
fmt
.
Errorf
(
"no runner specified."
)
return
fmt
.
Errorf
(
"no runner specified."
)
}
}
pods
,
err
:=
kl
.
container
Manager
.
GetPods
(
false
)
pods
,
err
:=
kl
.
container
Runtime
.
GetPods
(
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
...
pkg/kubelet/kubelet_test.go
View file @
2ad933e1
This diff is collapsed.
Click to expand it.
pkg/kubelet/pod_workers_test.go
View file @
2ad933e1
...
@@ -26,7 +26,6 @@ import (
...
@@ -26,7 +26,6 @@ import (
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
kubeletProber
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/prober"
"github.com/GoogleCloudPlatform/kubernetes/pkg/types"
"github.com/GoogleCloudPlatform/kubernetes/pkg/types"
)
)
...
@@ -43,7 +42,7 @@ func createPodWorkers() (*podWorkers, map[types.UID][]string) {
...
@@ -43,7 +42,7 @@ func createPodWorkers() (*podWorkers, map[types.UID][]string) {
fakeDocker
:=
&
dockertools
.
FakeDockerClient
{}
fakeDocker
:=
&
dockertools
.
FakeDockerClient
{}
fakeRecorder
:=
&
record
.
FakeRecorder
{}
fakeRecorder
:=
&
record
.
FakeRecorder
{}
np
,
_
:=
network
.
InitNetworkPlugin
([]
network
.
NetworkPlugin
{},
""
,
network
.
NewFakeHost
(
nil
))
np
,
_
:=
network
.
InitNetworkPlugin
([]
network
.
NetworkPlugin
{},
""
,
network
.
NewFakeHost
(
nil
))
dockerManager
:=
dockertools
.
New
DockerManager
(
fakeDocker
,
fakeRecorder
,
nil
,
nil
,
dockertools
.
PodInfraContainerImage
,
0
,
0
,
""
,
kubecontainer
.
FakeOS
{},
np
,
&
kubeletProber
.
FakeProber
{}
,
nil
,
nil
,
newKubeletRuntimeHooks
(
fakeRecorder
))
dockerManager
:=
dockertools
.
New
FakeDockerManager
(
fakeDocker
,
fakeRecorder
,
nil
,
nil
,
dockertools
.
PodInfraContainerImage
,
0
,
0
,
""
,
kubecontainer
.
FakeOS
{},
np
,
nil
,
nil
,
newKubeletRuntimeHooks
(
fakeRecorder
))
fakeRuntimeCache
:=
kubecontainer
.
NewFakeRuntimeCache
(
dockerManager
)
fakeRuntimeCache
:=
kubecontainer
.
NewFakeRuntimeCache
(
dockerManager
)
lock
:=
sync
.
Mutex
{}
lock
:=
sync
.
Mutex
{}
...
...
pkg/kubelet/runonce.go
View file @
2ad933e1
...
@@ -88,7 +88,7 @@ func (kl *Kubelet) runPod(pod *api.Pod, retryDelay time.Duration) error {
...
@@ -88,7 +88,7 @@ func (kl *Kubelet) runPod(pod *api.Pod, retryDelay time.Duration) error {
delay
:=
retryDelay
delay
:=
retryDelay
retry
:=
0
retry
:=
0
for
{
for
{
pods
,
err
:=
kl
.
container
Manager
.
GetPods
(
false
)
pods
,
err
:=
kl
.
container
Runtime
.
GetPods
(
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to get kubelet pods: %v"
,
err
)
return
fmt
.
Errorf
(
"failed to get kubelet pods: %v"
,
err
)
}
}
...
@@ -120,7 +120,7 @@ func (kl *Kubelet) runPod(pod *api.Pod, retryDelay time.Duration) error {
...
@@ -120,7 +120,7 @@ func (kl *Kubelet) runPod(pod *api.Pod, retryDelay time.Duration) error {
// isPodRunning returns true if all containers of a manifest are running.
// isPodRunning returns true if all containers of a manifest are running.
func
(
kl
*
Kubelet
)
isPodRunning
(
pod
*
api
.
Pod
,
runningPod
container
.
Pod
)
(
bool
,
error
)
{
func
(
kl
*
Kubelet
)
isPodRunning
(
pod
*
api
.
Pod
,
runningPod
container
.
Pod
)
(
bool
,
error
)
{
status
,
err
:=
kl
.
container
Manager
.
GetPodStatus
(
pod
)
status
,
err
:=
kl
.
container
Runtime
.
GetPodStatus
(
pod
)
if
err
!=
nil
{
if
err
!=
nil
{
glog
.
Infof
(
"Failed to get the status of pod %q: %v"
,
kubecontainer
.
GetPodFullName
(
pod
),
err
)
glog
.
Infof
(
"Failed to get the status of pod %q: %v"
,
kubecontainer
.
GetPodFullName
(
pod
),
err
)
return
false
,
err
return
false
,
err
...
...
pkg/kubelet/runonce_test.go
View file @
2ad933e1
...
@@ -28,7 +28,6 @@ import (
...
@@ -28,7 +28,6 @@ import (
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
kubecontainer
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/network"
kubeletProber
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/prober"
docker
"github.com/fsouza/go-dockerclient"
docker
"github.com/fsouza/go-dockerclient"
cadvisorApi
"github.com/google/cadvisor/info/v1"
cadvisorApi
"github.com/google/cadvisor/info/v1"
)
)
...
@@ -149,7 +148,7 @@ func TestRunOnce(t *testing.T) {
...
@@ -149,7 +148,7 @@ func TestRunOnce(t *testing.T) {
t
:
t
,
t
:
t
,
}
}
kb
.
container
Manager
=
dockertools
.
New
DockerManager
(
kb
.
container
Runtime
=
dockertools
.
NewFake
DockerManager
(
kb
.
dockerClient
,
kb
.
dockerClient
,
kb
.
recorder
,
kb
.
recorder
,
kb
.
readinessManager
,
kb
.
readinessManager
,
...
@@ -160,11 +159,9 @@ func TestRunOnce(t *testing.T) {
...
@@ -160,11 +159,9 @@ func TestRunOnce(t *testing.T) {
""
,
""
,
kubecontainer
.
FakeOS
{},
kubecontainer
.
FakeOS
{},
kb
.
networkPlugin
,
kb
.
networkPlugin
,
&
kubeletProber
.
FakeProber
{},
kb
,
kb
,
nil
,
nil
,
newKubeletRuntimeHooks
(
kb
.
recorder
))
newKubeletRuntimeHooks
(
kb
.
recorder
))
kb
.
containerManager
.
Puller
=
&
dockertools
.
FakeDockerPuller
{}
pods
:=
[]
*
api
.
Pod
{
pods
:=
[]
*
api
.
Pod
{
{
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment