From adb84cab8d3b7ed7f4f856be7eef858b5c8f5c24 Mon Sep 17 00:00:00 2001 From: Avesh Agarwal Date: Thu, 3 Aug 2017 02:07:50 -0400 Subject: [PATCH] Update duplicate pods removal strategy. --- cmd/rescheduler/app/server.go | 9 ++++++++- pkg/rescheduler/evictions/evictions.go | 10 ++++++---- pkg/rescheduler/evictions/utils/utils.go | 4 ++-- pkg/rescheduler/strategies/duplicates.go | 20 +++++++++++++++----- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/cmd/rescheduler/app/server.go b/cmd/rescheduler/app/server.go index 2faadb5cb..beb12a35d 100644 --- a/cmd/rescheduler/app/server.go +++ b/cmd/rescheduler/app/server.go @@ -24,6 +24,7 @@ import ( "github.com/aveshagarwal/rescheduler/pkg/rescheduler/client" //"github.com/aveshagarwal/rescheduler/pkg/rescheduler/node" //"github.com/aveshagarwal/rescheduler/pkg/rescheduler/pod" + eutils "github.com/aveshagarwal/rescheduler/pkg/rescheduler/evictions/utils" "github.com/aveshagarwal/rescheduler/pkg/rescheduler/strategies" "github.com/spf13/cobra" @@ -56,7 +57,13 @@ func Run(rs *options.ReschedulerServer) error { return err } rs.Client = rsclient - strategies.RemoveDuplicatePods(rs.Client) + + policyGroupVersion, err := eutils.SupportEviction(rs.Client) + if err != nil || len(policyGroupVersion) == 0 { + return err + } + + strategies.RemoveDuplicatePods(rs.Client, policyGroupVersion) /*stopChannel := make(chan struct{}) nodes, err := node.ReadyNodes(rs.Client, stopChannel) if err != nil { diff --git a/pkg/rescheduler/evictions/evictions.go b/pkg/rescheduler/evictions/evictions.go index 288466440..0bbaed1ec 100644 --- a/pkg/rescheduler/evictions/evictions.go +++ b/pkg/rescheduler/evictions/evictions.go @@ -17,10 +17,12 @@ limitations under the License. package evictions import ( + "fmt" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/apis/policy" + policy "k8s.io/kubernetes/pkg/apis/policy/v1beta1" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" eutils "github.com/aveshagarwal/rescheduler/pkg/rescheduler/evictions/utils" @@ -45,9 +47,9 @@ func EvictPod(client clientset.Interface, pod *v1.Pod, policyGroupVersion string if err == nil { return true, nil } else if apierrors.IsTooManyRequests(err) { - return false, fmt.Errorf("error when evicting pod %q: %v", pod.Name, err) - } else if !apierrors.IsNotFound(err) { - return true, fmt.Errorf("error when evicting pod %q: %v", pod.Name, err) + return false, fmt.Errorf("error when evicting pod (ignoring) %q: %v", pod.Name, err) + } else if apierrors.IsNotFound(err) { + return true, fmt.Errorf("pod not found when evicting %q: %v", pod.Name, err) } else { return false, err } diff --git a/pkg/rescheduler/evictions/utils/utils.go b/pkg/rescheduler/evictions/utils/utils.go index 738fd3f50..fc1966239 100644 --- a/pkg/rescheduler/evictions/utils/utils.go +++ b/pkg/rescheduler/evictions/utils/utils.go @@ -27,8 +27,8 @@ const ( // SupportEviction uses Discovery API to find out if the server support eviction subresource // If support, it will return its groupVersion; Otherwise, it will return "" -func SupportEviction(clientset clientset.Interface) (string, error) { - discoveryClient := clientset.Discovery() +func SupportEviction(client clientset.Interface) (string, error) { + discoveryClient := client.Discovery() groupList, err := discoveryClient.ServerGroups() if err != nil { return "", err diff --git a/pkg/rescheduler/strategies/duplicates.go b/pkg/rescheduler/strategies/duplicates.go index d1da7558c..bad1a7e67 100644 --- a/pkg/rescheduler/strategies/duplicates.go +++ b/pkg/rescheduler/strategies/duplicates.go @@ -23,6 +23,7 @@ import ( "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" + "github.com/aveshagarwal/rescheduler/pkg/rescheduler/evictions" "github.com/aveshagarwal/rescheduler/pkg/rescheduler/node" podutil "github.com/aveshagarwal/rescheduler/pkg/rescheduler/pod" ) @@ -30,7 +31,7 @@ import ( //type creator string type DuplicatePodsMap map[string][]*v1.Pod -func RemoveDuplicatePods(client clientset.Interface) error { +func RemoveDuplicatePods(client clientset.Interface, policyGroupVersion string) error { stopChannel := make(chan struct{}) nodes, err := node.ReadyNodes(client, stopChannel) if err != nil { @@ -39,10 +40,19 @@ func RemoveDuplicatePods(client clientset.Interface) error { for _, node := range nodes { fmt.Printf("\nProcessing node: %#v\n", node.Name) dpm := RemoveDuplicatePodsOnANode(client, node) - for i, j := range dpm { - fmt.Printf("%#v\n", i) - for _, k := range j { - fmt.Printf("Duplicate pod %#v\n", k.Name) + for creator, pods := range dpm { + if len(pods) > 1 { + fmt.Printf("%#v\n", creator) + // i = 0 does not evict the first pod + for i := 1; i < len(pods); i++ { + //fmt.Printf("Removing duplicate pod %#v\n", k.Name) + success, err := evictions.EvictPod(client, pods[i], policyGroupVersion) + if !success { + fmt.Printf("Error when evicting pod: %#v (%#v)\n", pods[i].Name, err) + } else { + fmt.Printf("Evicted pod: %#v (%#v)\n", pods[i].Name, err) + } + } } } }