mirror of https://github.com/k3s-io/k3s
Revert "Remove hack in kubectl delete that handles DaemonSet deletion"
This reverts commit 10a12ddb34
.
pull/8/head
parent
296bc64924
commit
fedd5d6206
|
@ -105,6 +105,7 @@ go_library(
|
||||||
"//vendor/github.com/renstrom/dedent:go_default_library",
|
"//vendor/github.com/renstrom/dedent:go_default_library",
|
||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/github.com/spf13/pflag:go_default_library",
|
"//vendor/github.com/spf13/pflag:go_default_library",
|
||||||
|
"//vendor/k8s.io/api/apps/v1:go_default_library",
|
||||||
"//vendor/k8s.io/api/autoscaling/v1:go_default_library",
|
"//vendor/k8s.io/api/autoscaling/v1:go_default_library",
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
"//vendor/k8s.io/api/policy/v1beta1:go_default_library",
|
"//vendor/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
|
@ -126,6 +127,7 @@ go_library(
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
|
||||||
|
|
|
@ -24,9 +24,15 @@ import (
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"k8s.io/apimachinery/pkg/util/uuid"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
|
@ -285,6 +291,16 @@ func (o *DeleteOptions) DeleteResult(r *resource.Result) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DeleteOptions) deleteResource(info *resource.Info, deleteOptions *metav1.DeleteOptions) error {
|
func (o *DeleteOptions) deleteResource(info *resource.Info, deleteOptions *metav1.DeleteOptions) error {
|
||||||
|
// TODO: this should be removed as soon as DaemonSet controller properly handles object deletion
|
||||||
|
// see https://github.com/kubernetes/kubernetes/issues/64313 for details
|
||||||
|
mapping := info.ResourceMapping()
|
||||||
|
if mapping.Resource.GroupResource() == (schema.GroupResource{Group: "extensions", Resource: "daemonsets"}) ||
|
||||||
|
mapping.Resource.GroupResource() == (schema.GroupResource{Group: "apps", Resource: "daemonsets"}) {
|
||||||
|
if err := updateDaemonSet(info.Namespace, info.Name, o.DynamicClient); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := resource.NewHelper(info.Client, info.Mapping).DeleteWithOptions(info.Namespace, info.Name, deleteOptions); err != nil {
|
if err := resource.NewHelper(info.Client, info.Mapping).DeleteWithOptions(info.Namespace, info.Name, deleteOptions); err != nil {
|
||||||
return cmdutil.AddSourceToErr("deleting", info.Source, err)
|
return cmdutil.AddSourceToErr("deleting", info.Source, err)
|
||||||
}
|
}
|
||||||
|
@ -293,6 +309,53 @@ func (o *DeleteOptions) deleteResource(info *resource.Info, deleteOptions *metav
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateDaemonSet(namespace, name string, dynamicClient dynamic.Interface) error {
|
||||||
|
dsClient := dynamicClient.Resource(schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "daemonsets"}).Namespace(namespace)
|
||||||
|
obj, err := dsClient.Get(name, metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ds := &appsv1.DaemonSet{}
|
||||||
|
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, ds); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// We set the nodeSelector to a random label. This label is nearly guaranteed
|
||||||
|
// to not be set on any node so the DameonSetController will start deleting
|
||||||
|
// daemon pods. Once it's done deleting the daemon pods, it's safe to delete
|
||||||
|
// the DaemonSet.
|
||||||
|
ds.Spec.Template.Spec.NodeSelector = map[string]string{
|
||||||
|
string(uuid.NewUUID()): string(uuid.NewUUID()),
|
||||||
|
}
|
||||||
|
// force update to avoid version conflict
|
||||||
|
ds.ResourceVersion = ""
|
||||||
|
|
||||||
|
out, err := runtime.DefaultUnstructuredConverter.ToUnstructured(ds)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err = dsClient.Update(&unstructured.Unstructured{Object: out}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the daemon set controller to kill all the daemon pods.
|
||||||
|
if err := wait.Poll(1*time.Second, 5*time.Minute, func() (bool, error) {
|
||||||
|
updatedObj, err := dsClient.Get(name, metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
updatedDS := &appsv1.DaemonSet{}
|
||||||
|
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(updatedObj.Object, ds); err != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return updatedDS.Status.CurrentNumberScheduled+updatedDS.Status.NumberMisscheduled == 0, nil
|
||||||
|
}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// deletion printing is special because we do not have an object to print.
|
// deletion printing is special because we do not have an object to print.
|
||||||
// This mirrors name printer behavior
|
// This mirrors name printer behavior
|
||||||
func (o *DeleteOptions) PrintObj(info *resource.Info) {
|
func (o *DeleteOptions) PrintObj(info *resource.Info) {
|
||||||
|
|
Loading…
Reference in New Issue