今天上班,一到工位上,就有同事和我說有客戶反映自己的容器的一些指標在監控平臺不上報了,我當時一看機器所在的監控,發現確實是這樣
確實存在某個點開始數據就沒了,主要這個點當時也沒有任何的操作變更,于是就開始開啟了排查思路
總結鏈路:
鏈路是這個樣子
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