kubernetes集群管理命令(三)

系列目录html

前面两节咱们由浅入深介绍了很多kubernetes管理比较经常使用的命令.本节咱们经过案例讲解一些须要更为复杂的操做才能完成的命令.linux

选择一个deployment下的全部pod

前面讲到过,kubernetes的deployment和pod的命令上有关联关系,咱们能够经过查看deployment的名称,而后记下来,而后再查找全部的pod经过grep输入deploy的名称为关键字进行过滤.redis

好比集群中有如下deployment编程

[centos@k8s-master ~]$ kubectl get deploy
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
easymock-dep              1/1     1            1           21h
helloworld                1/1     1            1           88m
redis-cache               0/3     3            0           6h5m
sagent                    3/3     3            3           2d1h
stodagent                 3/3     3            3           6d23h
trackingapi-gateway-dep   1/1     1            1           28d

若是咱们想要找helloworld所控制的pod,咱们就能够经过如下命令来达到效果json

[centos@k8s-master ~]$ kubectl get pod|grep helloworld
helloworld-66fc98fd57-lc7tm                1/1     Running            0          89m

可是这种匹配多是不许确的,若是仅仅是查看可能没问题,可是在编程环境中这样作显然不是好的办法.前面咱们提到过先经过kubectl get deploy helloworld -ojson而后经过jq工具拿到selector,而后使用kubectl get pod -l=查找到的标签.这里标签须要咱们手动输入,由于选择器里过滤到的结果是"key":"value"格式,而-l接受的格式为key=value形式,固然咱们也能够经过简单的命令转换以上两种格式.可是选择器里也可能包含多个标签(以下面示例),这样咱们经过简单命令很难处理了.centos

[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq .spec.selector.matchLabels
{
  "app": "helloworld",
  "version": "1.0"
}

下面咱们一步步讲解如何经过可编程的方式根据以上信息选择名为helloworld的deployment所控制的全部podapi

首先,以上的键appversion都是由用户定义的,而且不知道共有多少个,咱们无法直接经过.属性名的方式获取到它,咱们能够经过jq的to_entries把它转为键值数组,数组是能够遍历的.操做以下:数组

[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq '.spec.selector.matchLabels|to_entries'
[
  {
    "key": "app",
    "value": "helloworld"
  },
  {
    "key": "version",
    "value": "1.0"
  }
]

这样数组里的全部对象都包含两个键值,且键是固定的(分别为key和value),这样key咱们就都全知道了.下面咱们把它们组装成app=helloworld这样形式,以便kubectl get po-l参数可用bash

[centos@k8s-master ~]$  kubectl get deploy helloworld -ojson|jq '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value)"'
"app=helloworld"
"version=1.0"

以上的操做有一点很关键那就是使用to_entries函数把对象转为数组.后面管道跟.[]获取数组对象.后面咱们把结果放在""把结果拼接为字符串这里\为jq的语法,在字符串里使用""能够把后面跟的括号内的内容识别为命令,而不是普通字符串.app

这样基本知足要求了,可是有多个label时,-l接收的参数形式为lable1=value1,label2=value2这样形式的.所以咱们要删除这两个字符串的换行符,把它们合并到一行,而且中间加一个逗号.

以上字符串外面都包了一层引号(""),虽然-l变量也能够接收带引号的,可是也能够不要引号,jq里经过参数-r(aw)来获取原始字符串,要把结果合并为一行则使用-j(oin),改造后的命令以下

[centos@k8s-master ~]$  kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'
app=helloworld,version=1.0,

以上结果基本上达到预期效果,只是最后面多了一个逗号,咱们能够接一个sed管道把它去掉

kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'|sed "s/.$//"
app=helloworld,version=1.0

咱们把它赋值给一个变量,而后在选择pod的时候使用它

[centos@k8s-master ~]$ label=$( kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'|sed "s/.$//")
[centos@k8s-master ~]$ kubectl get pod -l=$label
NAME                          READY   STATUS    RESTARTS   AGE
helloworld-66fc98fd57-lc7tm   1/1     Running   0          3h22m

显示集群中全部pod的标签

把集群中全部的pod所有列出来很是容易.使用kubectl get pod --all-namespace便可.重要的是咱们要循环遍历全部的pod,把它们的名称和标签信息过滤出来展现.

前面咱们说过,在使用kubectl get pod时若是使用-o=name即可以只列出pod的名称.它并非简单地把kubectl get po命令展现的名称过滤出来,而是经过资源类型/资源名称的方式展现.好比有个pod名称叫做consul-0,使用kubectl get pod -o=name展现出来它的名称为pod/consul-0,这样咱们就能够直接使用kubectl get来获取到它

[centos@k8s-master ~]$ kubectl get pod/consul-0
NAME       READY   STATUS    RESTARTS   AGE
consul-0   1/1     Running   0          3d2h

k8s除了支持kubectl get+资源类型+资源名称外,还支持kubectl get 资源类型/资源名称这种形式.虽然平时咱们不常常这样写,可是有特定场景下很是有用.

这样,咱们就能够遍历kubectl get pod -o=name的结果,在循环中取出每一个pod的编排信息,而后从中过滤出咱们想要的信息(即pod的标签信息),操做和上面获取matchLabels有不少相似的地方.

关键代码以下:

[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"'; done
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-0
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-1
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-2
 app=easymock
 pod-template-hash=84767b6f75
 app=helloworld
 pod-template-hash=d5d5c5866
 version=1.0
 app=helloworld
 pod-template-hash=d5d5c5866
 version=1.0
 app=helloworld
...

以上循环获取到的每个pod的名称,而后遍历他们,取出它们的.metadata.labels字段,后面是对键值的从新组装,和上面获取deploy下的pod一节的操做相似.

从输出结果中能够看出,咱们只输出的全部pod的标签,这样可读性是很是差的,咱们也没法肯定某一个标签归属于哪个pod.咱们须要把它们的名字也输出:

[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"'; done
Labels for pod/consul-0
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-0
Labels for pod/consul-1
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-1
Labels for pod/consul-2
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-2
Labels for pod/easymock-dep-84767b6f75-l84r4
 app=easymock
 pod-template-hash=84767b6f75
Labels for pod/helloworld-d5d5c5866-24nzr
 app=helloworld
 pod-template-hash=d5d5c5866
 version=1.0
 ...

这查比前面清析一些了,可是仍然不是十分容易识别,咱们在遍历的时候每一个item结束后输出一个空行,这样把不一样的结果用空行隔离开来,可读性更高.

[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"';printf "\n"; done
Labels for pod/consul-0
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-0

Labels for pod/consul-1
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-1

Labels for pod/consul-2
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-2

Labels for pod/easymock-dep-84767b6f75-l84r4
 app=easymock
 pod-template-hash=84767b6f75

这样基本ok了,咱们使用grep把名称着色显示,这样在屏幕上的输出可读性就更高了.

[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"|grep --color -E '[^/]+$'; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"';printf "\n"; done
Labels for pod/consul-0
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-0

Labels for pod/consul-1
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-1

Labels for pod/consul-2
 app=consul
 controller-revision-hash=consul-744777c4bd
 statefulset.kubernetes.io/pod-name=consul-2

你们从上面文本中可能并看不出差异,可是若是是在linux终端就能够看到pod的名称都被着色显示了.

相关文章
相关标签/搜索