超实用!K8s 开发者必须知道的 6 个开源工具
文章来源:云原生实验室,
因为 get pods 的返回结果是 List
类型,获取的 pods 都在 items
这个的 value 中,因此需要遍历 items,也就有了 {{range .items}}
。而后通过模板选定需要展示的内容,就是 items 中的每个 {{.metadata.uid}}
。
这里特别注意,要做一个特别的处理,就是要把 {{end}}
前进行换行,以便在模板中插入换行符。
当然,如果觉得这样处理不优雅的话,也可以使用 printf
函数,在其中使用 \n
即可实现换行符的插入。
$ kubectl get pods --all-namespaces -o go-template --template='{{range .items}}{{printf "%s\n" .metadata.uid}}{{end}}'
或者可以这样:
$ kubectl get pods --all-namespaces -o go-template --template='{{range .items}}{{.metadata.uid}}{{"\n"}}{{end}}'
其实有了 printf
,就可以很容易的实现对应字段的输出,且样式可以进行自己控制。比如可以这样:
$ kubectl get pods --all-namespaces -o go-template --template='{{range .items}}{{printf "|%-20s|%-50s|%-30s|\n" .metadata.namespace .metadata.name .metadata.uid}}{{end}}' |default |details-v1-64b86cd49-85vks |2e7a2a66-533e-11e8-b722-005056a1bc83| |default |productpage-v1-84f77f8747-7tkwb |2eb4e840-533e-11e8-b722-005056a1bc83| |default |ratings-v1-5f46655b57-qlrxp |2e89f981-533e-11e8-b722-005056a1bc83| ...
下面举两个 go-template 高级用法的例子:
- range 嵌套
# 列出所有容器使用的镜像名 $ kubectl get pods --all-namespaces -o go-template --template='{{range .items}}{{range .spec.containers}}{{printf "%s\n" .image}}{{end}}{{end}}' istio/examples-bookinfo-details-v1:1.5.0 istio/examples-bookinfo-productpage-v1:1.5.0 istio/examples-bookinfo-ratings-v1:1.5.0 ...
- 条件判断
# 列出所有不可调度节点的节点名与 IP $ kubectl get no -o go-template='{{range .items}}{{if .spec.unschedulable}}{{.metadata.name}} {{.spec.externalID}}{{"\n"}}{{end}}{{end}}'
除了使用 go-template
之外,还可以使用逗号分隔的自定义列列表打印表格: