系列目录html
上一节咱们介绍了一些基本的命令,这一节咱们介绍一些更为复杂的命令.node
使用kubectl get pod获取pod资源默认是以名称排序的,有些时候咱们可能但愿按其它顺序排序.好比说咱们想要按照节点来排序.以即可以看到不一样的节点上都运行着哪些pod.linux
这个需求可使用linux命令很简单实现.使用kubectl get pod
加上-owide
参数就能够显示pod所在的节点.咱们再使用linux sort命令就能够对结果按照特定字段排序了.如下示例是按节点排序后的结果git
[centos@k8s-master ~]$ kubectl get pod -owide|sort -k 7 sagent-b4dd8b5b9-5m2jc 1/1 Running 0 15h 10.244.5.17 k8s-node1 <none> <none> consul-0 1/1 Running 0 2d17h 10.244.2.27 k8s-node2 <none> <none> consul-2 1/1 Running 0 2d17h 10.244.2.28 k8s-node2 <none> <none> stodagent-6f47976ccb-8fzmv 1/1 Running 0 2d17h 10.244.2.23 k8s-node2 <none> <none> stodagent-6f47976ccb-vf7kx 1/1 Running 0 2d17h 10.244.2.22 k8s-node2 <none> <none> trackingapi-gateway-dep-79bb86bb57-x9xzp 1/1 Running 0 2d17h 10.244.2.24 k8s-node2 <none> <none> sagent-b4dd8b5b9-6mmst 1/1 Running 0 15h 10.244.6.6 k8s-node3 <none> <none> sagent-b4dd8b5b9-zq649 1/1 Running 0 15h 10.244.7.7 k8s-node4 <none> <none> stodagent-6f47976ccb-j7m8b 1/1 Running 0 2d17h 10.244.3.6 k8s-node5 <none> <none> consul-1 1/1 Running 0 2d17h 10.244.3.13 k8s-node5 <none> <none> easymock-dep-84767b6f75-l84r4 1/1 Running 0 15h 10.244.8.8 k8s-node6 <none> <none> NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
咱们能够看到,已经以节点名称来排序的,这里不太优雅的是标题被排在了最后面.可是无伤大雅.github
其实kubectl get命令有一个--sort-by参数.咱们能够经过它来指定要按照资源的哪个字段来排序,而不局限于展现出的字段.如下是使用--sort-by
参数按节点名称排序后的结果.redis
[centos@k8s-master ~]$ kubectl get pod --sort-by='{.spec.nodeName}' -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES sagent-b4dd8b5b9-5m2jc 1/1 Running 0 15h 10.244.5.17 k8s-node1 <none> <none> consul-0 1/1 Running 0 2d17h 10.244.2.27 k8s-node2 <none> <none> stodagent-6f47976ccb-8fzmv 1/1 Running 0 2d17h 10.244.2.23 k8s-node2 <none> <none> consul-2 1/1 Running 0 2d17h 10.244.2.28 k8s-node2 <none> <none> stodagent-6f47976ccb-vf7kx 1/1 Running 0 2d17h 10.244.2.22 k8s-node2 <none> <none> trackingapi-gateway-dep-79bb86bb57-x9xzp 1/1 Running 0 2d17h 10.244.2.24 k8s-node2 <none> <none> sagent-b4dd8b5b9-6mmst 1/1 Running 0 15h 10.244.6.6 k8s-node3 <none> <none> sagent-b4dd8b5b9-zq649 1/1 Running 0 15h 10.244.7.7 k8s-node4 <none> <none> consul-1 1/1 Running 0 2d17h 10.244.3.13 k8s-node5 <none> <none> stodagent-6f47976ccb-j7m8b 1/1 Running 0 2d17h 10.244.3.6 k8s-node5 <none> <none> easymock-dep-84767b6f75-l84r4 1/1 Running 0 15h 10.244.8.8 k8s-node6 <none> <none>
除了展现出来的字段外,咱们还能够按照没有展现出来的字段进行排序.好比咱们能够按照startTime
来排序,看看哪些pod运行的时间较长.编程
[centos@k8s-master ~]$ kubectl get pod --sort-by='{.status.startTime}' NAME READY STATUS RESTARTS AGE stodagent-6f47976ccb-vf7kx 1/1 Running 0 2d18h stodagent-6f47976ccb-j7m8b 1/1 Running 0 2d18h stodagent-6f47976ccb-8fzmv 1/1 Running 0 2d18h trackingapi-gateway-dep-79bb86bb57-x9xzp 1/1 Running 0 2d18h consul-0 1/1 Running 0 2d18h consul-1 1/1 Running 0 2d17h consul-2 1/1 Running 0 2d17h sagent-b4dd8b5b9-5m2jc 1/1 Running 0 16h sagent-b4dd8b5b9-zq649 1/1 Running 0 16h sagent-b4dd8b5b9-6mmst 1/1 Running 0 16h easymock-dep-84767b6f75-l84r4 1/1 Running 0 15h redis-cache-f87d8488c-v4zjx 0/1 ErrImagePull 0 57s redis-cache-f87d8488c-4d9dl 0/1 ImagePullBackOff 0 57s redis-cache-f87d8488c-kxc89 0/1 ImagePullBackOff 0 57s
看了之后输出内容之后,你们可能一头雾水,以上究竟是不是按启动时间排序的?如何直接地看到是按启动时间排序的呢?其实实际上确实是按照启动时间排序了,为民展现此示例,我刚刚不久启动了三个没法运行的redis实例,它们被排在了最下面.json
咱们能不能把startTime字段也输出出来呢,这样就能够直接地看到输出时间了,是否是按这个时间排序的也就一目了然了.答案是确定的.centos
前面一节咱们遇到一个问题,咱们有一个需求把pod的startTime显示出来.其实这个需求是能够实现的,kubectl get的输入格式参数-o(或--output)
接收一个custom-columns
自定义列的格式.咱们能够经过它来实现自定义输出格式.api
格式为:
-o=custom-columns=列名:字段值,列名:字段值
其中字段值是经过资源的定义文件选择出来的.
如下示例咱们展现出pod的name和startTime
[centos@k8s-master ~]$ kubectl get pod --sort-by=.status.startTime -o=custom-columns=name:.metadata.name,startTime:.status.startTime name startTime stodagent-6f47976ccb-vf7kx 2019-05-14T07:19:05Z stodagent-6f47976ccb-j7m8b 2019-05-14T07:19:05Z stodagent-6f47976ccb-8fzmv 2019-05-14T07:19:05Z trackingapi-gateway-dep-79bb86bb57-x9xzp 2019-05-14T07:19:06Z consul-0 2019-05-14T07:19:28Z consul-1 2019-05-14T07:25:06Z consul-2 2019-05-14T07:25:16Z sagent-b4dd8b5b9-5m2jc 2019-05-16T09:20:17Z sagent-b4dd8b5b9-zq649 2019-05-16T17:09:37Z sagent-b4dd8b5b9-6mmst 2019-05-16T17:19:59Z easymock-dep-84767b6f75-l84r4 2019-05-16T18:00:07Z redis-cache-f87d8488c-v4zjx 2019-05-17T01:21:54Z redis-cache-f87d8488c-4d9dl 2019-05-17T01:21:54Z redis-cache-f87d8488c-kxc89 2019-05-17T09:11:11Z
这样就能够一目了解地看到它们是按时间前后顺序排序的.可是咱们能够看到,命令变得有点复杂了,若是想要和像默认输出同样把那些字段都展现出来,是否是须要定义更多的自定义输出字段,能不能在默认的输出字段后面追加自定义字段呢.答案是否认的,目前没法作到.有用户建议增长--extra-columns
参数在默认输出的基础上增长额外输出字段.可是截至目前这个pr尚未合并.待正式发布可有还须要等待数月.
有时候为了排查错误,咱们可能须要查看kubernetes里的事件资源,咱们能够按照时间顺序以方便查看
kubectl get events --sort-by=.metadata.creationTimestamp
如下咱们使用四个示例来展现如何获取一个叫做consul-0的pod的image(你们可使用任意一个pod来作练习)
一句话,条条大路通罗马,只要能熟悉掌握其中一种方法即可以完成咱们平常工做中的任务,你们没必要把全部工具都掌握,根据实际状况和本身知识体系来选择.
命令以下
[centos@k8s-master ~]$ kubectl get pod consul-0 -ogo-template='{{range .spec.containers}}{{.image}}{{end}}' consul:latest
range函数用来遍历集合对象.end用于结束遍历
kubectl get pod consul-0 -ojsonpath='{range .spec.containers[*]}{.image}{end}' consul:latest
这里和上面的go-template很是相似,不一样的是数组对象后面要跟中括号[]以代表是数组,中括号里带上星号(*)表示索引全部.
jsonpath与go-template不一样的是,jsonpath除了可使用星号
*
号索引全部的集群元素之外,还可使用数字索引(同其它编程语言同样,0表明第一个元素)或者范围索引(例如[0:1],[:1])
以上命令都不够简洁.使用jsonpath还有一种更为简洁的方法,那就是递归查找,这样能够在不知道文档的详细结构可是知道具体的属性名的时候进行查找.示例以下
[centos@k8s-master ~]$ kubectl get pod consul-0 -ojsonpath='{..image}' consul:latest consul:latest
同上面相比,这里的结果里多出了一条记录.其实这是由于status
字段里的containerStatuses
字段里也有image属性.咱们能够经过如下命令来进一步缩小查找范围
[centos@k8s-master ~]$ kubectl get pod consul-0 -ojsonpath='{.spec..image}' consul:latest
[centos@k8s-master ~]$ kubectl get po consul-0 -oyaml|yq r - spec.containers[*].image - consul:latest
示例以下:
[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq .spec.containers[].image "consul:latest"
yq也可使用递归查询方式,只不不是特别优雅,而且限制也很是大,只适合简单查看
[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '..|.image?' null null null null null "consul:latest" null null null null null null null null null null null "consul:latest" null null null
以上输出了不少null影响观看,咱们可使用grep管道把它们过滤掉
[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '..|.image?'|grep -v null "consul:latest" "consul:latest"
以上示例咱们仅仅输出了某一个字段的值,可是若是在可编程环境中使用,咱们须要的可能不只仅是普通的数值,也有多是更为复杂的对象相似,常见的为json对象.这里咱们介绍如何使用jq工具把结果输出为对象类型
如下示例咱们把image的名称和image镜像的名称作为一个json对象输出
[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '{name:.spec.containers[0].name,image:.spec.containers[0].image}' { "name": "consul", "image": "consul:latest" }
以上仅输出了一个对象,若是咱们想要输出的是数组对象呢,这里有些处理技术,请看如下示例:
[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq .status.conditions [ { "lastProbeTime": null, "lastTransitionTime": "2019-05-14T07:19:28Z", "status": "True", "type": "Initialized" }, { "lastProbeTime": null, "lastTransitionTime": "2019-05-14T07:25:06Z", "status": "True", "type": "Ready" }, { "lastProbeTime": null, "lastTransitionTime": "2019-05-14T07:25:06Z", "status": "True", "type": "ContainersReady" }, { "lastProbeTime": null, "lastTransitionTime": "2019-05-14T07:19:28Z", "status": "True", "type": "PodScheduled" } ]
咱们要把如下结果从新组装,保存为仅包含lastTransitionTime
的集群类型
如下是一种常见的错误操做方法:
[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '.status.conditions[]|{lastTransitionTime:.lastTransitionTime}' { "lastTransitionTime": "2019-05-14T07:19:28Z" } { "lastTransitionTime": "2019-05-14T07:25:06Z" } { "lastTransitionTime": "2019-05-14T07:25:06Z" } { "lastTransitionTime": "2019-05-14T07:19:28Z" }
咱们能够看到,咱们其实是取到了多个对象,可是它们并非一个数组,想要获取一个数组对象,正确的操做以下:
[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '[.status.conditions[]|{lastTransitionTime:.lastTransitionTime}]' [ { "lastTransitionTime": "2019-05-14T07:19:28Z" }, { "lastTransitionTime": "2019-05-14T07:25:06Z" }, { "lastTransitionTime": "2019-05-14T07:25:06Z" }, { "lastTransitionTime": "2019-05-14T07:19:28Z" } ]
你们仔细看看其中的差异在哪里