(转载)k8s实用小工具

Kubectl插件

关于kubectl插件

kubectl插件其实就是以kubectl-为前缀的任意可执行文件,比如执行:

1
ln -s /bin/echo /usr/local/bin/kubectl-echo

此时就相当于安装了个echo的kubectl插件,kubectl插件可以通过kubectl + 插件名执行,kubectl xxx其实就是相当于运行kubectl-xxx

比如要运行我们的echo插件,只需执行如下命令:

1
2
# kubectl echo "HelloWorld!"
HelloWorld!

通过kubectl plugin list可列出当前PATH目录下所有插件:

1
2
3
4
5
6
7
8
9
# kubectl plugin list
The following compatible plugins are available:

/root/.krew/bin/kubectl-grep
/root/.krew/bin/kubectl-krew
/root/.krew/bin/kubectl-ns
/root/.krew/bin/kubectl-ssh_jump
/root/.krew/bin/kubectl-whoami
/usr/local/bin/kubectl-echo

所以要实现自己的插件,只需要把最终的可执行文件命名为kubectl-xxxx,然后放到PATH包含任意目录即可,但注意无法覆盖kubectl已有的子命令,如果与kubectl现有的子命令相同,则会优先执行内置子命令,因此插件不会被执行。

krew

首先要介绍的就是krew,krew是一个Kubernetes的包管理工具,它的功能就是提供简单的方法下载、检索、管理其他插件,类似操作系统的apt、yum、brew等工具,其命名也似乎模仿的brew工具。

安装krew的官方脚本如下:

1
2
3
4
5
6
7
(
set -x; cd "$(mktemp -d)" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/download/v0.3.2/krew.{tar.gz,yaml}" &&
tar zxvf krew.tar.gz &&
./krew-"$(uname | tr '[:upper:]' '[:lower:]')_amd64" install \
--manifest=krew.yaml --archive=krew.tar.gz
)

安装完后就可以使用krew搜索、安装其他插件了,本文接下来介绍的大多数插件都可以使用krew直接安装。

1
2
3
4
# kubectl krew search whoami
NAME DESCRIPTION INSTALLED
whoami Show the subject that's currently authenticated... yes
# kubectl krew install ns

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
2
3
4
5
# kubectl grep pod web
NAMESPACE NAME READY STATUS RESTART AGE
default web-0 1/1 Running 0 37h
default web-1 1/1 Running 0 37h
default web-2 1/1 Running 0 37h

在所有的namespaces搜索名字带virt的Deployments:

1
2
3
4
5
# kubectl grep deployment virt  --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubevirt virt-api 2 2 2 2 5h32m
kubevirt virt-controller 2 2 2 2 5h32m
kubevirt virt-operator 2 2 2 2 5h49m

iexec

exec命令的功能增强版本,我们知道exec必须指定Pod的名称,如果一个Pod有多个容器,则还需要指定容器名称,而使用exec则可以通过Pod模糊查询然后交互式选择,如果Pod中包含多个容器,也可以通过交互式选择。

比如我创建的Deployment有如下5个nginx Pod:

1
2
3
4
5
6
7
[root@ip-192-168-193-172 ~ (⎈ |kubernetes-# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6984d55cb6-b7zgp 2/2 Running 0 5m23s
nginx-6984d55cb6-bd8nf 2/2 Running 0 5m23s
nginx-6984d55cb6-dljzx 2/2 Running 0 5m23s
nginx-6984d55cb6-gn94v 2/2 Running 0 5m23s
nginx-6984d55cb6-kcj62 2/2 Running 0 5m23s

使用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
2
3
4
5
6
7
8
9
10
# kubectl doctor
---
TriageReport:
- Resource: Endpoints
AnomalyType: Found orphaned endpoints!
Anomalies:
- kube-controller-manager
- kube-scheduler
- virt-controller
- virt-operator

access-matrix

查看权限矩阵,比如查看针对Pod的API操作权限:

df-pv

kubectl目前只能获取pv的空间大小,而无法显示pv的真实使用情况,但其实kubelet summary API从1.8版本开始就已经有这些数据了,但官方kubectl工具还无法直接显示这些数据。

tail

我们知道kubectl的logs命令查看日志需要指定pod名称,如果一个pod还有多个容器,还需要指定容器名称,而tail插件支持同时查看多个pod的日志,支持通过Deployment、ReplicaSet等资源类型过滤日志。

文章出自

https://int32bit.me/2019/12/05/分享几个Kubernetes实用插件和工具/

Donate