LabHub
开始
学习 学习路径 课程

Istio 实测实验室

指标会被数两次,标签要花钱

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

한 줄 요약

사이드카는 요청마다 표준 지표(istio_requests_total·istio_request_duration_milliseconds 등)를 올리고 접근 로그를 남긴다. Telemetry API 는 그것을 네임스페이스·워크로드 단위로 고치는 장치다 — 라벨을 더하고(tagOverrides), 빼고(REMOVE), 지표를 끄고(disabled), 로그를 조건으로 거른다(filter).

왜 이게 필요했나

메시의 약속 가운데 하나는 '코드를 고치지 않고도 모든 서비스의 요청 수·오류율·지연을 같은 모양으로 본다' 는 것이다. 사이드카가 모든 요청을 지나가므로 가능하다. 그런데 그대로 두면 두 가지 문제가 생긴다.

첫째, 비용이다. 표준 지표는 출발지·목적지·응답 코드·프로토콜 같은 라벨을 여럿 달고, 지연 히스토그램은 버킷마다 시계열이 생긴다. 서비스가 수백 개면 Prometheus 가 먼저 버거워진다. 둘째, 모자람이다. '어느 고객(tenant)의 요청인가' 처럼 업무에 필요한 차원은 표준 라벨에 없다.

Telemetry API 는 이 둘을 설정 하나로 다룬다. 메시 전체(istio-system), 네임스페이스, 워크로드 셀렉터 순으로 좁혀 적용할 수 있다.

어떻게 동작하나

지표는 두 번 세어진다. 사이드카 모드에서 요청 하나는 보내는 쪽 사이드카(reporter="source")와 받는 쪽 사이드카(reporter="destination")가 각각 센다. 둘 다 메시 안이면 같은 수가 두 번 쌓이므로, 합계를 낼 때는 reporter 를 하나로 고정해야 한다. 받는 쪽 기준(destination)이 보통 '서비스가 받은 요청' 에 가깝다.

Prometheus 는 긁어 간다. 배포판의 Prometheus 애드온은 파드 애너테이션을 보고 사이드카의 병합된 지표 포트를 주기적으로(이 설정은 15초) 긁는다. 그래서 요청을 보내고 한 주기쯤 뒤에 질의 결과에 나타난다. 사이드카가 지금 들고 있는 값은 pilot-agent request GET stats/prometheus 로 곧바로 볼 수 있다.

Telemetry 로 고치는 것

설정 하는 일
tagOverrides: {tenant: {value: "request.headers['x-tenant']"}} 요청 속성으로 새 라벨을 만든다
tagOverrides: {request_protocol: {operation: REMOVE}} 표준 라벨을 뺀다
match: {metric: REQUEST_DURATION}, disabled: true 그 지표를 만들지 않는다
accessLogging: [{filter: {expression: "response.code >= 400"}}] 조건에 맞는 요청만 로그를 남긴다

라벨 값이 끝없이 늘어나는 것(사용자 id·요청 id)을 라벨로 만들면 시계열이 폭발한다. 라벨을 더할 때는 값의 가짓수를 먼저 생각한다. 그리고 카운터는 지워지지 않으므로, 설정을 바꾼 효과는 새로 생기는 시계열에서만 보인다.

PromQL 로 비율을 낸다. 오류율은 sum(5xx) / sum(전체) 다. 운영 대시보드는 rate(…[5m]) 로 최근 창의 비율을 보지만, 요청이 적은 실험에서는 카운터끼리 나눠도 된다. 두 경우 모두 분자와 분모가 같은 reporter·같은 목적지를 가리켜야 한다.

현장에서 만나는 모습

"대시보드의 요청 수가 로드밸런서보다 두 배입니다." reporter 를 거르지 않고 더했다.

"tenant 라벨을 붙였더니 Prometheus 메모리가 뛰었습니다." 고객이 수만이었다. 라벨이 아니라 로그나 트레이스로 봐야 할 차원이다.

"접근 로그를 줄였더니 장애 분석이 어려워졌습니다." 오류만 남기면 '정상이던 요청이 언제부터 느려졌나' 를 볼 수 없다. 조건식에 지연(response.duration)을 함께 넣는 경우가 많다.

공식 문서: Telemetry API · Customizing Istio Metrics · Istio Standard Metrics · Envoy Access Logs · Prometheus addon

다음 실습에서 할 것

배포판의 Prometheus 애드온이 함께 올라간 메시에서 요청을 흘려 istio_requests_total 을 HTTP API 로 묻고, 같은 요청이 source·destination 으로 두 번 세어지는 것을 본다. Telemetry API 로 tenant 라벨을 더하고, 쓰지 않는 라벨을 빼고, 지연 지표를 끄고, 접근 로그를 오류만 남기게 거른 뒤, 마지막으로 오류율을 PromQL 한 줄로 낸다.