本文首发于公众号【个人小碗汤】扫描文末二维码关注,一块儿交流学习
在云平台开发、中间件容器化时,常常会遇到批量删除k8s资源对象的需求,下面记录一下kubectl和golang发送删除pvc、pv、pod请求的例子,便于后续学习查阅前端
根据label批量删除pod:java
kubectl delete pod -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"
根据label批量删除pvc:python
kubectl delete pvc -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"
根据label批量删除pv:golang
kubectl delete pv -l "harmonycloud.cn/statefulset=redis-ll-1010-a"
根据label批量删除pvc、pod、pv面试
注意:启动参数中加入如下参数:
redis
--kubeconfig=/root/.kube/config --v=5
package operator import ( "flag" extensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apiserver/pkg/util/logs" clientset "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/klog" "os" "testing" ) type OperatorManagerServer struct { Master string Kubeconfig string } func NewOMServer() *OperatorManagerServer { s := OperatorManagerServer{} return &s } var s *OperatorManagerServer func init() { s = NewOMServer() flag.StringVar(&s.Master, "master", s.Master, "The address of the Kubernetes API server (overrides any value in kubeconfig)") flag.StringVar(&s.Kubeconfig, "kubeconfig", s.Kubeconfig, "Path to kubeconfig file with authorization and master location information.") //初始化klog等flag logs.InitLogs() flag.Parse() } func Test_DeleteCollection(t *testing.T) { if err := Run(s); err != nil { t.Fatalf("%v\n", err) os.Exit(1) } } func Run(s *OperatorManagerServer) error { var ( generalLabelKey = "harmonycloud.cn/statefulset" redisClusterName = "redis-ll-1010" redisClusterNamespace = "kube-system" ) kubeClient, _, _, err := createClients(s) if err != nil { return err } //根据label批量删除pod labelPod := labels.SelectorFromSet(labels.Set(map[string]string{generalLabelKey: redisClusterName})) listPodOptions := metav1.ListOptions{ LabelSelector: labelPod.String(), } err = kubeClient.CoreV1().Pods(redisClusterNamespace).DeleteCollection(&metav1.DeleteOptions{}, listPodOptions) if err != nil { if !errors.IsNotFound(err) { klog.Errorf("Drop RedisCluster: %v/%v pod error: %v", redisClusterNamespace, redisClusterName, err) return err } } //根据label批量删除pvc labelPvc := labels.SelectorFromSet(labels.Set(map[string]string{"app": redisClusterName})) listPvcOptions := metav1.ListOptions{ LabelSelector: labelPvc.String(), } err = kubeClient.CoreV1().PersistentVolumeClaims(redisClusterNamespace).DeleteCollection(&metav1.DeleteOptions{}, listPvcOptions) if err != nil { if !errors.IsNotFound(err) { klog.Errorf("Drop RedisCluster: %v/%v pvc error: %v", redisClusterNamespace, redisClusterName, err) return err } } //若是pv没有删除掉,则删除 labelPv := labels.SelectorFromSet(labels.Set(map[string]string{generalLabelKey: redisClusterName})) listPvOptions := metav1.ListOptions{ LabelSelector: labelPv.String(), } err = kubeClient.CoreV1().PersistentVolumes().DeleteCollection(&metav1.DeleteOptions{}, listPvOptions) if err != nil { if !errors.IsNotFound(err) { klog.Errorf("Drop RedisCluster: %v/%v pv error: %v", redisClusterNamespace, redisClusterName, err) return err } } return nil } //根据kubeconfig文件建立客户端 func createClients(s *OperatorManagerServer) (*clientset.Clientset, *extensionsclient.Clientset, *restclient.Config, error) { kubeconfig, err := clientcmd.BuildConfigFromFlags(s.Master, s.Kubeconfig) if err != nil { return nil, nil, nil, err } kubeconfig.QPS = 100 kubeconfig.Burst = 100 kubeClient, err := clientset.NewForConfig(restclient.AddUserAgent(kubeconfig, "operator-manager")) if err != nil { klog.Fatalf("Invalid API configuration: %v", err) } extensionClient, err := extensionsclient.NewForConfig(restclient.AddUserAgent(kubeconfig, "operator-manager")) if err != nil { klog.Fatalf("Invalid API configuration: %v", err) } return kubeClient, extensionClient, kubeconfig, nil }
client-go中提供的spring
Delete(name string, options *metav1.DeleteOptions) error DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error
k8s官方API文档:shell
https://kubernetes.io/docs/re...编程
本公众号免费提供csdn下载服务,海量IT学习资源,若是你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时咱们组建了一个技术交流群,里面有不少大佬,会不定时分享技术文章,若是你想来一块儿学习提升,能够公众号后台回复【2】,免费邀请加技术交流群互相学习提升,会不按期分享编程IT相关资源。segmentfault
扫码关注,精彩内容第一时间推给你