Ssoon

[4주차] 관찰 가능성(서비스 동작 이해) : Prometheus로 Istio 메트릭 스크래핑 본문

Istio Hands-on Study [1기]

[4주차] 관찰 가능성(서비스 동작 이해) : Prometheus로 Istio 메트릭 스크래핑

구구달스 2025. 4. 22. 10:09

🚀 Prometheus로 Istio Metrics 수집하기: 초보자를 위한 가이드

Prometheus는 강력한 metrics 수집 엔진으로, Istio와 함께 사용하면 서비스의 성능과 상태를 효과적으로 모니터링할 수 있습니다. 이 글에서는 Prometheus가 어떻게 Istio의 metrics를 수집하는지, 초보자도 이해하기 쉽게 설명합니다. Prometheus의 pull 기반 접근 방식부터 실제 metrics를 확인하는 방법까지, 단계별로 알아보겠습니다.


🌟 Prometheus란 무엇인가요?

  • Prometheus는 SoundCloud에서 시작된 오픈소스 모니터링 도구로, Google의 Borgmon에서 영감을 받았습니다.
  • 다른 metrics 수집 시스템과 달리, Prometheus는 서버가 직접 데이터를 "push"하도록 기다리는 대신, 대상에서 데이터를 "pull"하는 방식으로 동작합니다.
  • Istio 서비스 프록시나 애플리케이션이 metrics를 노출하는 endpoint를 제공하면, Prometheus가 주기적으로 이를 가져옵니다.

Prometheus는 pull 기반으로 metrics를 수집해,
애플리케이션이나 Istio 프록시의 endpoint에서 데이터를 주기적으로 가져옵니다.


🔄 Push vs Pull: 어떤 방식이 좋을까?

  • Metrics 수집에는 push와 pull 두 가지 방식이 있습니다. Push는 에이전트가 데이터를 서버로 보내는 방식이고, pull은 Prometheus처럼 서버가 데이터를 가져오는 방식입니다.
  • Prometheus의 pull 방식은 여러 서버가 동일한 대상을 스크래핑(scraping)하도록 설정고가용성(high availability)을 달성할 수 있다는 장점이 있습니다.

Prometheus의 pull 방식은 여러 서버가 동일한 대상을 스크래핑해 고가용성을 보장할 수 있습니다.


🛠️ Prometheus로 Istio Metrics 스크래핑하기

  • Istio의 서비스 프록시는 자동으로 Prometheus 포맷의 metrics를 제공합니다. 이를 스크래핑하려면 Prometheus 서버를 설정하고, 대상 Pod의 metrics endpoint를 지정하면 됩니다.
  • Prometheus는 여러 서버가 동일한 endpoint를 스크래핑하도록 설정할 수 있어, 중복 스크래핑으로 안정성을 높일 수 있습니다.

 

Prometheus는 Istio 서비스 프록시의 metrics endpoint를
주기적으로 스크래핑해 데이터를 수집합니다.


🔍 Metrics Endpoint 직접 확인해보기

  • Prometheus의 큰 장점 중 하나는 metrics endpoint를 간단한 HTTP 클라이언트나 웹 브라우저로 직접 확인할 수 있다는 점입니다.
  • curl 명령어를 사용해 Istio 서비스 프록시의 metrics를 확인할 수 있습니다.

1️⃣ Pod 목록 확인하기

  • 클러스터에서 실행 중인 Pod를 확인합니다. 
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl get pod -n istioinaction
NAME                      READY   STATUS    RESTARTS   AGE
catalog-6cf4b97d-ks72d    2/2     Running   0          76m
webapp-8578f44594-c2l9c   2/2     Running   0          47m

 

2️⃣ Curl로 Metrics 스크래핑하기

  • Istio 서비스 프록시는 기본적으로 15090 포트에서 Prometheus 포맷의 metrics를 노출합니다. 아래 명령어로 webapp Pod의 metrics를 확인할 수 있습니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl exec -it deploy/webapp -c istio-proxy -n istioinaction -- curl localhost:15090/stats/prometheus
