批量删除 Kubernetes PVC ebs 卷
Delete Kubernetes PVC ebs volumes in batch
我的 kubernetes aws eks 集群中有超过 4000 个 pvc。
- 从那 4000 多个 pvc 中我必须删除将近 3999 个 pvc
现在不再使用命令:
kubetcl delete pvc pvc-data-name
并单独删除每个 pvc,这可能会花费我很长时间。我想找到一种方法来批量或一起删除它们。
你可以试试这个。
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
}
用 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
我的 kubernetes aws eks 集群中有超过 4000 个 pvc。
- 从那 4000 多个 pvc 中我必须删除将近 3999 个 pvc
现在不再使用命令:
kubetcl delete pvc pvc-data-name
并单独删除每个 pvc,这可能会花费我很长时间。我想找到一种方法来批量或一起删除它们。
你可以试试这个。
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
}
用 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