本文首發於公眾號【我的小碗湯】掃描文末二維碼關注,一起交流學習
在雲平台開發、中間件容器化時,經常會遇到批量刪除k8s資源對象的需求,下面記錄一下kubectl和golang發送刪除pvc、pv、pod請求的例子,便於后續學習查閱
kubectl發送刪除請求
根據label批量刪除pod:
kubectl delete pod -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"
根據label批量刪除pvc:
kubectl delete pvc -n kube-system -l "harmonycloud.cn/statefulset=redis-ll-1010-a"
根據label批量刪除pv:
kubectl delete pv -l "harmonycloud.cn/statefulset=redis-ll-1010-a"
golang發送刪除請求
根據label批量刪除pvc、pod、pv
注意:啟動參數中加入以下參數:
--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中提供的
-
Delete方法,只能刪除單個資源對象,第一個參數往往是資源對象名稱,第二個參數是刪除選項,如:優雅終止時間GracePeriodSeconds、刪除傳播策略:Foreground前台刪除、后台刪除:Background、孤兒刪除:Orphan
-
DeleteCollection方法第一個參數是刪除選項,第二個參數是刪除條件,包括label Selector、field Selector等
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
本公眾號免費提供csdn下載服務,海量IT學習資源,如果你准備入IT坑,勵志成為優秀的程序猿,那么這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時我們組建了一個技術交流群,里面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號后台回復【2】,免費邀請加技術交流群互相學習提高,會不定期分享編程IT相關資源。
掃碼關注,精彩內容第一時間推給你