「本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,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,以供你們學習交流。