上一节我们介绍了一些基本的命令,这一节我们介绍一些更为复杂的命令.
pod排序使用kubectl get pod获取pod资源默认是以名称排序的,有些时候我们可能希望按其它顺序排序.比如说我们想要按照节点来排序.以便可以看到不同的节点上都运行着哪些pod.
这个需求可以使用linux命令很简单实现.使用kubectl get pod加上-owide参数就可以显示pod所在的节点.我们再使用linux sort命令就可以对结果按照特定字段排序了.以下示例是按节点排序后的结果
[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我们可以看到,已经以节点名称来排序的,这里不太优雅的是标题被排在了最后面.但是无伤大雅.
其实kubectl get命令有一个--sort-by参数.我们可以通过它来指定要按照资源的哪一个字段来排序,而不局限于展示出的字段.以下是使用--sort-by参数按节点名称排序后的结果.
[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实例,它们被排在了最下面.
我们能不能把startTime字段也输出出来呢,这样就可以直接地看到输出时间了,是不是按这个时间排序的也就一目了然了.答案是肯定的.
自定义显示字段前面一节我们遇到一个问题,我们有一个需求把pod的startTime显示出来.其实这个需求是可以实现的,kubectl get的输入格式参数-o(或--output)接收一个custom-columns自定义列的格式.我们可以通过它来实现自定义输出格式.
格式为:
-o=custom-columns=列名:字段值,列名:字段值
其中字段值是通过资源的定义文件选择出来的.