kubelet cadvisor采集不到container_name和pod_name的问题

据运维同时反馈,在kubernetes 1.16集群应用kubernetes 1.15集群的prometheus规则时,kubelet cadvisor的container metrics缺少了container_name和pod_name的label。

定位

首先需要观察一下2个版本kubernetes的metrics结构有什么差异。

先启动kube-proxy,可以启动一个免认证的apiserver访问入口:

然后访问kube-proxy的端口,指定某个node(我这里叫做debian)即可:

就可以访问到对应node上kubelet的cadvisor metrics了。

发现1.16集群的确没有pod_name和container_name标签。

分析

想必是kubernetes代码有变化,所以可以去github仓库搜索container_name或者pod_name,看一下有什么线索。

于是通过markdown格式的changelog,很明显的看到pod_name和container_name标签在1.16版本被移出,并且使用pod和name取代。(地址:https://github.com/kubernetes/kubernetes/search?l=Markdown&q=container_name

点击关联的issue,可以看到代码差异:

但是运维同学还反馈1.13集群只有pod和name字段,反而没有pod_name和container_name。

我们可以选择release-1.13分支的代码,然后看一下对应文件的同样位置,会发现1.13的确是这样(地址:https://github.com/kubernetes/kubernetes/blob/release-1.13/pkg/kubelet/server/server.go#L866)。

结论

因此,pod_name和container_name是1.13引入,pod和name是1.14引入,然后1.16删除了pod_name和container_name,最新版本应该使用pod和container标签。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~