1

一个节点有大量的指标收集信息,例如在 cgroups kubepods.slice 下。但要完成指标,您必须将 pod 指标与 pod 名称相关联。名称和命名空间本身是 pod 的一种静态度量,因此它们与 pod uuid 一起是描述 pod 的首要条件。如何从不使用 kubectl 且不访问 pod 的远程 kubernetes 数据库的节点获取此信息?

我只能找到容器 ids/pod uuids 作为 cgroup 结构的一部分。名称和命名空间在哪里?(理想情况下是一个完整的 yaml 清单,将其存储在运行 pod 的节点上并不难,对吧?)

如果它没有这个信息 - 为什么?这违反了收集实践,您不能将检测作为一个单独的程序来收集 pod 指标 - 您将需要外部进程来对此类指标、对应的 uuid 到 pod 名称和命名空间进行后处理,这绝对不是正确的方法,当您可以在节点本身上运行 1 个小程序

4

1 回答 1

1

您可以使用docker检查:

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 的数据目录来维护 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 放在 overlay 目录下。请参阅下面的 OP 评论。

于 2021-10-19T21:06:40.343 回答