kubectl 插件简介
kubectl
插件是指能够由 kubectl
调用的外部独立应用程序,这类应用程序都以 kubectl-<plugin_name>
格式命名,表现为 plugin_name
是 kubectl
的子命令。例如,应用程序 /usr/bin/kubectl-whoami
就是 whoami
插件,我们可以使用 kubectl whoami
的格式来运行它。因此,可为 kubectl
插件添加新的可用子命令,丰富 kubectI
的功能。
插件程序能够从 kubectl
继承环境信息,但 kubectl
的插件机制并不会在该程序及调用的外部程序之间传递任何信息,它仅仅提供了调用外部程序的一个统一接口, 于是我们可以使用任何熟悉的脚本语言或编程语言来开发 kubectl
插件,但最终的脚本或程序文件需要以 kubectl-
为名称前缀。而安装插件的过程,也不过是将插件程序的可执行文件移动到系统的 PATH
环境变量上,指向任一路径即可。事实上,kubectl plugin list
命令可遍历 PATH
环境变量指向的每一个路径,搜索并列出每一个以 kubectl-
为前缀的可执行程序文件路径。
插件管理工具 - Krew
Kubernetes SIG CLI 社区还提供了一个插件管理器 —— Krew, 它能够帮助用户打包、分发、查找、安装和管理 kubectl
插件,项目地址为:
Krew 以跨平台的方式打包和分发插件,因此单一打包格式即能适配主流的系统平台(Linux、Windows 或 macOS 等)。为了便于插件分发,Krew 还维护有一个插件索引,以方便用户发现主流的可用插件。
Krew 自身也表现为 kubectl
的一个插件,需要以手动方式独立安装。
Krew 安装
下面的 shell 命令集能自动完成 Krew 插件的安装,它仅适用于类 UNIX 系统平台,并以 bash 解释器运行,其他平台上的部署方式请参考上面项目地址的官方文档。
$ (
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" &&
tar zxvf krew.tar.gz &&
KREW=./krew-"${OS}_${ARCH}" &&
"$KREW" install krew
)
安装完成后添加 $HOME/.krew/bin
到 PATH
环境变量:
$ echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> $HOME/.bashrc && . $HOME/.bashrc
查看 kubectl
插件列表确认 Krew 安装完成:
$ $ kubectl plugin list
The following compatible plugins are available:
/root/.krew/bin/kubectl-krew
Krew 基本使用
Krew 的使用其实和 yum
、apt
这些包管理工具差不多,只不过它是作为 kubectl
的子命令使用而已,这里就简单列一下常用的命令:
kubectl krew update # 更新插件索引
kubectl krew search [plugin_name] # 搜索插件,省略插件名称时表示列出所有可安装插件,支持模糊搜索
kubectl krew install <plugin_name> # 安装插件
kubectl krew list # 查看已安装插件
kubectl krew info <plugin_name> # 查看指定插件详细信息
kubectl krew upgrade <plugin_name> # 升级指定插件
kubectl krew --help # 查看 Krew 使用帮助,其它插件大部分也可以通过 kubectl <plugin_name> --help 的方式来查看插件如何使用
其实目前插件的数量也不是很多,为避免占用文章篇幅,我这里就直接通过如下命令查看插件的数量了,可以看到也就一百来个。
$ kubectl krew search | wc -l
148
我使用的插件
我自己有安装的插件有如下:
$ kubectl krew list
PLUGIN VERSION
ctx v0.9.4 # 快捷切换上下文
get-all v1.3.7 # 快捷查看所有资源
krew v0.4.1 # Krew 本身也是作为插件存在
ns v0.9.4 # 快捷切换命名空间
rbac-view v0.2.1 # 提供一个 web 页面可视化展示当前 rbac 资源详情
status v0.4.1 # 查看指定资源状态信息
tail v0.15.0 # 查看日志,支持同时查看多个 Pod 的日志
tree v0.4.0 # 树状展示资源结构信息
whoami v0.0.35 # 查看当前 kubectl 以何身份访问 API Server
要安装上述插件只需要执行下面命令:
$ kubectl krew install whoami rbac-view ns ctx status tail get-all tree
插件效果展示
下面就随便挑几个插件展示一下效果啦。。
- ns
# 查看命名空间列表,会高亮当前所在命名空间名称
$ kubectl ns
default
ingress-nginx
istio-system
kube-node-lease
kube-public
kube-system
kubernetes-dashboard
# 切换指定命名空间为默认命名空间,后续执行命令不用再加 --namespace
$ kubectl ns ingress-nginx
Context "kubernetes" modified.
Active namespace is "ingress-nginx".
root@k8s-master1:/root
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-9qfx7 1/1 Running 2 59d
# 切换回上一个命名空间
$ kubectl ns -
Context "kubernetes" modified.
Active namespace is "default".
# 查看当前命名空间
$ kubectl ns -c
default
- status
# 查看 Pod 状态
$ kubectl status pod nginx-proxy-9cd44999f-np748
Pod/nginx-proxy-9cd44999f-np748 -n default, created 22d ago by ReplicaSet/nginx-proxy-9cd44999f Running BestEffort
PodScheduled -> Initialized -> ContainersReady -> Ready for 10h
Containers:
nginx (nginx:1.16.1) Running for 10h and Ready, restarted 2 times
usage cpu:0, mem:1.9MB
previously: Started 10h ago and Error after 20s with exit code 1
# 查看 Service 状态
$ kubectl status svc nginx-proxy
Service/nginx-proxy -n default, created 1mo ago, last endpoint change was 292y ago
Ready: Pod/nginx-proxy-9cd44999f-np748 -n default on Node/k8s-node1, 10.244.1.39:3306/TCP
- tail
# 查看 Pod 日志
$ kubectl tail -p nginx-proxy-9cd44999f-np748
# 查看 deploy 下所有 Pod 的日志
$ kubectl tail -d nginx-proxy
# 更多查看日志方式可通过 --help 查看
$ kubectl tail --help
usage: kubectl-tail [<flags>] <command> [<args> ...]
Tail for kubernetes pods
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--ignore=SELECTOR ... ignore selector
-l, --label=SELECTOR ... label
-p, --pod=NAME ... pod
-n, --ns=NAME ... namespace
--ignore-ns=NAME ... ignore namespace
--svc=NAME ... service
--rc=NAME ... replication controller
--rs=NAME ... replica set
--ds=NAME ... daemonset
-d, --deploy=NAME ... deployment
-j, --job=NAME ... job
--node=NAME ... node
--ing=NAME ... ingress
--context=CONTEXT-NAME kubernetes context
--current-ns use namespace from current context
-c, --containers=NAME ... containers
--dry-run print matching pods and exit
--log-file=LOG-FILE log file output
--log-level=error log level
--since=DURATION Display logs generated since given duration, like 5s, 2m, 1.5h or 2h45m. Defaults to 1s.
Commands:
help [<command>...]
Show help.
run*
Display logs
version
Display current version
还有很多优秀的插件我这里没有演示。。可以看到使用其实很简单,多用 --help
你就会了~
评论区