# TYPE envoy_cluster_assignment_stale counter
envoy_cluster_assignment_stale{cluster_name="outbound|80||catalog.istioinaction.svc.cluster.local"} 0
envoy_cluster_assignment_stale{cluster_name="xds-grpc"} 0
# TYPE envoy_cluster_assignment_timeout_received counter
envoy_cluster_assignment_timeout_received{cluster_name="outbound|80||catalog.istioinaction.svc.cluster.local"} 0
envoy_cluster_assignment_timeout_received{cluster_name="xds-grpc"} 0
# TYPE envoy_cluster_bind_errors counter
envoy_cluster_bind_errors{cluster_name="outbound|80||catalog.istioinaction.svc.cluster.local"} 0
envoy_cluster_bind_errors{cluster_name="xds-grpc"} 0
...

 

  • 이 출력은 Prometheus가 이해할 수 있는 포맷으로, 다양한 metrics(예: 클러스터 연결 오류, SSL 소켓 상태 등)를 포함합니다.

Istio 서비스 프록시는 15090 포트에서 Prometheus 포맷의 metrics를 제공하며,
curl로 쉽게 확인할 수 있습니다.


🧩 Istio와 Prometheus 통합의 장점

  • Istio를 사용하는 모든 애플리케이션은 서비스 프록시가 자동으로 주입되며, 이 프록시는 Prometheus metrics를 기본적으로 노출합니다. 따라서 별도의 설정 없이 Prometheus 서버를 설정해 스크래핑을 시작할 수 있습니다. 이를 통해 애플리케이션의 성능, 오류, 네트워크 상태 등을 실시간으로 모니터링할 수 있습니다.

Istio는 서비스 프록시를 통해 Prometheus metrics를 자동으로 노출해,
별도 설정 없이 모니터링을 시작할 수 있습니다.


📌 핵심 요약

  • Prometheus의 pull 방식: Prometheus는 Istio 서비스 프록시의 metrics endpoint에서 데이터를 주기적으로 가져옵니다.
  • 고가용성: 여러 Prometheus 서버가 동일한 대상을 스크래핑해 안정성을 높일 수 있습니다.
  • 간편한 확인: Curl 명령어로 15090 포트의 metrics를 직접 확인할 수 있습니다.
  • Istio와의 통합: Istio는 서비스 프록시를 통해 Prometheus 포맷의 metrics를 자동 제공합니다.
  • 모니터링 시작: Prometheus 서버만 설정하면 즉시 Istio metrics를 수집하고 모니터링할 수 있습니다.

🚀 Prometheus와 Grafana로
Istio Observability 설정하기

Istio를 사용하면서 observability(관찰 가능성)는 시스템의 상태를 모니터링하고 문제를 빠르게 파악하는 데 필수적입니다.

Istio와 함께 Prometheus와 Grafana를 설정하여 production 환경에 적합한 모니터링 시스템을 구축하는 방법을 설명합니다. 

 


🛠️ kube-prometheus로 강력한 Observability 구축

  • kube-prometheus를 사용해 production 수준의 observability 시스템을 설정합니다.
  • kube-prometheus는 Prometheus, Prometheus Operator, Grafana, Alertmanager, node exporters 등 다양한 컴포넌트를 사전에 통합한 프로젝트입니다. 이를 통해 복잡한 설정 없이 안정적인 모니터링 환경을 구축할 수 있습니다.

📚 kube-prometheus란?

  • kube-prometheus는 Prometheus를 중심으로 Kubernetes 환경에 최적화된 모니터링 스택을 제공합니다. 주요 컴포넌트는 다음과 같습니다:
    • Prometheus: 메트릭 수집 및 저장
    • Prometheus Operator: Prometheus의 설정과 관리를 자동화
    • Grafana: 메트릭 시각화 대시보드
    • Alertmanager: 알림 관리
    • Node Exporter: 노드 수준 메트릭 수집

kube-prometheus는 Kubernetes 환경에서 통합된 모니터링 솔루션을 제공합니다.


📦 kube-prometheus-stack Helm 차트 설치

  • kube-prometheus를 설치하기 위해 Helm 차트를 사용합니다. Helm은 Kubernetes 애플리케이션 설치를 간소화하는 패키지 매니저입니다. 여기서는 kube-prometheus-stack Helm 차트를 활용해 필요한 컴포넌트를 설치합니다.

