Kubectl插件
关于kubectl插件
kubectl插件其实就是以kubectl-
为前缀的任意可执行文件,比如执行:
1 | ln -s /bin/echo /usr/local/bin/kubectl-echo |
此时就相当于安装了个echo
的kubectl插件,kubectl插件可以通过kubectl
+ 插件名
执行,kubectl xxx
其实就是相当于运行kubectl-xxx
。
比如要运行我们的echo
插件,只需执行如下命令:
1 | # kubectl echo "HelloWorld!" |
通过kubectl plugin list
可列出当前PATH目录下所有插件:
1 | # kubectl plugin list |
所以要实现自己的插件,只需要把最终的可执行文件命名为kubectl-xxxx
,然后放到PATH包含任意目录即可,但注意无法覆盖kubectl已有的子命令,如果与kubectl现有的子命令相同,则会优先执行内置子命令,因此插件不会被执行。
krew
首先要介绍的就是krew,krew是一个Kubernetes的包管理工具,它的功能就是提供简单的方法下载、检索、管理其他插件,类似操作系统的apt、yum、brew等工具,其命名也似乎模仿的brew工具。
安装krew的官方脚本如下:
1 | ( |
安装完后就可以使用krew搜索、安装其他插件了,本文接下来介绍的大多数插件都可以使用krew直接安装。
1 | # kubectl krew search whoami |
krew在krew index项目中维护支持的插件列表以及下载路径,目前所有插件都是在github中发布下载,但由于众所周知的原因,国内从github下载速度非常慢😑。
为了提高下载速度,写了个脚本使用axel下载替换原来的下载方式,提速至少10倍以上👿:
脚本可以在我的github中下载fast-krew。
kubectx / kubens
kubectx用于快速切换Kubernetes context,而kubens则用于快速切换namespace,我认为二者强大之处在于可以结合fzf使用。任何工具只要和fzf结合,都会很强大😁。
如切换到kube-system
namespace:
1 | kubectl ns kube-system |
如果不指定namespace,则调用fzf交互式选择:
如上黄色的namespace表示当前namespace,通过方向键移动箭头选择需要切换的目标namespace,切换context也一样,由于测试环境只有一个admin,因此只有一个选项。
grep
基于name搜索资源,资源包括DaemonSets、Pods、Deployments、Nodes等,如搜索名字中带web
的所有Pods:
1 | # kubectl grep pod web |
在所有的namespaces搜索名字带virt
的Deployments:
1 | # kubectl grep deployment virt --all-namespaces |
iexec
exec命令的功能增强版本,我们知道exec必须指定Pod的名称,如果一个Pod有多个容器,则还需要指定容器名称,而使用exec则可以通过Pod模糊查询然后交互式选择,如果Pod中包含多个容器,也可以通过交互式选择。
比如我创建的Deployment有如下5个nginx Pod:
1 | [root@ip-192-168-193-172 ~ (⎈ |kubernetes-# kubectl get pod |
使用iexec可以直接运行如下命令:
1 | kubectl iexec nginx |
结果如下:
我们知道通过Deployment创建的Pod,Pod的命名格式为Deployment名字+加上Deployment的一段hash + Replica的一段hash,我们通常只记得Deployment的名字,而不知道Pod的名字,通过iexe只需要输入Deployment名字即可,通过交互式选择Pod,非常方便。
doctor
和brew doctor类似的工具,用于检查Kubernetes的健康状况以及扫描Kubernetes集群中的异常资源,比如etcd member状态、Node状态、孤儿endppoint等。
1 | # kubectl doctor |
access-matrix
查看权限矩阵,比如查看针对Pod的API操作权限:
df-pv
kubectl目前只能获取pv的空间大小,而无法显示pv的真实使用情况,但其实kubelet summary API从1.8版本开始就已经有这些数据了,但官方kubectl工具还无法直接显示这些数据。
tail
我们知道kubectl的logs命令查看日志需要指定pod名称,如果一个pod还有多个容器,还需要指定容器名称,而tail插件支持同时查看多个pod的日志,支持通过Deployment、ReplicaSet等资源类型过滤日志。