[K8S] kubectl 插件开发实战

32,738 阅读3分钟

0. 简介

文本介绍一个我个人开发的一个kubectl插件供大家参考与学习;kubectl 插件它其实是一个独立的执行文件,并不是对kubectl 进行二开操作。官方有一个很简单的例子介绍了什么是 kubectl 插件这里就不再叙述;

官方文档: kubernetes.io/docs/tasks/…

1. 项目(kube-query)

我个人是从事运维产品研发的相关工作所以接触k8s比较多,但总觉得k8s命令和概念非常多难以记忆和开放,所以一直想 简化统一开放 k8s的基本操作(起码运维用起来简单点);之后接触到了kubectl 插件这个概念,我便萌生出一个想法可以开发个交互终端,进行命令或资源提示、开放的命令记录(类似堡垒机)、可以使用clinet-go 进行命令的简化或展示的简化、以及自定义权限的控制;

1.1 项目演示

项目地址: github.com/Shadow-linu…

  • 当前项目只是一个简单的雏形,但完全可以按照自己的想法去实现和开放k8s操作到业务部门去;

daemon.gif

1.2 安装

Downloading standalone binary

   Binaries are available from (github release).

  • macOS (darwin) - amd64

    wget https://github.com/Shadow-linux/kube-query/releases/download/v1.0.0/kube-query_v1.0.0_darwin_amd64.zip
    unzip kube-query_v1.0.0_darwin_amd64.zip
    chmod +x kube-query.darwin-amd64
    sudo mv bin/kube-query.darwin-amd64 /usr/local/bin/kube-query
    
  • Linux - amd64

    wget https://github.com/Shadow-linux/kube-query/releases/download/v1.0.0/kube-query_v1.0.0_linux_amd64.zip
    unzip kube-query_v1.0.0_linux_amd64.zip
    chmod +x kube-query.linux-amd64
    sudo mv bin/kube-query.linux-amd64 /usr/local/bin/kube-query
    
  • Source code

    # install go version 1.17+ first.
    wget https://github.com/Shadow-linux/kube-query.git
    cd kube-query
    make build
    mv bin/kube-query /usr/local/bin/kube-query
    

1.3 用法

这里只列举了一部分的用法,更多的请跳转至项目源地址: github.com/Shadow-linu…

  • config your kubeconfig
    export KUBECONFIG=~/.kube/config
    

Start way

  1. use in kubectl

    mv /usr/local/bin/kube-query /usr/local/bin/kubectl-query
    kubectl query [--debug]
    
  2. standalone

    ./kube-query [--debug]
    

Basic Command

  • Clear console

    kube-query ~ > clear
    
  • Show help info for kube-query and kubectl native command.

    kube-query ~ > help
    
  • Set global namespace

    kube-query ~ > use default
    Set namespace default
    kube-query ~ > use kube-system
    Set namespace kube-system
    # all namespace can not use in native kubectl command.
    # set namespace all is not safety operation. 
    kube-query ~ > use all
    Set namespace all
    
  • Run shell command. We can easier auto complete the file path, when you input a word start with / or ./.

    kube-query ~ > @ ls /tmp;
    
  • Close console.

    # exit | quit | ctrl + D
    kube-query ~ > exit
    

Resource command

resource format: ResourceName.Namespace,

  • Output mode.

    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default [-o desc]
    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default -o [yaml|desc|json]
    
  • Show labels

    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default -l
    Labels: 
    app=jtthink-ngx
    pod-template-hash=8669b5c9d
    
  • Show events

    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default -e
    Events: 
    TYPE    REASON  MESSAGE 
    
  • Show relationship

    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default -r
    Relevant relationship:
    ##### Service #####
    NAME                    TYPE            CLUSTER-IP      EXTERNAL-IP     PORTS        
    jtthink-ngx-svc         ClusterIP       10.99.226.31                    38080/TCP       
    jtthink-ngx-svc-1       NodePort        10.99.47.202                    81:30080/TCP    
    
    ##### ReplicaSet #####
    NAME                    DESIRED CURRENT READY 
    jtthink-ngx-8669b5c9d   1       1       1       
    
    ##### Deployment #####
    NAME            READY   UP-TO-DATE      AVAILABLE 
    jtthink-ngx     1/1     1               1   
    
  • Connect to container

    # connect specify container name and shell.
    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default -i jt-nginx -s /bin/sh
    Connect to container: jtthink-ngx-8669b5c9d-xwljg.jt-nginx
    Commannd: /bin/sh 
    / # exit
    Connection closed.
    
    # connect default container.
    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default -i
    Connect to container: jtthink-ngx-8669b5c9d-xwljg.
    Commannd: sh 
    / # exit
    Connection closed.
    
    
  • Use grep command to filter info;

    kube-query ~ > pods jtthink-ngx-8669b5c9d-xwljg.default -l |grep -A 1  -i labels
    Labels: 
    app=jtthink-ngx
    

2. 写在最后

   我热爱 云原生自动化运维 同时也希望能做出依赖于云(k8s)为基础的自动化云运维相关的原生产品,包括资源管理、监控、任务管理 、ServiceMesh 和 网络管理 等等;因为k8s其实已经提供了一套很好的运维标准,无论是否是k8s的机器都应该纳入进来管理(如同在一个机器上安装agent而已),如果你也有这样的想法可以和我多多交流与讨论。