1️⃣ Helm Repository 추가 및 업데이트

  • 먼저 Prometheus Community의 Helm repository를 추가하고 최신 차트 정보를 가져옵니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "eks" chart repository
...Successfully got an update from the "flagger" chart repository
...Successfully got an update from the "prometheus-community" chart repository
Update Complete. ⎈Happy Helming!⎈

 

2️⃣ Namespace 생성 및 Helm 차트 설치

  • prom-values-2.yaml
cat << EOF > prom-values-2.yaml
prometheusOperator:
  tls:
    enabled: false #Prometheus Operator의 TLS(암호화 통신) 기능을 비활성화
  admissionWebhooks:
    patch:
      enabled: false #검증용 웹훅(admission webhook) 패치 기능을 비활성화

prometheus:
  service:
    type: NodePort
    nodePort: 30001 #Prometheus 서비스를 노드의 30001 포트에 노출
    
grafana:
  service:
    type: NodePort
    nodePort: 30002 #Grafana 서비스를 노드의 30002 포트에 노출
EOF

 

  • Prometheus와 관련된 리소스를 관리하기 위해 전용 namespace를 생성합니다.
  • 그리고 kube-prometheus-stack 차트를 설치합니다. 
    • 여기서는 두 개의 설정 파일을 지정했습니다:
      ch7/prom-values.yaml: 기본 Prometheus 설정 파일
      prom-values-2.yaml: 앞서 생성한 추가 설정 파일(NodePort 및 TLS 설정)
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl create ns prometheus
namespace/prometheus created

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ helm install prom prometheus-community/kube-prometheus-stack --version 13.13.1 \
-n prometheus -f ch7/prom-values.yaml -f prom-values-2.yaml
NAME: prom
LAST DEPLOYED: Mon Apr 28 14:54:30 2025
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace prometheus get pods -l "release=prom"

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
  • 이 명령어는 Prometheus, Grafana, Prometheus Operator 등을 포함한 모니터링 스택을 설치합니다.

Helm 차트를 사용해 kube-prometheus-stack을 설치하여 모니터링 환경을 구축합니다.


✅ 설치 확인

  • 설치가 완료되면 prometheus namespace에서 정상적으로 동작하는지 확인합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl get servicemonitors -n prometheus
NAME                                                 AGE
prom-kube-prometheus-stack-grafana                   2m42s
prom-kube-prometheus-stack-kube-controller-manager   2m42s
prom-kube-prometheus-stack-operator                  2m42s
prom-kube-prometheus-stack-prometheus                2m42s

Prometheus와 Grafana가 정상적으로 실행 중인지 확인합니다.


🔗 Istio 메트릭 수집 설정

  • 새로 설치된 Prometheus는 아직 Istio의 데이터 플레인(data-plane)과 컨트롤 플레인(control-plane) 메트릭을 수집하도록 설정되지 않았습니다. 이를 위해 Prometheus의 설정을 수정해야 합니다. 

📌 핵심 요약

  • 샘플 제거: Istio의 데모용 Prometheus와 Grafana를 제거하여 production 환경을 준비합니다.
  • kube-prometheus: Prometheus, Grafana, Alertmanager 등을 포함한 통합 모니터링 스택을 제공합니다.
  • Helm 설치: kube-prometheus-stack Helm 차트를 사용해 모니터링 환경을 쉽게 구축합니다.
  • 설치 확인: prometheus namespace의 Pod 상태를 확인하여 정상 작동 여부를 점검합니다.
  • 다음 단계: Prometheus를 설정해 Istio 메트릭을 수집하고, Grafana와 통합합니다.

📊 Prometheus Operator로
Istio 메트릭 수집 설정하기

Istio 환경에서 Prometheus를 활용해 메트릭을 수집하려면 Prometheus Operator의 ServiceMonitorPodMonitor 같은 커스텀 리소스(Custom Resources, CR)를 설정해야 합니다.

Istio의 control plane과 data plane 메트릭을 수집하도록 Prometheus를 구성하는 방법을 설명합니다.


