in cmd/evict/main.go [35:139]
func main() {
var kubeconfig, pod, label, namespace, node *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"),
"(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
pod = flag.String("pod", "", "pod to evict")
label = flag.String("label", "", "pod to evict")
node = flag.String("node", "", "evict from node")
namespace = flag.String("ns", "test", "namespace of pod to evict")
flag.Parse()
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
defer cancel()
// use the current context in kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
config.QPS = 100
config.Burst = 500
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
var podsmeta []v1.ObjectMeta
if *label != "" {
pods, err := clientset.CoreV1().Pods(*namespace).List(ctx, v1.ListOptions{LabelSelector: *label, Limit: 1})
if err != nil {
panic(err.Error())
}
for _, p := range pods.Items {
podsmeta = append(podsmeta, p.ObjectMeta)
}
} else if *node != "" {
namespaces, err := clientset.CoreV1().Namespaces().List(ctx, v1.ListOptions{})
if err != nil {
panic(err.Error())
}
for _, ns := range namespaces.Items {
pods, err := clientset.CoreV1().Pods(ns.Name).List(ctx, v1.ListOptions{FieldSelector: "spec.nodeName=" + *node})
if err != nil {
panic(err.Error())
}
log.Printf("found %d pods on node %s", len(pods.Items), *node)
for _, p := range pods.Items {
podsmeta = append(podsmeta, p.ObjectMeta)
}
}
} else if *pod == "" {
//get all the pods
pods, err := clientset.CoreV1().Pods(*namespace).List(ctx, v1.ListOptions{})
if err != nil {
panic(err.Error())
}
for _, p := range pods.Items {
podsmeta = append(podsmeta, p.ObjectMeta)
}
} else {
podsmeta = append(podsmeta, v1.ObjectMeta{
Name: *pod,
Namespace: *namespace,
})
}
var wg sync.WaitGroup
for _, meta := range podsmeta {
if strings.HasPrefix(meta.Name, "konnectivity") {
log.Println("skipping konnectivity pod")
continue
}
log.Printf("evicting %s/%s", meta.Namespace, meta.Name)
wg.Add(1)
go func() {
defer wg.Done()
for ctx.Err() == nil {
err = clientset.PolicyV1().Evictions(meta.Namespace).Evict(ctx, &policy.Eviction{
ObjectMeta: meta,
})
if err == nil {
log.Printf("evicted %s/%s", meta.Namespace, meta.Name)
break
}
if !errors.IsTooManyRequests(err) {
log.Fatalf("failed to evict %s/%s: %v", meta.Namespace, meta.Name, err)
break
}
select {
case <-time.After(time.Second):
case <-ctx.Done():
}
}
}()
}
wg.Wait()
}