我正在寻找在运行测试后收集日志的脚本中列出吊舱中的所有容器。 kubectl describe pods -l k8s-app=kube-dns
返回很多信息,但是我只是在寻找像这样的返回:
etcd
kube2sky
skydns
我看不到格式化描述输出的简单方法。还有其他命令吗?(我猜想最坏的情况是总是解析describe的输出)。
Answers:
您可以使用get
带有--output
(-o
)标志的支持的输出模板,并选择其中一种。
就拿jsonpath
例如,
kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}
给你etcd kube2sky skydns
。
其他受支持的输出输出模板是go-template,go-template-file,jsonpath-file。有关如何使用jsonpath模板,请参见http://kubernetes.io/docs/user-guide/jsonpath/。有关如何使用go模板的信息,请参见https://golang.org/pkg/text/template/#pkg-overview。
更新:检查此文档以获取其他示例命令以列出容器图像:https : //kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/
kubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
快速破解,避免为单个pod构造JSONpath查询:
$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]
containers
和init containers
init containers
在v1.18.8上看不到这种方式:(
我将一些想法汇总如下:
简单行:
kubectl get po -o jsonpath='{range .items[*]}{"pod: "}{.metadata.name}{"\n"}{range .spec.containers[*]}{"\tname: "}{.name}{"\n\timage: "}{.image}{"\n"}{end}'
拆分(出于可读性考虑):
kubectl get po -o jsonpath='
{range .items[*]}
{"pod: "}
{.metadata.name}
{"\n"}{range .spec.containers[*]}
{"\tname: "}
{.name}
{"\n\timage: "}
{.image}
{"\n"}
{end}'
less
或传送到vi
:COMMAND | less
或vi<(COMMAND)
如果您将其json
用作输出格式,则kubectl get
可以获得的大量详细信息pod
。使用json
类似的处理器,jq
您可以轻松选择或过滤您感兴趣的某些零件。
要列出容器的容器,jq
查询如下所示:
kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
| jq --raw-output '.items[].spec.containers[].name'
如果要查看有关一个特定容器的所有详细信息,请尝试以下操作:
kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
| jq '.items[].spec.containers[] | select(.name=="etcd")'
我用它来显示豆荚上的图像版本。
kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{end}{end}' && printf '\n'
这只是对脚本的一小部分修改,添加了新行以在新行上开始下一个控制台命令,在每行末尾删除了逗号,仅列出了我的Pod,没有服务Pod(例如,--all-namespaces
选项被删除)。
kubectl get pods -o json
。