🛠️ ServiceMonitor로 Control Plane 메트릭 수집

  • Prometheus Operator는 ServiceMonitor를 통해 특정 서비스의 메트릭을 수집하도록 설정할 수 있습니다. 여기서는 Istio의 control plane 컴포넌트(예: Istio Pilot)에서 메트릭을 수집하도록 ServiceMonitor를 구성합니다.

📝 ServiceMonitor 설정

  • 아래는 Istio control plane의 메트릭을 수집하기 위한 ServiceMonitor의 예입니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ cat ch7/service-monitor-cp.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: istio-component-monitor
  namespace: prometheus
  labels:
    monitoring: istio-components
    release: prom
spec:
  jobLabel: istio #수집된 메트릭에 추가될 job 레이블의 이름을 "istio"로 지정
  targetLabels: [app] #서비스에서 발견된 "app" 레이블을 메트릭에 전파
  selector: #모니터링할 서비스를 선택하는 레이블 선택기
    matchExpressions:
    - {key: istio, operator: In, values: [pilot]} # "istio" 레이블의 값이 "pilot"인 서비스만 선택
  namespaceSelector:
    any: true #모든 네임스페이스에서 일치하는 서비스를 찾을 수 있도록 설정
  endpoints: #메트릭을 스크래핑할 엔드포인트 설정
  - port: http-monitoring #서비스의 "http-monitoring"이라는 이름의 포트에서 메트릭을 수집
    interval: 15s #15초마다 메트릭을 수집
  • 이 설정은 다음과 같은 역할을 합니다:
    • selector: istio: pilot 레이블이 있는 서비스를 대상으로 지정합니다.
    • endpoints: http-monitoring 포트에서 15초 간격으로 메트릭을 수집합니다.
    • namespaceSelector: 모든 namespace에서 메트릭을 수집하도록 설정합니다.

🚀 ServiceMonitor 적용

  • 다음 명령어를 실행해 ServiceMonitor를 적용합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f ch7/service-monitor-cp.yaml -n prometheus
servicemonitor.monitoring.coreos.com/istio-component-monitor created
  • 적용 후 Prometheus는 control plane의 메트릭을 수집하기 시작합니다.
    예를 들어, sidecar 연결 수, configuration 충돌, mesh의 churn(변화율), 그리고 CPU/메모리 사용량 같은 중요한 telemetry 데이터를 확인할 수 있습니다.

ServiceMonitor를 사용해 Istio control plane의 메트릭을 Prometheus로 수집합니다.


🔍 Prometheus 대시보드에서 메트릭 확인

  • Prometheus가 메트릭을 수집하고 있는지 확인하려면 Prometheus의 웹 UI에 접속해야 합니다.
    브라우저에서 http://localhost:30001에 접속한 뒤, 검색창에 pilot_xds를 입력하면 control plane 메트릭을 확인할 수 있습니다. 

  • Prometheus UI에서 pilot_xds 메트릭을 검색하면 control plane의 다양한 메트릭을 시각적으로 확인할 수 있습니다.

Prometheus UI를 통해 control plane 메트릭을 실시간으로 확인할 수 있습니다.

 


📈 PodMonitor로 Data Plane 메트릭 수집

  • Istio의 data plane(istio-proxy가 포함된 Pod)에서 메트릭을 수집하려면 PodMonitor 리소스를 사용합니다.
  • PodMonitor는 특정 Pod에서 메트릭을 수집하도록 Prometheus를 설정합니다.

📝 PodMonitor 설정

  • 아래는 istio-proxy 컨테이너가 포함된 Pod의 메트릭을 수집하기 위한 PodMonitor 설정입니다:
    • Istio의 istio-proxy 사이드카 들을 대상으로,
      15초마다 /stats/prometheus 엔드포인트에서 메트릭을 수집하고,
      Prometheus가 잘 인식할 수 있도록 라벨도 깔끔하게 정리하는 설정
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ cat ch7/pod-monitor-dp.yaml
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: envoy-stats-monitor
  namespace: prometheus
  labels:
    monitoring: istio-proxies
    release: prom
