一起endpoint迷路的问题排查总结
今天上班,一到工位上,就有同事和我说有客户反映自己的容器的一些指标在监控平台不上报了,我当时一看机器所在的监控,发现确实是这样
确实存在某个点开始数据就没了,主要这个点当时也没有任何的操作变更,于是就开始开启了排查思路
总结链路:
链路是这个样子
Grafana -> prom -> servicemonitor -> service -> endpoint -> pod(daemonset)
当时发现service也有,endpoint也有,然后访问边缘端的metric接口发现也有数据,但就是 Grafana 上没有数据,排查步骤如下
-
确认是部分机器存在丢失,说明整个链路没有彻底断掉,怀疑是这个节点上报存在网络问题
-
在机器上ping外网发现没问题
-
然后我们查看这个service对应的endpoint,居然发现这个service没有这个endpoint,关键label也能匹配上,这就很奇怪了
-
于是我们在找这个 endpoint 的异常,发现一个这个很奇怪的 annotation
然后一排查发现这个就是代表 endpoint 太多超出限制导致被截断了, 确实我们的集群有超过1000个node,导致这个限制被触发了 -
查阅资料发现k8s在1.19之前默认的endpoint就只支持1000个,在1.19之后引入了新的CRD:endpointslices,通过分片的方式能够支持1000以上的endpoint;参考这篇技术博客 medium.com
-
但是查看我们TKE集群的版本,是1.22版本,也就是已经有了endpointslice,但是这个endpointslice 没有被用上,这就很奇怪了,于是继续排查prometheus
-
在网上查询到这样一个 changelog
说明prometheus会自动支持endpointslice的发现,但是我们的集群就是没有,于是紧急拉oncall排查,发现的缺失集群的prometheus的版本太低了,而且机器的数量刚好是1020个,导致有20个机器的指标丢失,没有被service映射到后端的endpoint