kubernetes版本:1.13.2

在云平台开发、中间件容器化时,经常会遇到批量删除k8s资源对象的需求,下面记录一下kubectl和golang发送删除pvc、pv、pod请求的例子,便于后续学习查阅

kubectl发送删除请求

根据label批量删除pod:

  1. kubectl delete pod -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"

如何批量删除k8s资源对象_k8s

根据label批量删除pvc:

  1. kubectl delete pvc -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"

如何批量删除k8s资源对象_k8s_02

根据label批量删除pv:

  1. kubectl delete pv -l "harmonycloud.cn/statefulset=redis-ll-1010-a"

如何批量删除k8s资源对象_k8s_03

golang发送删除请求

根据label批量删除pvc、pod、pv

注意:启动参数中加入以下参数:

  1. --kubeconfig=/root/.kube/config --v=5

  1. package operator

  2.  

  3. import (

  4. "flag"

  5. extensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"

  6. "k8s.io/apimachinery/pkg/api/errors"

  7. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

  8. "k8s.io/apimachinery/pkg/labels"

  9. "k8s.io/apiserver/pkg/util/logs"

  10. clientset "k8s.io/client-go/kubernetes"

  11. restclient "k8s.io/client-go/rest"

  12. "k8s.io/client-go/tools/clientcmd"

  13. "k8s.io/klog"

  14. "os"

  15. "testing"

  16. )

  17.  

  18. type OperatorManagerServer struct {

  19. Master string

  20. Kubeconfig string

  21. }

  22.  

  23. func NewOMServer() *OperatorManagerServer {

  24. s := OperatorManagerServer{}

  25. return &s

  26. }

  27.  

  28. var s *OperatorManagerServer

  29.  

  30. func init() {

  31.  

  32. s = NewOMServer()

  33. flag.StringVar(&s.Master, "master", s.Master, "The address of the Kubernetes API server (overrides any value in kubeconfig)")

  34. flag.StringVar(&s.Kubeconfig, "kubeconfig", s.Kubeconfig, "Path to kubeconfig file with authorization and master location information.")

  35. //初始化klog等flag

  36. logs.InitLogs()

  37. flag.Parse()

  38. }

  39.  

  40. func Test_DeleteCollection(t *testing.T) {

  41. if err := Run(s); err != nil {

  42. t.Fatalf("%v\n", err)

  43. os.Exit(1)

  44. }

  45. }

  46.  

  47. func Run(s *OperatorManagerServer) error {

  48.  

  49. var (

  50. generalLabelKey = "harmonycloud.cn/statefulset"

  51. redisClusterName = "redis-ll-1010"

  52. redisClusterNamespace = "kube-system"

  53. )

  54.  

  55. kubeClient, _, _, err := createClients(s)

  56.  

  57. if err != nil {

  58. return err

  59. }

  60.  

  61. //根据label批量删除pod

  62. labelPod := labels.SelectorFromSet(labels.Set(map[string]string{generalLabelKey: redisClusterName}))

  63. listPodOptions := metav1.ListOptions{

  64. LabelSelector: labelPod.String(),

  65. }

  66. err = kubeClient.CoreV1().Pods(redisClusterNamespace).DeleteCollection(&metav1.DeleteOptions{}, listPodOptions)

  67. if err != nil {

  68. if !errors.IsNotFound(err) {

  69. klog.Errorf("Drop RedisCluster: %v/%v pod error: %v", redisClusterNamespace, redisClusterName, err)

  70. return err

  71. }

  72. }

  73.  

  74. //根据label批量删除pvc

  75. labelPvc := labels.SelectorFromSet(labels.Set(map[string]string{"app": redisClusterName}))

  76. listPvcOptions := metav1.ListOptions{

  77. LabelSelector: labelPvc.String(),

  78. }

  79. err = kubeClient.CoreV1().PersistentVolumeClaims(redisClusterNamespace).DeleteCollection(&metav1.DeleteOptions{}, listPvcOptions)

  80. if err != nil {

  81. if !errors.IsNotFound(err) {

  82. klog.Errorf("Drop RedisCluster: %v/%v pvc error: %v", redisClusterNamespace, redisClusterName, err)

  83. return err

  84. }

  85. }

  86.  

  87. //如果pv没有删除掉,则删除

  88. labelPv := labels.SelectorFromSet(labels.Set(map[string]string{generalLabelKey: redisClusterName}))

  89. listPvOptions := metav1.ListOptions{

  90. LabelSelector: labelPv.String(),

  91. }

  92. err = kubeClient.CoreV1().PersistentVolumes().DeleteCollection(&metav1.DeleteOptions{}, listPvOptions)

  93.  

  94. if err != nil {

  95. if !errors.IsNotFound(err) {

  96. klog.Errorf("Drop RedisCluster: %v/%v pv error: %v", redisClusterNamespace, redisClusterName, err)

  97. return err

  98. }

  99. }

  100.  

  101. return nil

  102. }

  103.  

  104. //根据kubeconfig文件创建客户端

  105. func createClients(s *OperatorManagerServer) (*clientset.Clientset, *extensionsclient.Clientset, *restclient.Config, error) {

  106. kubeconfig, err := clientcmd.BuildConfigFromFlags(s.Master, s.Kubeconfig)

  107. if err != nil {

  108. return nil, nil, nil, err

  109. }

  110.  

  111. kubeconfig.QPS = 100

  112. kubeconfig.Burst = 100

  113.  

  114. kubeClient, err := clientset.NewForConfig(restclient.AddUserAgent(kubeconfig, "operator-manager"))

  115. if err != nil {

  116. klog.Fatalf("Invalid API configuration: %v", err)

  117. }

  118.  

  119. extensionClient, err := extensionsclient.NewForConfig(restclient.AddUserAgent(kubeconfig, "operator-manager"))

  120. if err != nil {

  121. klog.Fatalf("Invalid API configuration: %v", err)

  122. }

  123.  

  124. return kubeClient, extensionClient, kubeconfig, nil

  125. }

client-go中提供的

  •  

    Delete方法,只能删除单个资源对象,第一个参数往往是资源对象名称,第二个参数是删除选项,如:优雅终止时间GracePeriodSeconds、删除传播策略:Foreground前台删除、后台删除:Background、孤儿删除:Orphan

  •  

    DeleteCollection方法第一个参数是删除选项,第二个参数是删除条件,包括label Selector、field Selector等

  1. Delete(name string, options *metav1.DeleteOptions) error

  2. DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error

参考

k8s官方API文档:

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#delete-collection-524