前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何批量删除k8s资源对象

如何批量删除k8s资源对象

作者头像
我的小碗汤
发布2019-10-11 15:18:54
4.1K0
发布2019-10-11 15:18:54
举报
文章被收录于专栏:我的小碗汤我的小碗汤

我的小碗汤 设为星标 第一时间阅读精品

文末极客时间课程大减价

kubernetes版本:1.13.2

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

kubectl发送删除请求

根据label批量删除pod:

代码语言:javascript
复制
kubectl delete pod -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"

根据label批量删除pvc:

代码语言:javascript
复制
kubectl delete pvc -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"

根据label批量删除pv:

代码语言:javascript
复制
kubectl delete pv -l "harmonycloud.cn/statefulset=redis-ll-1010-a"

golang发送删除请求

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

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

代码语言:javascript
复制
--kubeconfig=/root/.kube/config --v=5
代码语言:javascript
复制
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中提供的

  • Delete方法,只能删除单个资源对象,第一个参数往往是资源对象名称,第二个参数是删除选项,如:优雅终止时间GracePeriodSeconds、删除传播策略:Foreground前台删除、后台删除:Background、孤儿删除:Orphan
  • DeleteCollection方法第一个参数是删除选项,第二个参数是删除条件,包括label Selector、field Selector等
代码语言:javascript
复制
Delete(name string, options *metav1.DeleteOptions) error
DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error

参考

k8s官方API文档:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • kubectl发送删除请求
  • golang发送删除请求
  • 参考
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档