spec:
  selector: #어떤 파드들을 모니터링할지 선택하는 규칙
    matchExpressions:
    - {key: istio-prometheus-ignore, operator: DoesNotExist} #istio-prometheus-ignore 라는 라벨이 없는 파드만
  namespaceSelector:
    any: true #어느 네임스페이스에 있는 파드라도 상관없이 찾아서 모니터링
  jobLabel: envoy-stats #수집된 데이터에 "job=envoy-stats" 라는 라벨을 붙여서 구분
  podMetricsEndpoints:
  - path: /stats/prometheus #파드 안의 어느 경로에서 메트릭을 읽을지 설정
    interval: 15s #경로에 15초마다 요청해서 데이터를 가져옵니다.
    relabelings: #가져오기 전에 레이블들을 수정하는 규칙
    - action: keep
      sourceLabels: [__meta_kubernetes_pod_container_name]
      regex: "istio-proxy" #컨테이너 이름이 istio-proxy인 경우만 남깁니다, Istio 사이드카 프록시만 모니터링
    - action: keep
      sourceLabels: [__meta_kubernetes_pod_annotationpresent_prometheus_io_scrape]
      #prometheus.io/scrape 어노테이션이 있는 파드만 수집; 메트릭을 노출한다고 명시적으로 표시된 파드들만
    - sourceLabels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
      action: replace
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
      targetLabel: __address__
      ##주소(__address__)를 재조정; 파드의 IP 주소 + 포트 번호를 제대로 합쳐서 요청할 수 있도록 합니다.
    - action: labeldrop
      regex: "__meta_kubernetes_pod_label_(.+)"
      #__meta_kubernetes_pod_label_* 형태로 붙은 메타데이터 라벨은 다 삭제; 쓸모없는 내부 라벨을 깔끔하게 지우는 작업
    - sourceLabels: [__meta_kubernetes_namespace]
      action: replace
      targetLabel: namespace
      #파드가 속한 네임스페이스 이름을 namespace라는 라벨로 붙입니다.
    - sourceLabels: [__meta_kubernetes_pod_name]
      action: replace
      targetLabel: pod_name
      #파드의 이름을 pod_name이라는 라벨로 붙입니다.
  • 이 설정의 주요 내용은 다음과 같습니다:
    • selector: istio-prometheus-ignore 레이블이 없는 Pod를 대상으로 지정합니다.
    • podMetricsEndpoints: /stats/prometheus 경로에서 15초 간격으로 메트릭을 수집합니다.
    • relabelings: istio-proxy 컨테이너를 식별하고, 메트릭의 레이블을 조정해 namespace와 Pod 이름을 명확히 표시합니다.

🚀 PodMonitor 적용

  • 다음 명령어를 실행해 PodMonitor를 적용합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f ch7/pod-monitor-dp.yaml -n prometheus
podmonitor.monitoring.coreos.com/envoy-stats-monitor created

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl get podmonitor -n prometheus
NAME                  AGE
envoy-stats-monitor   13s

🌊 Data Plane 메트릭 생성 및 확인

  • PodMonitor 적용 후, data plane에서 메트릭이 생성되도록 트래픽을 발생시켜야 합니다. 다음 명령어를 실행해 샘플 트래픽을 생성합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ for in in {1..10}; do curl -s http://webapp.istioinaction.io:30000/ ; sleep 0.5; done
  • Prometheus UI에서 istio_requests_total 메트릭을 검색하면 data plane의 요청 관련 메트릭을 확인할 수 있습니다.

PodMonitor와 트래픽 생성을 통해 data plane 메트릭을 Prometheus로 수집하고 확인합니다.

 


📌 핵심 요약

  • ServiceMonitor: Istio control plane(Pilot)의 메트릭을 수집하도록 Prometheus를 설정합니다.
  • PodMonitor: istio-proxy가 포함된 Pod의 data plane 메트릭을 수집합니다.
  • 메트릭 확인: Prometheus UI에서 pilot_xds와 istio_requests_total 같은 메트릭을 검색해 control plane과 data plane의 상태를 확인합니다.
  • 트래픽 생성: 샘플 요청을 보내 data plane 메트릭을 생성합니다.
  • 다음 단계: 수집된 메트릭을 Grafana 대시보드로 시각화합니다

 

Comments