文章来源:云原生实验室,
因为 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 高级用法的例子:

# 列出所有容器使用的镜像名 $ 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 之外,还可以使用逗号分隔的自定义列列表打印表格: