如果你也是 kubectl 重度使用患者,肯定也经常有做类似如下操作:
$ kubectl get pod -n infra
$ kubectl get svc -n infra
$ kubectl get deployment -n infra
在上述操作中,我查看了同一个命名空间下的 Pod、Service、Deployment 资源列表,虽然是相同的命名空间,但是我每次执行命令都得在后面跟一个 -n <ns_name>,很烦躁!
(虽然我手速还算快,但是这是无关手速的问题!)
如何解决这个问题,方法其实很简单,只需要一个 shell 就能搞定,如下:
function k() {
cmdline=`HISTTIMEFORMAT="" history | awk '$2 == "kubectl" && (/-n/ || /--namespace/) {for(i=2;i<=NF;i++)printf("%s ",$i);print ""}' | tail -n 1`
regs=('\-n [\w\-\d]+' '\-n=[\w\-\d]+' '\-\-namespace [\w\-\d]+' '\-\-namespace=[\w\-\d]+')
for i in "${!regs[@]}"; do
reg=${regs[i]}
nsarg=`echo $cmdline | grep -o -P "$reg"`
if [[ "$nsarg" == "" ]]; then
continue
fi
cmd="kubectl $nsarg $@"
echo "$cmd"
$cmd
return
done
cmd="kubectl $@"
echo "$cmd"
$cmd
}
将上述 shell 内容保存到一个文件,比如我这里保存在 /scripts/k.sh 中,然后将该 shell 内容应用到当前 shell 环境即可开始使用了(source /scripts/k.sh)。
如何使用?依旧以文章开头的操作为例,使用该 shell 提供的 k 函数实现效果如下:
$ kubectl get pod -n infra
NAME READY STATUS RESTARTS AGE
sonarqube-postgresql-0 1/1 Running 0 69d
sonarqube-sonarqube-69d647976b-jffkb 1/1 Running 0 64d
$ k get svc
kubectl -n infra get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sonarqube-postgresql ClusterIP 172.18.166.77 <none> 5432/TCP 69d
sonarqube-postgresql-headless ClusterIP None <none> 5432/TCP 69d
sonarqube-sonarqube LoadBalancer 172.18.231.226 10.20.30.40 9000:32376/TCP 69d
$ k get deploy
kubectl -n infra get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
sonarqube-sonarqube 1/1 1 1 69d
效果很明显啦。。使用 k 函数代替 kubectl 时,k 函数会自动补上上次执行 kubectl 时使用的 -n <ns_name> 的部分,所以如果我们需要在一个命名空间下做多个 kubectl 操作,我们只需要在执行第一条 kubectl 命令时带上 -n <ns_name>,后续使用 k 命令就可以省略 -n <ns_name> 部分而操作与上次相同的命名空间下的资源了。
评论区