kubectl 可能是 Kubernetes(k8s) 最好用的用户接口, 但各种工具都得自己打磨打磨才能用得顺手,kubectl 也不例外。日常使用起来仍然有比较繁琐的地方,比如同时查看多个容器的日志,自定义 get
的输出格式。
准备工作
根据官方速查表配置好 kubectl 的自动补全:
Bash
echo "source > ~/.bashrc
Zsh
echo "if [ $commands[kubectl] ]; then source > ~/.zshrc
假如你对 kubectl 不太熟悉,速查表里余下的内容能快速让你上手,建议一读。另外,github 上还有一份更全面的适合打印的速查表 cheatsheet-kubernetes-A4
别名
执行下面的命令:
cat>>~/.bashrc<<eof alias k="kubectl" ka="kubectl apply --recursive -f" kex="kubectl exec -i -t" klo="kubectl logs -f" kg="kubectl get" kd="kubectl describe" eof kubectl plugin github bash tab path pluginname debug kubernetes context namespace tail pod logs grep podname brew install stern mv . jid jq yum json get yaml xxx labels k8s jsonpath pbcopy array cookbook custom columns docker image deploy .spec.template.spec.containers aylei-master-discovery pingcap aylei-master-monitor prom grafana qotm datawire rss-site nginx tiller-deploy gcr.io> tips: API 对象的 shortname 可以用 `kubectl api-resources` 查看
其实效果仍然一般。还好,对于大部分 `jq` 能实现的转化,`kubectl get` 命令的 `-o=custom-columns` 参数也能实现,并且输出结果的对齐与表头更友好(同时可以不依赖 `jq`):
```bash
$ k get deploy -o=custom-columns=NAME:'.metadata.name',IMAGES:'.spec.template.spec.containers[*].image'NAME IMAGESaylei-master-discovery pingcap/tidb-operator:latestaylei-master-monitor prom/prometheus:v2.2.1,grafana/grafana:4.6.5qotm datawire/qotm:1.3
> 虽然语法略有不同, 但 custom-columns 里的 jsonpath 仍然可以通过 jid 去探索式地获取
(注意 custom-columns 中使用的 JSONPath 语法 和 jq
是不同的, 通配 list 需要用 [*]
)
定制自己的输出格式
jq
和 custom-columns
都有一个问题是命令太长了,即使我们用 alias 这么一行巨长的命令也不好维护。还好,jq
和 custom-columns
都支持从文件中选择查询,考虑到 custom-columns
的输出效果比较好,更适合作为默认输出(jq 我一般用来做 adhoc query),因此我们可以在 custom-columns
的基础上再封装一下。
kubectl get
的 -o=custom-columns-file=<file>
这个参数可以选定一个文件来提供 custom-columns
的信息, 文件格式非常简单:
NAME IMAGE.metadata.name .spec.template.spec.containers[*].image
但要指定文件感觉还是很麻烦,怎么办呢?刚刚讲的 kubectl 插件机制就派上用场了,我们可以实现一个插件来展示自定义的输出格式,而编写方式嘛,Bash 就足够啦,执行下面的命令直接写完:
cat>>kubectl-ls<<eof see if we have custom-columns-file definedif kubectl get columns path chmod a kubectl-lsmv kubectl-ls>>~/.kube/columns/deploy<<eofname image.metadata.name .spec.template.spec.containers ls kubectl k deployname imageaylei-master-discovery pingcap prom datawire nginxtiller-deploy gcr.io netdata crd definition resources get prometheus operator kg prometheusname created atk8s cat>>~/.kube/columns/prometheus<<eofname replicas version cpu memory alertmanagermetadata.name spec.replicas spec.version spec.resources.requests.cpu spec.resources.requests.memory spec.alerting.alertmanagers k ls prometheus k8sname alertmanagerk8s v2.5.0> 400Mi alertmanager-main
结语
OK(终于水完了…),这些配置其实都带有很强的个人色彩,我自己用着非常顺手,但可能到大家那边就未必如此了。因此这篇文章只能勉强算是抛砖引玉,假如能有一两点帮助大家提升了效率,那也就达到目的了。
欢迎大家扫码关注,获取更多信息
![](https://i-blog.csdnimg.cn/blog_migrate/1f4fa648af10abfa42058ba8d179366c.jpeg)