Istio 升級后踩的坑
背景
前段時間我們將 istio 版本升級到 1.12 后導致現(xiàn)有的應用監(jiān)控有部分數(shù)據(jù)丟失(頁面上顯示不出來)。
- 一個是應用基礎(chǔ)信息丟失。
- 再一個是應用 JVM 數(shù)據(jù)丟失。
- 接口維度的監(jiān)控數(shù)據(jù)丟失。



修復
基礎(chǔ)信息
首先是第一個基礎(chǔ)信息丟失的問題,頁面上其實顯示的是我們的一個聚合指標istio_requests_total:source:rate1m。
聚合后可以將多個指標合并為一個,減少系統(tǒng)壓力
具體可以參考 Istio 的最佳實踐 Observability Best Practices 有詳細說明。
本質(zhì)上是通過以上四個維度進行統(tǒng)計 istio_requests_total;但在升級之后查看原始數(shù)據(jù)發(fā)現(xiàn)丟失了 destination_app, source_app 這兩個 tag。
至于為啥丟失,查了許久,最后在升級后的資源文件 stats-filter-1.12.yaml 中找到了答案:

升級后新增了 tags_to_remove 標記,將我們所需要的兩個 tag 直接刪掉了。
后續(xù)在當前 namespace 下重新建一個 EnvoyFilter 資源覆蓋掉默認的便能恢復這兩個 tag,修復后監(jiān)控頁面也顯示正常了。
EnvoyFilter 是實時生效的,并不需要重建應用 Pod。
JVM 監(jiān)控
JVM 數(shù)據(jù)丟失的這個應用,直接進入 Pod 查看暴露出的 metric,發(fā)現(xiàn)數(shù)據(jù)都有,一切正常。
說明不是數(shù)據(jù)源的問題,那就可能是數(shù)據(jù)采集節(jié)點的問題了。
進入VictoriaMetrics 的 target 頁面發(fā)現(xiàn)應用確實已經(jīng)下線,原來是采集的端口不通導致的。
我們使用 VictoriaMetrics 代替了 Prometheus。

而這個端口 15020 之前并未使用,我們使用的是另外一個自定義端口和端點來采集數(shù)據(jù)。
經(jīng)過查閱發(fā)現(xiàn) 15020 是 istio 默認的端口:

原來在默認情況下 Istio 會為所有的數(shù)據(jù)面 Pod 加上:
這個注解用于采集數(shù)據(jù),由于我們是自定義的端點,所以需要修改默認行為:

在控制面將 --set meshConfig.enablePrometheusMerge=false 設(shè)置為 false,其實官方文檔已經(jīng)說明,如果不是使用的標準 prometheus.io 注解,需要將這個設(shè)置為 false。
修改后需要重建應用 Pod 方能生效。
有了 url 這個 tag 后,接口監(jiān)控頁也恢復了正常。
接口維度
接口維度的數(shù)據(jù)丟失和基本數(shù)據(jù)丟失的原因類似,本質(zhì)上也是原始數(shù)據(jù)中缺少了 url 這個 tag,因為我們所聚合的指標使用了 url:
最終參考了 MetricConfig 自定義了 URL 的tag.

但這也有個大前提,當我們 tag 的指標沒有在默認 tag 列表中時,需要在 Deployment 或者是 Istio 控制面中全局加入我們自定義的 tag 聲明。
比如這里新增了 url 的 tag,那么就需要在控制面中加入:
修改了控制面后需要重新構(gòu)建 Pod 后才會生效。
EnvoyFilter的問題
查看MetricConfig的配置后發(fā)現(xiàn)是可以直接去掉指標以及去掉指標中的 tag ,這個很有用,能夠大大減低指標采集系統(tǒng) VictoriaMetrics 的系統(tǒng)負載。
于是參考了官方的示例,去掉了一些 tag,同時還去掉了指標:istio_request_messages_total。
但并沒有生效,于是換成了在 v1.12 中新增的 Telemetry API。
使用 Telemetry API

但是參考了官方文檔后發(fā)現(xiàn)依然不能生效,GRPC_REQUEST_MESSAGES 所對應的 istio_request_messages_total 指標依然存在。
接著在我領(lǐng)導查看 Istio 源碼以及相關(guān) issue 后發(fā)現(xiàn) Telemetry API 和 EnvoyFilter 是不能同時存在的,也就是說會優(yōu)先使用 EnvoyFilter;這也就是為什么我之前配置沒有生效的原因。

后初始化 EnvoyFilter

正如這個 issue 中所說,需要刪掉現(xiàn)在所有的 EnvoyFilter;刪除后果然就生效了。
新的 Telemetry API 不但語義更加清晰,功能也一樣沒少,借助他我們依然可以自定義、刪除指標、tag 等。
比如以上配置便可以刪除掉 GRPC_RESPONSE_MESSAGES 指標,新增一個 url 的指標,同時在所有指標中刪除了 source_workload 這個 tag。
借助于這一個聲明文件便能滿足我們多個需求。
裁剪指標
后續(xù)根據(jù)我們實際需求借助于 Telemetry API 裁剪掉了許多指標和 tag,使得指標系統(tǒng)負載下降了一半左右。

效果相當明顯。
總結(jié)
本次定位修復 Istio 升級后帶來的指標系統(tǒng)問題收獲巨大,之前對 Istio 一直只停留在理論階段,只知道他可以實現(xiàn)傳統(tǒng)微服務(wù)中對接口粒度的控制,完美彌補了 k8s 只有服務(wù)層級的粗粒度控制;
這兩周下來對一個現(xiàn)代云原生監(jiān)控系統(tǒng)也有了系統(tǒng)的認識,從 App->Pod->sidecar->VictoriaMetrics(Prometheus)->Grafana 這一套流程中每個環(huán)節(jié)都可能會出錯;
所以學無止境吧,幸好借助公司業(yè)務(wù)場景后續(xù)還有更多機會參與實踐。
































