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
fa21ef11
Commit
fa21ef11
authored
Mar 08, 2016
by
k8s-merge-robot
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #22708 from mikedanese/revert-revert
Auto commit by PR queue bot
parents
dba955e1
d8eaed91
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
71 additions
and
14 deletions
+71
-14
nodecontroller.go
pkg/controller/node/nodecontroller.go
+25
-12
nodecontroller_test.go
pkg/controller/node/nodecontroller_test.go
+42
-0
garbage_collector.go
test/e2e/garbage_collector.go
+4
-2
No files found.
pkg/controller/node/nodecontroller.go
View file @
fa21ef11
...
...
@@ -37,6 +37,7 @@ import (
"k8s.io/kubernetes/pkg/controller/framework"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/kubelet/util/format"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util"
...
...
@@ -284,6 +285,8 @@ func (nc *NodeController) Run(period time.Duration) {
return
false
,
remaining
})
},
nodeEvictionPeriod
,
wait
.
NeverStop
)
go
wait
.
Until
(
nc
.
cleanupOrphanedPods
,
30
*
time
.
Second
,
wait
.
NeverStop
)
}
// Generates num pod CIDRs that could be assigned to nodes.
...
...
@@ -368,6 +371,28 @@ func (nc *NodeController) maybeDeleteTerminatingPod(obj interface{}) {
}
}
// cleanupOrphanedPods deletes pods that are bound to nodes that don't
// exist.
func
(
nc
*
NodeController
)
cleanupOrphanedPods
()
{
pods
,
err
:=
nc
.
podStore
.
List
(
labels
.
Everything
())
if
err
!=
nil
{
utilruntime
.
HandleError
(
err
)
return
}
for
_
,
pod
:=
range
pods
{
if
pod
.
Spec
.
NodeName
==
""
{
continue
}
if
_
,
exists
,
_
:=
nc
.
nodeStore
.
Store
.
GetByKey
(
pod
.
Spec
.
NodeName
);
exists
{
continue
}
if
err
:=
nc
.
forcefullyDeletePod
(
pod
);
err
!=
nil
{
utilruntime
.
HandleError
(
err
)
}
}
}
func
forcefullyDeletePod
(
c
clientset
.
Interface
,
pod
*
api
.
Pod
)
error
{
var
zero
int64
err
:=
c
.
Core
()
.
Pods
(
pod
.
Namespace
)
.
Delete
(
pod
.
Name
,
&
api
.
DeleteOptions
{
GracePeriodSeconds
:
&
zero
})
...
...
@@ -759,18 +784,6 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
return
gracePeriod
,
lastReadyCondition
,
readyCondition
,
err
}
// returns true if the provided node still has pods scheduled to it, or an error if
// the server could not be contacted.
func
(
nc
*
NodeController
)
hasPods
(
nodeName
string
)
(
bool
,
error
)
{
selector
:=
fields
.
OneTermEqualSelector
(
api
.
PodHostField
,
nodeName
)
options
:=
api
.
ListOptions
{
FieldSelector
:
selector
}
pods
,
err
:=
nc
.
kubeClient
.
Core
()
.
Pods
(
api
.
NamespaceAll
)
.
List
(
options
)
if
err
!=
nil
{
return
false
,
err
}
return
len
(
pods
.
Items
)
>
0
,
nil
}
// evictPods queues an eviction for the provided node name, and returns false if the node is already
// queued for eviction.
func
(
nc
*
NodeController
)
evictPods
(
nodeName
string
)
bool
{
...
...
pkg/controller/node/nodecontroller_test.go
View file @
fa21ef11
...
...
@@ -1116,6 +1116,48 @@ func TestCheckPod(t *testing.T) {
}
}
func
TestCleanupOrphanedPods
(
t
*
testing
.
T
)
{
newPod
:=
func
(
name
,
node
string
)
api
.
Pod
{
return
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
name
,
},
Spec
:
api
.
PodSpec
{
NodeName
:
node
,
},
}
}
pods
:=
[]
api
.
Pod
{
newPod
(
"a"
,
"foo"
),
newPod
(
"b"
,
"bar"
),
newPod
(
"c"
,
"gone"
),
}
nc
:=
NewNodeController
(
nil
,
nil
,
0
,
nil
,
nil
,
0
,
0
,
0
,
nil
,
false
)
nc
.
nodeStore
.
Store
.
Add
(
newNode
(
"foo"
))
nc
.
nodeStore
.
Store
.
Add
(
newNode
(
"bar"
))
for
_
,
pod
:=
range
pods
{
p
:=
pod
nc
.
podStore
.
Store
.
Add
(
&
p
)
}
var
deleteCalls
int
var
deletedPodName
string
nc
.
forcefullyDeletePod
=
func
(
p
*
api
.
Pod
)
error
{
deleteCalls
++
deletedPodName
=
p
.
ObjectMeta
.
Name
return
nil
}
nc
.
cleanupOrphanedPods
()
if
deleteCalls
!=
1
{
t
.
Fatalf
(
"expected one delete, got: %v"
,
deleteCalls
)
}
if
deletedPodName
!=
"c"
{
t
.
Fatalf
(
"expected deleted pod name to be 'c', but got: %q"
,
deletedPodName
)
}
}
func
newNode
(
name
string
)
*
api
.
Node
{
return
&
api
.
Node
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
name
},
...
...
test/e2e/garbage_collector.go
View file @
fa21ef11
...
...
@@ -61,7 +61,7 @@ var _ = Describe("Garbage collector [Slow]", func() {
gcThreshold
:=
100
By
(
fmt
.
Sprintf
(
"Waiting for gc controller to gc all but %d pods"
,
gcThreshold
))
pollErr
:=
wait
.
Poll
(
30
*
time
.
Second
,
timeout
,
func
()
(
bool
,
error
)
{
pollErr
:=
wait
.
Poll
(
1
*
time
.
Minute
,
timeout
,
func
()
(
bool
,
error
)
{
pods
,
err
=
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
List
(
api
.
ListOptions
{})
if
err
!=
nil
{
Logf
(
"Failed to list pod %v"
,
err
)
...
...
@@ -84,9 +84,11 @@ func createTerminatingPod(f *Framework) (*api.Pod, error) {
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
string
(
uuid
),
Annotations
:
map
[
string
]
string
{
"scheduler.alpha.kubernetes.io/name"
:
"please don't schedule my pods"
,
},
},
Spec
:
api
.
PodSpec
{
NodeName
:
"nonexistant-node"
,
Containers
:
[]
api
.
Container
{
{
Name
:
string
(
uuid
),
...
...
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