如何在该 pod 的节点 运行 上获取 pod 名称和命名空间?

How to get a pod name and namespace on a node running that pod?

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

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

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

上有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= pod-namespace=/g' {} + |awk '!a[[=11=]]++'|column -t

示例:

find /var/lib/docker -name config.v2.json -exec perl -lnpe 's/.*pod\.name"*\s*:\s*"*([^"]+).*pod\.namespace"*\s*:\s*"*([^"]+).*/pod-name= pod-namespace=/g' {} + |awk '!a[[=12=]]++'|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 数据目录获取这些值的可能性。

注意:对于crio,类似的json被放置在覆盖目录下。请参阅下面的 OP 评论。