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访问入口:
1 |
(base) root@debian:~/k8s# kubectl proxy & |
然后访问kube-proxy的端口,指定某个node(我这里叫做debian)即可:
1 |
curl http://localhost:8001/api/v1/nodes/debian/proxy/metrics/cadvisor |
就可以访问到对应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标签。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

1
1
1