simplify DaemonReaper by using NodeSelector

This commit is contained in:
Mike Danese 2015-10-08 15:52:11 -07:00
parent 219294623e
commit 6fe7edc5ea
2 changed files with 8 additions and 23 deletions

View File

@ -97,7 +97,7 @@ The DaemonSet supports standard API features:
- get (e.g. kubectl get daemonsets) - get (e.g. kubectl get daemonsets)
- describe - describe
- Modifiers - Modifiers
- delete (if --cascade=true, then first the client turns down all the pods controlled by the DaemonSet (by setting the nodeName to a non-existant name); then it deletes the DaemonSet; then it deletes the pods) - delete (if --cascade=true, then first the client turns down all the pods controlled by the DaemonSet (by setting the nodeSelector to a uuid pair that is unlikely to be set on any node); then it deletes the DaemonSet; then it deletes the pods)
- label - label
- annotate - annotate
- update operations like patch and replace (only allowed to selector and to nodeSelector and nodeName of pod template) - update operations like patch and replace (only allowed to selector and to nodeSelector and nodeName of pod template)

View File

@ -21,12 +21,11 @@ import (
"strings" "strings"
"time" "time"
fuzz "github.com/google/gofuzz"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
) )
@ -188,27 +187,13 @@ func (reaper *DaemonSetReaper) Stop(namespace, name string, timeout time.Duratio
return "", err return "", err
} }
// Update the daemon set to select for a non-existent NodeName. // We set the nodeSelector to a random label. This label is nearly guaranteed
// The daemon set controller will then kill all the daemon pods corresponding to daemon set. // to not be set on any node so the DameonSetController will start deleting
nodes, err := reaper.Nodes().List(labels.Everything(), fields.Everything()) // daemon pods. Once it's done deleting the daemon pods, it's safe to delete
if err != nil { // the DaemonSet.
return "", err ds.Spec.Template.Spec.NodeSelector = map[string]string{
string(util.NewUUID()): string(util.NewUUID()),
} }
var fuzzer = fuzz.New()
var nameExists bool
var nodeName string
fuzzer.Fuzz(&nodeName)
nameExists = false
for _, node := range nodes.Items {
nameExists = nameExists || node.Name == nodeName
}
if nameExists {
// Probability of reaching here is extremely low, most likely indicates a programming bug/library error.
return "", fmt.Errorf("Name collision generating an unused node name. Please retry this operation.")
}
ds.Spec.Template.Spec.NodeName = nodeName
// force update to avoid version conflict // force update to avoid version conflict
ds.ResourceVersion = "" ds.ResourceVersion = ""