「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」前端
在咱们使用kubectl查看k8s资源的时候,想直接查看对应资源的容器名称和镜像名称,目前kubectl还不支持该选型,须要咱们describe而后来查看,对于集群本身比较多,不是很方便,所以萌生了本身开发kubectl 插件来实现该功能。node
Cobra是一个命令行程序库,其是一个用来编写命令行的神器,提供了一个脚手架,用于快速生成基于Cobra应用程序框架。咱们能够利用Cobra快速的去开发出咱们想要的命令行工具,很是的方便快捷。git
详细可参考:Golang 开发之Cobra初探github
在K8s运维中,咱们可使用kubectl、客户端库或者REST请求来访问K8S API。而实际上,不管是kubectl仍是客户端库,都是封装了REST请求的工具。client-go做为一个客户端库,可以调用K8S API,实现对K8S集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操做。web
详细可参考:K8s二开之 client-go 初探shell
Krew 是 相似于系统的apt、dnf或者brew的 kubectl插件包管理工具,利用其能够轻松的完成kubectl 插件的全上面周期管理,包括搜索、下载、卸载等。json
kubectl 其工具已经比较完善,可是对于一些个性化的命令,其宗旨是但愿开发者能以独立而紧张形式发布自定义的kubectl子命令,插件的开发语言不限,须要将最终的脚步或二进制可执行程序以kubectl-
的前缀命名,而后放到PATH中便可,可使用kubectl plugin list
查看目前已经安装的插件。后端
详细可参考:k8s 插件管理工具之krew使用bash
go get -v github.com/spf13/cobra/cobra
复制代码
$ ~/workspace/goworkspace/src/github.com/kaliarch/kubeimg /Users/xuel/workspace/goworkspace/bin/cobra init --pkg-name kubeimg
Your Cobra application is ready at
/Users/xuel/workspace/goworkspace/src/github.com/kaliarch/kubeimg
$ ~/workspace/goworkspace/src/github.com/kaliarch/kubeimg ls
LICENSE cmd main.go
$ ~/workspace/goworkspace/src/github.com/kaliarch/kubeimg tree
├── LICENSE
├── cmd
│ └── root.go
└── main.go
1 directory, 3 files
复制代码
go mod init kubeimg
复制代码
增长一个子命令image。markdown
$ /Users/xuel/workspace/goworkspace/bin/cobra add image
image created at /Users/xuel/workspace/goworkspace/src/github.com/kaliarch/kubeimg
复制代码
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
cobra.CheckErr(rootCmd.Execute())
}
func init() {
KubernetesConfigFlags = genericclioptions.NewConfigFlags(true)
imageCmd.Flags().BoolP("deployments", "d", false, "show deployments image")
imageCmd.Flags().BoolP("daemonsets", "e", false, "show daemonsets image")
imageCmd.Flags().BoolP("statefulsets", "f", false, "show statefulsets image")
imageCmd.Flags().BoolP("jobs", "o", false, "show jobs image")
imageCmd.Flags().BoolP("cronjobs", "b", false, "show cronjobs image")
imageCmd.Flags().BoolP("json", "j", false, "show json format")
KubernetesConfigFlags.AddFlags(rootCmd.PersistentFlags())
}
复制代码
var imageCmd = &cobra.Command{
Use: "image",
Short: "show resource image",
Long: `show k8s resource image`,
RunE: image,
}
func init() {
rootCmd.AddCommand(imageCmd)
}
复制代码
// ClientSet k8s clientset
func ClientSet(configFlags *genericclioptions.ConfigFlags) *kubernetes.Clientset {
config, err := configFlags.ToRESTConfig()
if err != nil {
panic("kube config load error")
}
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
panic("gen kube config error")
}
return clientSet
}
复制代码
利用反射实现根据不一样资源类型查看具体对应资源镜像及镜像名称功能。
func image(cmd *cobra.Command, args []string) error {
clientSet := kube.ClientSet(KubernetesConfigFlags)
ns, _ := rootCmd.Flags().GetString("namespace")
// 生命一个全局资源列表
var rList []interface{}
if flag, _ := cmd.Flags().GetBool("deployments"); flag {
deployList, err := clientSet.AppsV1().Deployments(ns).List(context.Background(), v1.ListOptions{})
if err != nil {
fmt.Printf("list deployments error: %s", err.Error())
}
rList = append(rList, deployList)
}
...
deployMapList := make([]map[string]string, 0)
for i := 0; i < len(rList); i++ {
switch t := rList[i].(type) {
case *kv1.DeploymentList:
for k := 0; k < len(t.Items); k++ {
for j := 0; j < len(t.Items[k].Spec.Template.Spec.Containers); j++ {
deployMap := make(map[string]string)
deployMap["NAMESPACE"] = ns
deployMap["TYPE"] = "deployment"
deployMap["RESOURCE_NAME"] = t.Items[k].GetName()
deployMap["CONTAINER_NAME"] = t.Items[k].Spec.Template.Spec.Containers[j].Name
deployMap["IMAGE"] = t.Items[k].Spec.Template.Spec.Containers[j].Image
deployMapList = append(deployMapList, deployMap)
}
}
复制代码
利用tabel来对结果进行输出
func GenTable(mapList []map[string]string) *table.Table {
t, err := gotable.Create(title...)
if err != nil {
fmt.Printf("create table error: %s", err.Error())
return nil
}
t.AddRows(mapList)
return t
}
复制代码
最终项目结构:
对完成的插件进行测试,编译go build
生成kubeimg二进制可执行文件。
其中能够看到cobra帮咱们自动生成了help和completion两个命令,能够快速实现table补全,支持bash/fish/zsh/powershell
./kubeimg --help
复制代码
./kubeimg image --help
复制代码
不知地ing名称名称空间,默认查看全部,名称空间下的资源
./kubeimg image -d
复制代码
./kubeimg image -d -n kube-system
复制代码
能够看到imlc-operator-controller-manager 一个pod中有两个container。
./kubeimg image -b -e -d -o -f
复制代码
./kubeimg image -o -j
复制代码
须要将最终的脚步或二进制可执行程序以kubectl-
的前缀命名,而后放到PATH中便可,可使用kubectl plugin list
查看目前已经安装的插件。
$ kubectl plugin list
The following compatible plugins are available:=
/usr/local/bin/kubectl-debug
- warning: kubectl-debug overwrites existing command: "kubectl debug"
/usr/local/bin/kubectl-v1.10.11
/usr/local/bin/kubectl-v1.20.0
/Users/xuel/.krew/bin/kubectl-df_pv
/Users/xuel/.krew/bin/kubectl-krew
# 将本身开发的插件从新命名为kubectl-img放到可执行路基下
$ cp kubeimg /Users/xuel/.krew/bin/kubectl-img
$ kubectl plugin list
The following compatible plugins are available:=
/usr/local/bin/kubectl-debug
- warning: kubectl-debug overwrites existing command: "kubectl debug"
/usr/local/bin/kubectl-v1.10.11
/usr/local/bin/kubectl-v1.20.0
/Users/xuel/.krew/bin/kubectl-df_pv
/Users/xuel/.krew/bin/kubectl-krew
/Users/xuel/.krew/bin/kubectl-img
$ cp kubeimg /Users/xuel/.krew/bin/kubectl-img
复制代码
以后就能够想使用kubectl插件同样使用了。
目前实现的比较简单,以此来抛砖引玉的功能,后期能够进行更多功能或其余插件的开发,本身动手丰衣足食。
后期待再完善开源到github,我的主页:github,以供你们学习交流。