【问题标题】:Delete Kubernetes PVC ebs volumes in batch批量删除 Kubernetes PVC ebs 卷
【发布时间】:2021-01-29 19:50:41
【问题描述】:

我的 kubernetes aws eks 集群中有超过 4000 个 pvc。

  • 从那 4000+ pvc 中,我必须删除将近 3999 pvc

现在不再使用命令:

kubetcl delete pvc pvc-data-name

并单独删除每个 pvc,这可能会花费我很长时间。我想找到一种方法来批量删除它们或一起删除它们。

【问题讨论】:

  • kubectl delete pvc --field-selector metadata.name!=<name_to_ignore>。您可以在更改为 kubectl delete 之前使用 kubectl get 进行测试。
  • 我亲自试用了 python kubernetes 客户端,它在删除大量对象时比 kubectl 快 10 倍
  • @VasiliAngapov 你是怎么做到的?
  • @jordanm 谢谢.. 我会试试看!但是,只是为了澄清一下:我不必像 30 pvc 这样删除,所以在命令中的“metadata.name!=”中,我要添加所有这 30 个的名称吗?
  • @jordanm 例如.. 就像我有 5 pvc data1, data2, data3, data4, data5 ... 如何在“metadata.name!="??

标签: kubernetes amazon-eks kubernetes-pvc


【解决方案1】:

你可以试试这个。

kubectl delete pvc --field-selector metadata.name!=<name-dont-want-to-delete-1>, metadata.name!=<name-dont-want-to-delete-2>, metadata.name!=<name-dont-want-to-delete-3>

或者, 您也可以使用go-client 来执行此操作。要使用 go 客户端执行此操作,请参阅文档 Ref

我在每个pvc 中添加了一个我不想删除的标签。

  labels:
    test: test-1

import (
   "context"
   "fmt"
   metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

   "k8s.io/client-go/kubernetes"
   "k8s.io/client-go/util/homedir"
   "kmodules.xyz/client-go/tools/clientcmd"
   "log"
   "path/filepath"
)

func testFunc() ( error) {
   masterURL := ""

   kubeconfigPath := filepath.Join(homedir.HomeDir(), ".kube", "config")



   config, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfigPath)
   if err != nil {
       log.Fatalf("Could not get Kubernetes config: %s", err)
   }

   kc := kubernetes.NewForConfigOrDie(config)
   labelSelector := &metav1.LabelSelector{
       MatchExpressions: []metav1.LabelSelectorRequirement{
           {
               "test",
               metav1.LabelSelectorOpNotIn,
               []string{
                   "test-0",
                   "test-1",
               },
           },
       },
   }
   err = kc.CoreV1().PersistentVolumeClaims("default").DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{
       LabelSelector: metav1.FormatLabelSelector(labelSelector),
   })
   fmt.Println(err)
   
   return  nil
}


【讨论】:

  • Emon 谢谢你.. 我会试试看!但是,只是为了澄清一下:我不必像大约 30 pvc 这样删除,所以在命令中的“metadata.name!=”中,我是否添加了所有这些的名称30?
  • Emon 例如,如果我有 5 个 pvc data1、data2、data3、data4、data5 ... 如何在“metadata.name!="??
  • @Myra 要保留多个 pvc,您最好尝试第二个。
  • @Myra 我已经更新了我的 ans 。你可以试试kubectl 吗?
  • Emon 当然..但我面临另一个问题..在我的终端上输入命令时(它有 40 pvc 我不想删除)它没有粘贴完整的命令?我该如何解决这个问题
【解决方案2】:

用 grep 和 xargs 试试这个

kubectl get pvc | grep -v <name-to-not-include> | xargs kubectl delete pvc --grace-period=0 --force

更新:

对于多种模式:

kubectl get pvc | grep -v 'pattern1\|pattern2' | xargs kubectl delete pvc --grace-period=0 --force

【讨论】:

  • 我想在“”中包含多个 pvc.. 我该怎么做?
  • 对于多个模式 'pattern1\|pattern2',不要忘记转义 |与 \
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 2018-12-23
  • 2021-03-19
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2021-12-11
  • 2020-02-13
相关资源
最近更新 更多