0
点赞
收藏
分享

微信扫一扫

kubectl插件之pod通过标签过滤

package main

import (
	"context"
	"fmt"
	"github.com/olekukonko/tablewriter"
	"github.com/spf13/cobra"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/cli-runtime/pkg/genericclioptions"
	"k8s.io/client-go/kubernetes"
	"log"
	"os"
)

var client = InitClient() //这是 clientset


func Map2String(m map[string]string) (ret string )  {
	for k,v:=range m{
		ret+=fmt.Sprintf("%s=%s\n",k,v)
	}
	return
}
//初始化头
func InitHeader(table *tablewriter.Table) []string  {
	commonHeaders:=[]string{"名称", "命名空间", "IP","状态"}
	//判断是否有标签参数,如果有则显示
	if  ShowLabels{
		commonHeaders=append(commonHeaders,"标签")
	}
	return commonHeaders
}

//通过config初始化client

func InitClient() *kubernetes.Clientset{
	cfgFlags =genericclioptions.NewConfigFlags(true)
	config,err:= cfgFlags.ToRawKubeConfigLoader().ClientConfig()
	if err!=nil{log.Fatalln(err)}
	c,err:=kubernetes.NewForConfig(config)
	if err!=nil{log.Fatalln(err)}
	return c
}

func MergeFlags(cmd *cobra.Command){
	cfgFlags.AddFlags(cmd.Flags())
}

var (
	cfgFlags *genericclioptions.ConfigFlags
	Labels string
	//标签判断
	ShowLabels bool
)

func RunCmd(f func(c *cobra.Command, args []string) error ) {
	cmd := &cobra.Command{
		Use:          "kubectl pods [flags]",
		Short:        "list pods ",
		Example:      "kubectl pods [flags]",
		SilenceUsage: true,
		RunE:f,
	}

	MergeFlags(cmd)
	//用来支持 是否 显示标签
	cmd.Flags().BoolVar(&ShowLabels,"show-labels",false,"kubectl pods --show-lables")
	//标签过滤
	cmd.Flags().StringVar(&Labels,"labels","","kubectl pods --lables app=ngx or kubectl pods --lables=\"app=ngx,version=v1\"")
	err:=cmd.Execute()
	if err!=nil{
		log.Fatalln(err)
	}
}


func run(c *cobra.Command, args []string) error {
	ns, err := c.Flags().GetString("namespace")
	if err != nil {
		return err
	}
	if ns == "" {
		ns = "default"
	}
	//如果有labels的条件,那么就只拿到对应label的 pod列表
	list, err := client.CoreV1().Pods(ns).List(context.Background(),
		v1.ListOptions{
			LabelSelector: Labels,
		})
	if err != nil {
		return err
	}
	table := tablewriter.NewWriter(os.Stdout)
	//设置头
	table.SetHeader(InitHeader(table))
	for _, pod := range list.Items {
		podRow := []string{pod.Name, pod.Namespace, pod.Status.PodIP,
			string(pod.Status.Phase)}
		if ShowLabels {
			podRow = append(podRow, Map2String(pod.Labels))
		}
		table.Append(podRow)
	}
	table.SetAutoWrapText(false)
	table.SetAutoFormatHeaders(true)
	table.SetHeaderAlignment(tablewriter.ALIGN_LEFT)
	table.SetAlignment(tablewriter.ALIGN_LEFT)
	table.SetCenterSeparator("")
	table.SetColumnSeparator("")
	table.SetRowSeparator("")
	table.SetHeaderLine(false)
	table.SetBorder(false)
	table.SetTablePadding("\t") // pad with tabs
	table.SetNoWhiteSpace(true)
	table.Render()
	return nil

}

func main() {
	RunCmd(run)
}

在这里插入图片描述

举报

相关推荐

0 条评论