[4주차] 관찰 가능성(서비스 동작 이해) : Istio 메트릭 살펴보기
🔍 Istio Metrics로 시스템의 비밀을 풀어보자!
- Istio는 데이터 플레인(data plane)과 컨트롤 플레인(control plane)을 통해 시스템의 런타임 동작을 깊이 이해할 수 있는 다양한 메트릭(metrics)을 제공합니다. 데이터 플레인은 요청을 처리하고, 컨트롤 플레인은 데이터 플레인을 구성하는 역할을 합니다. 이 메트릭들은 애플리케이션 네트워크와 서비스 메쉬의 운영 상태를 파악하는 데 중요한 통찰을 제공합니다.
Istio는 데이터 플레인과 컨트롤 플레인을 통해
애플리케이션 네트워크와 서비스 메쉬의 상태를 파악할 수 있는 풍부한 메트릭을 제공합니다.
🚀 데이터 플레인에서 수집되는 메트릭
네트워크의 맥박을 확인하는 Envoy 프록시
- Istio의 데이터 플레인에서 Envoy 프록시는 연결, 요청, 런타임과 관련된 다양한 메트릭을 수집합니다. 이를 통해 서비스의 네트워크와 통신 상태를 상세히 파악할 수 있습니다.
- 이전 챕터에서 남아 있는 리소스를 정리합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl delete -n istioinaction deploy,svc,gw,vs,dr,envoyfilter --all
No resources found
- 다음으로, 애플리케이션을 배포합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f services/catalog/kubernetes/catalog.yaml -n istioinaction
serviceaccount/catalog created
service/catalog created
deployment.apps/catalog created
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f services/webapp/kubernetes/webapp.yaml -n istioinaction
serviceaccount/webapp created
service/webapp created
deployment.apps/webapp created
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -f services/webapp/istio/webapp-catalog-gw-vs.yaml -n istioinaction
gateway.networking.istio.io/coolstore-gateway created
virtualservice.networking.istio.io/webapp-virtualservice created
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl get deploy,pod,svc,ep,gw,vs -n istioinaction
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/catalog 1/1 1 1 47s
deployment.apps/webapp 1/1 1 1 41s
NAME READY STATUS RESTARTS AGE
pod/catalog-6cf4b97d-ks72d 2/2 Running 0 47s
pod/webapp-7685bcb84-prjz8 2/2 Running 0 41s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/catalog ClusterIP 10.200.1.122 <none> 80/TCP 47s
service/webapp ClusterIP 10.200.1.66 <none> 80/TCP 41s
NAME ENDPOINTS AGE
endpoints/catalog 10.10.0.8:3000 47s
endpoints/webapp 10.10.0.9:8080 41s
NAME AGE
gateway.networking.istio.io/coolstore-gateway 25s
NAME GATEWAYS HOSTS AGE
virtualservice.networking.istio.io/webapp-virtualservice ["coolstore-gateway"] ["webapp.istioinaction.io"] 25s
- 서비스가 정상적으로 동작하는지 확인합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ curl -s http://webapp.istioinaction.io:30000/api/catalog | jq
[
{
"id": 1,
"color": "amber",
"department": "Eyewear",
"name": "Elinor Glasses",
"price": "282.00"
},
...
- 이제 배포된 Pod를 확인하면 webapp과 catalog 서비스에 사이드카 프록시(sidecar proxy)가 포함된 것을 볼 수 있습니다:
(⎈|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 2m24s
webapp-7685bcb84-prjz8 2/2 Running 0 2m18s
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ docker exec -it myk8s-control-plane istioctl proxy-status
NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION
catalog-6cf4b97d-ks72d.istioinaction Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-7df6ffc78d-dkrxf 1.17.8
webapp-7685bcb84-prjz8.istioinaction Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-7df6ffc78d-dkrxf 1.17.8
- webapp Pod의 메트릭을 확인하려면 Envoy 프록시의 관리 엔드포인트를 쿼리합니다:
(⎈|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:15000/stats
cluster_manager.cds.version_text: "2025-04-28T04:30:16Z/10"
listener_manager.lds.version_text: "2025-04-28T04:30:16Z/10"
cluster.xds-grpc.assignment_stale: 0
cluster.xds-grpc.assignment_timeout_received: 0
cluster.xds-grpc.bind_errors: 0
...
- 이 명령어는 프록시와 컨트롤 플레인 간 연결, 클러스터 및 리스너 업데이트 수, 요청 및 응답 메트릭 등을 포함한 방대한 정보를 출력합니다. 예를 들어, istio_requests_total 메트릭은 ingress gateway에서 webapp 서비스로 들어오는 요청 수를 나타냅니다:
- istio-ingressgateway가 webapp으로 보낸 HTTP 요청이 2건 있었다
(⎈|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:15000/stats | grep -i istio_requests_total
istiocustom.istio_requests_total.reporter.destination.source_workload.istio-ingressgateway.source_canonical_service.istio-ingressgateway.source_canonical_revision.latest.source_workload_namespace.istio-system.source_principal.spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account.source_app.istio-ingressgateway.source_version.unknown.source_cluster.Kubernetes.destination_workload.webapp.destination_workload_namespace.istioinaction.destination_principal.spiffe://cluster.local/ns/istioinaction/sa/webapp.destination_app.webapp.destination_version.destination_service.webapp.istioinaction.svc.cluster.local.destination_canonical_service.webapp.destination_canonical_revision.latest.destination_service_name.webapp.destination_service_namespace.istioinaction.destination_cluster.Kubernetes.request_protocol.http.response_code.200.grpc_response_status.response_flags.-.connection_security_policy.mutual_tls: 2
istiocustom.istio_requests_total.reporter.source.source_workload.webapp.source_canonical_service.webapp.source_canonical_revision.latest.source_workload_namespace.istioinaction.source_principal.spiffe://cluster.local/ns/istioinaction/sa/webapp.source_app.webapp.source_version.source_cluster.Kubernetes.destination_workload.catalog.destination_workload_namespace.istioinaction.destination_principal.spiffe://cluster.local/ns/istioinaction/sa/catalog.destination_app.catalog.destination_version.v1.destination_service.catalog.istioinaction.svc.cluster.local.destination_canonical_service.catalog.destination_canonical_revision.v1.destination_service_name.catalog.destination_service_namespace.istioinaction.destination_cluster.Kubernetes.request_protocol.http.response_code.200.grpc_response_status.response_flags.-.connection_security_policy.unknown: 2
- Istio는 기본적으로 다음 표준 메트릭을 제공합니다:
- istio_requests_total: 총 요청 수
- istio_request_bytes: 요청 바이트 수
- istio_response_bytes: 응답 바이트 수
- istio_request_duration: 요청 소요 시간
- istio_request_duration_milliseconds: 요청 소요 시간(밀리초)
Envoy 프록시는 데이터 플레인에서 요청, 연결, 런타임 메트릭을 수집하며,
istio_requests_total 같은 표준 메트릭을 통해 서비스 상태를 파악할 수 있습니다.
📊 Figure: Envoy 프록시의 메트릭 수집 흐름
+-------------------+
| Webapp Service |
| +-------------+ |
| | Sidecar | |
| | (Envoy) | |
| | Metrics | |
| +-------------+ |
+-------------------+
↓
+-------------------+
| Catalog Service |
| +-------------+ |
| | Sidecar | |
| | (Envoy) | |
| | Metrics | |
| +-------------+ |
+-------------------+
설명: 위 그림은 Envoy 프록시가 webapp과 catalog 서비스 간 요청을 처리하며 메트릭을 수집하는 과정을 보여줍니다.
⚙️ 프록시 설정으로 더 많은 메트릭 수집하기
숨겨진 정보를 찾아내는 비법
- 기본 Istio 메트릭만으로는 네트워크 문제를 해결하기에 부족할 때가 있습니다. 이 경우, 프록시를 설정해 추가 메트릭을 수집할 수 있습니다. 예를 들어, webapp 서비스가 catalog 서비스로 보내는 요청에 대한 상세 메트릭을 수집하려면 upstream cluster 메트릭을 활성화해야 합니다.
- 이를 메쉬 전체에 적용하려면 Istio 설치 시 IstioOperator를 사용해 기본 프록시 설정을 변경합니다:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: control-plane
spec:
profile: demo
meshConfig: #Istio 메시의 전체 구성
defaultConfig: #모든 사이드카 프록시(Envoy)에 적용될 기본 구성
proxyStatsMatcher: #프록시가 수집할 통계(메트릭)를 지정
inclusionPrefixes: #특정 접두사로 시작하는 메트릭만 수집하도록 필터링
- "cluster.outbound|80||catalog.istioinaction"
#"istioinaction" 네임스페이스의 "catalog" 서비스로 나가는 80번 포트의 트래픽에 관한 메트릭만 수집
⚠️ 주의: 메쉬 전체에 메트릭을 추가하면 메트릭 수집 시스템에 부담을 줄 수 있으니 신중히 설정하세요.
- 더 안전한 방법은 특정 워크로드에만 메트릭을 추가하는 것입니다. 어노테이션을 추가합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ cat ch7/webapp-deployment-stats-inclusion.yaml
...
metadata:
annotations:
proxy.istio.io/config: |- # Istio 사이드카 프록시(Envoy)에 특정 구성을 전달하기 위한 Istio 전용 애노테이션
proxyStatsMatcher: #프록시가 수집할 통계(메트릭)를 지정
inclusionPrefixes: #특정 접두사로 시작하는 메트릭만 수집하도록 제한
- "cluster.outbound|80||catalog.istioinaction"
# "istioinaction" 네임스페이스의 "catalog" 서비스로 나가는 80번 포트의 트래픽에 관한 메트릭만 수집
labels:
app: webapp
...
- 변경된 배포를 적용합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl apply -n istioinaction -f ch7/webapp-deployment-stats-inclusion.yaml
deployment.apps/webapp configured
- 서비스를 몇 번 호출한 후, catalog 서비스 관련 메트릭을 확인합니다:
- upstream_cx_active: 현재 활성 상태인 연결 수
현재 2개의 활성 연결이 catalog 서비스로 열려 있음 - upstream_rq_200: 200 응답 코드를 받은 요청의 수
catalog 서비스에 보낸 2개의 요청이 성공적으로 처리됨 - upstream_rq_total: 모든 요청의 총 개수
catalog 서비스로 총 2개의 요청이 전송됨
- upstream_cx_active: 현재 활성 상태인 연결 수
(⎈|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:15000/stats | grep catalog | grep upstream
...
cluster.outbound|80||catalog.istioinaction.svc.cluster.local.upstream_cx_active: 2
...
cluster.outbound|80||catalog.istioinaction.svc.cluster.local.upstream_rq_200: 2
...
cluster.outbound|80||catalog.istioinaction.svc.cluster.local.upstream_rq_total: 2
...
프록시 설정을 통해 circuit breaker, TLS, upstream 요청 메트릭 등 상세 정보를 수집할 수 있으며,
워크로드별 어노테이션으로 메트릭 수집을 최적화할 수 있습니다.
🔎 클러스터와 엔드포인트 메트릭 확인하기
시스템의 지도를 그리는 방법
- Envoy 프록시는 upstream 서비스와 엔드포인트에 대한 정보도 제공합니다. 다음 명령어로 webapp 프록시가 알고 있는 모든 클러스터 정보를 확인할 수 있습니다:
(⎈|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:15000/clusters
- catalog 서비스 관련 정보만 필터링하려면:
(⎈|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:15000/clusters | grep catalog
outbound|80||catalog.istioinaction.svc.cluster.local::observability_name::outbound|80||catalog.istioinaction.svc.cluster.local
outbound|80||catalog.istioinaction.svc.cluster.local::default_priority::max_connections::4294967295
outbound|80||catalog.istioinaction.svc.cluster.local::default_priority::max_pending_requests::4294967295
outbound|80||catalog.istioinaction.svc.cluster.local::default_priority::max_requests::4294967295
outbound|80||catalog.istioinaction.svc.cluster.local::default_priority::max_retries::4294967295
outbound|80||catalog.istioinaction.svc.cluster.local::high_priority::max_connections::1024
outbound|80||catalog.istioinaction.svc.cluster.local::high_priority::max_pending_requests::1024
outbound|80||catalog.istioinaction.svc.cluster.local::high_priority::max_requests::1024
outbound|80||catalog.istioinaction.svc.cluster.local::high_priority::max_retries::3
outbound|80||catalog.istioinaction.svc.cluster.local::added_via_api::true
outbound|80||catalog.istioinaction.svc.cluster.local::eds_service_name::outbound|80||catalog.istioinaction.svc.cluster.local
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::cx_active::2
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::cx_connect_fail::0
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::cx_total::2
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::rq_active::0
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::rq_error::0
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::rq_success::2
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::rq_timeout::0
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::rq_total::2
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::hostname::
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::health_flags::healthy
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::weight::1
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::region::
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::zone::
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::sub_zone::
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::canary::false
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::priority::0
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::success_rate::-1
outbound|80||catalog.istioinaction.svc.cluster.local::10.10.0.8:3000::local_origin_success_rate::-1
- 이 메트릭은 특정 엔드포인트(10.10.0.8:3000)의 연결 상태, 요청 성공 여부, 엔드포인트의 지역, 우선순위 등을 보여줍니다. 이를 통해 클러스터 전체가 아닌 개별 엔드포인트의 상태를 상세히 파악할 수 있습니다.
클러스터 메트릭은 엔드포인트별 연결, 요청, 상태 정보를 제공해 네트워크의 세부 동작을 이해하는 데 도움을 줍니다.
📌 핵심 요약
- Istio의 데이터 플레인은 Envoy 프록시를 통해 요청, 연결, TLS, circuit breaker 등 다양한 메트릭을 수집하며, 이를 통해 서비스 네트워크의 상태를 상세히 관찰할 수 있습니다.
- 표준 메트릭(istio_requests_total 등)은 기본적으로 제공되며, 프록시 설정을 통해 상세 메트릭을 추가로 수집할 수 있습니다.
- 클러스터와 엔드포인트 메트릭은 개별 서비스와 엔드포인트의 상태를 파악하는 데 유용합니다.
- 이러한 메트릭은 Prometheus 같은 시스템으로 수집해 시각화할 수 있으며, 효율적인 메트릭 수집을 위해 워크로드별 설정을 활용하는 것이 좋습니다.
🔍 Istio 컨트롤 플레인 메트릭으로
시스템의 확인하기
시스템의 두뇌를 들여다보는 기술
- Istio의 컨트롤 플레인(control plane), 즉 istiod는 시스템의 동작 상태를 파악할 수 있는 풍부한 메트릭(metrics)을 제공합니다. 이 메트릭들은 데이터 플레인 프록시와의 구성 동기화 횟수, 동기화 소요 시간, 잘못된 구성, 인증서 발급 및 갱신 등 다양한 정보를 포함합니다. 이러한 메트릭은 Istio의 성능 튜닝과 시스템 관찰 가능성(observability)을 높이는 데 중요한 역할을 합니다.
Istio의 컨트롤 플레인(istiod)은 구성 동기화, 인증서 관리, 서비스 상태 등 시스템 운영에 필수적인 메트릭을 제공합니다.
🛠️ 컨트롤 플레인 메트릭 확인하기
istiod의 비밀 기록을 열어보자!
- 컨트롤 플레인 메트릭을 확인하려면 istiod의 관리 엔드포인트를 쿼리하면 됩니다. 다음 명령어를 실행해 메트릭을 조회할 수 있습니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl exec -it -n istio-system deploy/istiod -n istio-system -- curl localhost:15014/metrics
istiod의 메트릭은 관리 엔드포인트를 통해 쉽게 조회할 수 있으며,
시스템의 세부 동작을 이해하는 데 유용합니다.
🔐 인증서 관련 메트릭
시스템 보안의 열쇠를 관리하다
- 컨트롤 플레인은 워크로드 인증서 요청(CSR)을 처리하고 인증서를 발급합니다. 다음 메트릭은 인증서 관리 상태를 보여줍니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl exec -it -n istio-system deploy/istiod -n istio-system -- curl localhost:15014/metrics | grep citadel
# HELP citadel_server_csr_count The number of CSRs received by Citadel server.
# TYPE citadel_server_csr_count counter
citadel_server_csr_count 4
# HELP citadel_server_root_cert_expiry_timestamp The unix timestamp, in seconds, when Citadel root cert will expire. A negative time indicates the cert is expired.
# TYPE citadel_server_root_cert_expiry_timestamp gauge
citadel_server_root_cert_expiry_timestamp 2.0611742e+09
# HELP citadel_server_success_cert_issuance_count The number of certificates issuances that have succeeded.
# TYPE citadel_server_success_cert_issuance_count counter
citadel_server_success_cert_issuance_count 4
- citadel_server_root_cert_expiry_timestamp: 루트 인증서의 만료 시점
- citadel_server_csr_count: 컨트롤 플레인이 처리한 CSR 요청 수
- citadel_server_success_cert_issuance_count: 성공적으로 발급된 인증서 수
이 메트릭은 인증서의 유효 기간과 발급 상태를 모니터링해 보안 문제를 사전에 방지하는 데 도움을 줍니다.
인증서 메트릭은 루트 인증서 만료 시점과 CSR 처리 상태를 제공해 보안 관리를 지원합니다.
🏷️ 컨트롤 플레인 버전 정보
시스템의 신분을 확인하다
- 컨트롤 플레인의 런타임 버전 정보는 다음과 같이 확인할 수 있습니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl exec -it -n istio-system deploy/istiod -n istio-system -- curl localhost:15014/metrics | grep istio_build
# HELP istio_build Istio component build info
# TYPE istio_build gauge
istio_build{component="pilot",tag="1.17.8"} 1
- 이 메트릭은 현재 컨트롤 플레인이 Istio 1.17.8 버전으로 실행 중임을 나타냅니다. 이는 시스템의 호환성과 업데이트 상태를 파악하는 데 유용합니다.
istio_build 메트릭은 컨트롤 플레인의 버전을 알려줘 시스템 관리에 도움을 줍니다.
⏱️ 구성 동기화 시간 메트릭
프록시와의 빠른 대화 시간 측정
- 컨트롤 플레인은 데이터 플레인 프록시와 구성을 동기화하는 데 걸리는 시간을 메트릭으로 기록합니다. 다음은 구성 동기화 시간 분포를 보여주는 히스토그램입니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl exec -it -n istio-system deploy/istiod -n istio-system -- curl localhost:15014/metrics | grep convergence
# HELP pilot_proxy_convergence_time Delay in seconds between config change and a proxy receiving all required configuration.
# TYPE pilot_proxy_convergence_time histogram
pilot_proxy_convergence_time_bucket{le="0.1"} 27 #27개의 수렴 이벤트가 0.1초 이하
pilot_proxy_convergence_time_bucket{le="0.5"} 27
pilot_proxy_convergence_time_bucket{le="1"} 27
pilot_proxy_convergence_time_bucket{le="3"} 27
pilot_proxy_convergence_time_bucket{le="5"} 27
pilot_proxy_convergence_time_bucket{le="10"} 27
pilot_proxy_convergence_time_bucket{le="20"} 27
pilot_proxy_convergence_time_bucket{le="30"} 27
pilot_proxy_convergence_time_bucket{le="+Inf"} 27
pilot_proxy_convergence_time_sum 0.07285931599999998
pilot_proxy_convergence_time_count 27
- pilot_proxy_convergence_time_sum: 총 동기화 시간
- pilot_proxy_convergence_time_count: 총 동기화 이벤트 수
구성 동기화 시간 메트릭은 프록시와의 동기화 속도를 측정해 컨트롤 플레인의 성능을 평가합니다.
🌐 서비스 및 리소스 메트릭
시스템의 규모를 파악하다
- 컨트롤 플레인은 서비스, VirtualService, 연결된 프록시 수 등을 추적합니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl exec -it -n istio-system deploy/istiod -n istio-system -- curl localhost:15014/metrics | grep pilot | egrep 'service|^pilot_xds'
# HELP pilot_duplicate_envoy_clusters Duplicate envoy clusters caused by service entries with same hostname
pilot_push_triggers{type="service"} 3
# HELP pilot_services Total services known to pilot.
# TYPE pilot_services gauge
pilot_services 6
# HELP pilot_virt_services Total virtual services known to pilot.
# TYPE pilot_virt_services gauge
pilot_virt_services 1
# HELP pilot_vservice_dup_domain Virtual services with dup domains.
# TYPE pilot_vservice_dup_domain gauge
pilot_vservice_dup_domain 0
pilot_xds{version="1.17.8"} 3
...
- pilot_services: 컨트롤 플레인이 인식하는 서비스 수
- pilot_virt_services: 사용자 정의 VirtualService 수
- pilot_vservice_dup_domain: 중복 도메인이 있는 VirtualService 수
- pilot_xds: XDS 프로토콜로 연결된 프록시 수
서비스 및 리소스 메트릭은 컨트롤 플레인이 관리하는 서비스와 프록시의 상태를 보여줍니다.
🔄 xDS API 업데이트 메트릭
동적 구성 변경의 기록
- 컨트롤 플레인은 xDS API를 통해 Envoy 프록시의 구성을 동적으로 업데이트합니다.
주요 xDS API 메트릭은 다음과 같습니다:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-QMAIJOE:~/aews-labs/istio-in-action/book-source-code-master$ kubectl exec -it -n istio-system deploy/istiod -n istio-system -- curl localhost:15014/metrics | grep pilot_xds_pushes
# HELP pilot_xds_pushes Pilot build and send errors for lds, rds, cds and eds.
# TYPE pilot_xds_pushes counter
pilot_xds_pushes{type="cds"} 21
pilot_xds_pushes{type="eds"} 33
pilot_xds_pushes{type="lds"} 21
pilot_xds_pushes{type="rds"} 13
- cds: Cluster Discovery Service 업데이트
- eds: Endpoint Discovery Service 업데이트
- lds: Listener Discovery Service 업데이트
- rds: Route Discovery Service 업데이트
- sds: Secret Discovery Service 업데이트
xDS API 메트릭은 컨트롤 플레인이 프록시 구성을 동적으로 업데이트하는 빈도를 추적합니다.
📈 메트릭 수집과 활용
데이터를 모아 그림으로 그리다
- 데이터 플레인과 컨트롤 플레인은 시스템의 세부 동작을 상세히 기록하지만, 각 컴포넌트에 개별적으로 접근해 메트릭을 확인하는 것은 비효율적입니다. 이를 해결하기 위해 Prometheus나 Datadog 같은 메트릭 수집 시스템과 시계열 데이터베이스를 사용해 메트릭을 자동으로 수집하고 시각화할 수 있습니다. 이를 통해 운영자는 시스템 상태를 한눈에 파악하고 문제를 빠르게 해결할 수 있습니다.
메트릭 수집 시스템을 활용하면 데이터 플레인과 컨트롤 플레인 메트릭을
자동으로 수집하고 시각화해 관찰 가능성을 높일 수 있습니다.
📌 핵심 요약
- Istio의 컨트롤 플레인(istiod)은 인증서 관리, 구성 동기화 시간, 서비스 및 VirtualService 상태, xDS API 업데이트 등 시스템 운영에 필수적인 메트릭을 제공합니다.
- 인증서 메트릭은 보안 상태를, 동기화 시간 메트릭은 성능을, 서비스 및 xDS 메트릭은 메쉬의 규모와 동적 구성 상태를 보여줍니다.
- 이러한 메트릭은 Prometheus 같은 시스템으로 수집해 시각화함으로써 효율적인 시스템 관찰과 문제 해결을 가능하게 합니다.