在cgroups kubepods下,节点有大量用于度量收集的信息。比如切片。但是为了完成这个度量,你必须把一个pod度量和一个pod名称联系起来。名称和名称空间本身是pod的一种静态度量,因此它们是与pod uid一起用来描述pod的第一件事。我如何从不使用kubectl和不访问远程kubernetes数据库的节点获得此信息?
我只能找到容器id/pod id作为cgroup结构的一部分。名称和名称空间在哪里?(理想情况下是一个完整的yaml清单,将它存储在运行pod的节点上并不难,对吧?)
如果它没有这个信息-为什么?这违反了收集实践,您不能将检测作为收集pod指标的单个程序来执行—您将需要外部进程来对这些指标进行后处理,为pod名称和名称空间提供相应的uid,当您可以在节点本身上运行1个小程序时,这绝对不是正确的方法
您可以使用docker
inspect:
docker inspect <container-id> --format='{{index .Config.Labels "io.kubernetes.pod.name"}
docker inspect <container-id> --format='{{index .Config.Labels "io.kubernetes.pod.namespace"}}'
下面的命令将列出该节点上运行的所有pod及其命名空间。你可以使用docker的data目录,它在那里维护pod信息。
find /var/lib/docker -name config.v2.json -exec perl -lnpe 's/.*pod.name"*s*:s*"*([^"]+).*pod.namespace"*s*:s*"*([^"]+).*/pod-name=$1 pod-namespace=$2/g' {} + |awk '!a[$0]++'|column -t
例子:
find /var/lib/docker -name config.v2.json -exec perl -lnpe 's/.*pod.name"*s*:s*"*([^"]+).*pod.namespace"*s*:s*"*([^"]+).*/pod-name=$1 pod-namespace=$2/g' {} + |awk '!a[$0]++'|column -t
pod-name=huha pod-namespace=foo
pod-name=zoobar1 pod-namespace=default
pod-name=kube-proxy-l2hsb pod-namespace=kube-system
pod-name=weave-net-rbbwf pod-namespace=kube-system
pod-name=zoobar2 pod-namespace=default
IMO,解析可以用jq
完成,我在这里使用regex
来展示使用docker data dir.
获取这些值的可能性注意:对于crio
,类似的json放在覆盖目录下。