Kubernetes 教程:根据 PID 获取 Pod 名称 (2)

根据 Pod UID 找到 Service Account 的 token 挂载目录:

$ ll /var/lib/kubelet/pods/8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/volumes/kubernetes.io~secret/prometheus-k8s-token-p7bgb/ 总用量 0 lrwxrwxrwx 1 root root 13 7月 10 21:24 ca.crt -> ..data/ca.crt lrwxrwxrwx 1 root root 16 7月 10 21:24 namespace -> ..data/namespace lrwxrwxrwx 1 root root 12 7月 10 21:24 token -> ..data/token

获取 token 信息:

$ export TOKEN=$(cat /var/lib/kubelet/pods/8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/volumes/kubernetes.io~secret/prometheus-k8s-token-p7bgb/token)

通过 curl 直接访问指标:

$ curl -s -H "Authorization: Bearer $TOKEN" --cacert /var/lib/kubelet/pods/8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/volumes/kubernetes.io~secret/prometheus-k8s-token-p7bgb/ca.crt --insecure https://127.0.0.1:10250/metrics/cadvisor

当然,如果你能找到集群管理员的证书、密钥和 CA 证书,也可以直接使用它们来访问,我就不展开说了。

5. 真奇技淫巧

最后再介绍一个思路清奇的方案,虽然有点小瑕疵,但思路很巧妙,大家可以借鉴一下。Kubernetes 创建的容器中的主机名对应的就是 Pod 名称,沿着这个思路,我们可以得到一个更巧妙的方法,通过 PID 的 uts namespace 来获得容器的主机名,进而就可以知道 Pod 名称,具体可以借助 nsenter 这个工具:

$ nsenter -t 14338 --uts hostname prometheus-k8s-0

这么一看,确实比上面的方法优雅多了,但这个方法会有一点小问题,当容器使用 HostNetwork 模式运行时,hostname 是宿主机的 hostname,通过这种方法就得不到 Pod 名称。虽然不是通用的方法,但思路还是可以借鉴的,除了使用 nsenter 获取主机名外,还可以通过环境变量来获取,命令如下:

$ xargs -0 -L1 -a /proc/14338/environ | grep HOSTNAME HOSTNAME=prometheus-k8s-0

解释一下这几个参数:

-0 : 表示使用 null 作为分隔符

-L : 表示指定多少行作为一个命令行参数。-L1 就表示指定 1 行作为命令行参数,即每一行分别运行一次命令。xargs 的作用就是将标准输入转换为命令行参数,如果 xargs 后面没有跟上真正要执行的命令,就表示使用默认的 echo。所以这里的 -L1 就表示分隔出来的每一行分别运行一次 echo 命令。

-a : 从文件中读取内容,而不是从标准输入读取。

如果你还不理解,好吧我尽力了。

最后再推荐一个项目,可以找到所有容器的 PID 以及对应的 Pod 信息,项目地址:pid2pod。

Kubernetes 1.18.2 1.17.5 1.16.9 1.15.12离线安装包发布地址 ,欢迎体验。 使用了最新的sealos v3.3.6版本。 作了主机名解析配置优化,lvscare 挂载/lib/module解决开机启动ipvs加载问题, 修复lvscare社区netlink与3.10内核不兼容问题,sealos生成百年证书等特性。更多特性 https://github.com/fanux/sealos 。欢迎扫描下方的二维码加入钉钉群 ,钉钉群已经集成sealos的机器人实时可以看到sealos的动态。

Kubernetes 教程:根据 PID 获取 Pod 名称

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzzgy.html