Docker에서 서비스 메시 관찰
Docker에서 서비스 메시 관찰 (Service Mesh Observability on Docker)
Consul이 Docker 컨테이너에서 실행될 때 서비스 메시 관찰(observability) 기능을 구성하는 과정을 설명하는 문서예요. Prometheus로 메트릭, Loki로 로그, Tempo로 트레이스를 수집하고 Grafana로 시각화해요.
출처: 문서
본문
이 페이지는 Consul이 Docker 컨테이너에서 실행될 때 서비스 메시 관찰 기능을 구성하는 과정을 설명해요.
소개 (Introduction)
서비스 메시 관찰은 메트릭(metrics), 로그(logs), 트레이스(traces) 세 가지 핵심 요소로 구성돼요. Consul의 서비스 메시에서 이러한 요소를 관찰하려면 Prometheus로 메트릭을, Loki로 로그를, Tempo로 트레이스를 수집해요. 그런 다음 Grafana로 이 데이터를 시각화할 수 있어요.
이 페이지의 예시는 프로덕션 환경에 적절히 보호되지는 않았어요. 이 기능을 프로덕션 시스템에 구현한다면 Consul 모범 사례에 대한 Consul 참조 아키텍처와 Docker 모범 사례에 대한 Docker 문서를 검토할 것을 권장해요.
사전 요구 사항 (Prerequisites)
Docker 컨테이너가 Loki 로그를 출력하려면 Docker용 Loki 로깅 드라이버를 설치해야 해요. 자세한 내용은 Loki Docker driver 플러그인 페이지를 참고하세요.
$ docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
Prometheus로 메트릭 수집 (Collect metrics with Prometheus)
Prometheus에서 Consul 대상 엔드포인트를 구성해요. prometheus.yaml 파일에는 Prometheus가 Consul 서버에서 메트릭을 스크랩하도록 하는 구성이 들어 있어요. targets 필드는 Docker 환경에서 실행되는 Consul 서버 서비스를 가리켜야 하고, metrics_path는 Consul의 에이전트 메트릭 엔드포인트인 /v1/agent/metrics로 설정해야 해요.
prometheus.yaml
global:
scrape_interval: 30s
scrape_timeout: 10s
scrape_configs:
- job_name: 'consul-server'
metrics_path: '/v1/agent/metrics'
params:
format: ['prometheus']
static_configs:
- targets: ['consul-server:8500']
Loki로 로그 수집 (Collect logs with Loki)
Loki는 Grafana Labs가 개발한 고급 로그 집계 시스템이에요. docker-compose-loki.yaml 파일에는 Loki 서비스를 Docker 컨테이너로 실행하기 위한 구성이 들어 있어요.
docker-compose-loki.yaml
loki:
image: grafana/loki:2.1.0
container_name: loki
command: -config.file=/etc/loki/local-config.yaml
networks:
vpcbr:
ipv4_address: 10.5.0.11
ports:
- "3100:3100" # loki needs to be exposed so it receives logs
environment:
- JAEGER_AGENT_HOST=tempo
- JAEGER_ENDPOINT=http://tempo:14268/api/traces # send traces to Tempo
- JAEGER_SAMPLER_TYPE=const
- JAEGER_SAMPLER_PARAM=1
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
이 구성은 Loki가 Docker 환경의 모든 컨테이너에서 로그를 수집할 수 있게 해줘요. 로그는 Loki 로깅 드라이버를 사용해 Loki로 전송돼요. Loki 트레이스도 분산 트레이싱을 위해 Tempo로 전송돼요.
Tempo로 트레이스 수집 (Collect traces with Tempo)
Tempo는 Grafana Labs가 개발한 분산 트레이싱 시스템이에요. docker-compose-tempo.yaml 파일에는 Tempo 서비스를 Docker 컨테이너로 실행하기 위한 구성이 들어 있어요.
docker-compose-tempo.yaml
tempo:
image: grafana/tempo:1f1c40b3
container_name: tempo
command: ["-config.file=/etc/tempo.yaml"]
volumes:
- ./tempo/tempo.yaml:/etc/tempo.yaml
networks:
vpcbr:
ipv4_address: 10.5.0.9
ports:
- "14268:14268" # jaeger ingest
- "3100" # tempo
- "9411:9411" #zipkin
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
이 Docker Compose 구성은 Tempo가 Docker 환경에서 트레이스를 수집하도록 설정해요. 트레이스는 Loki 로깅 드라이버를 사용해 Tempo로 전송되며, 이는 Grafana와의 원활한 통합을 허용해요. 이 Docker Compose 구성은 Tempo 구성을 포함하는 tempo/tempo.yaml 파일도 참조해요.
tempo/tempo.yaml
auth_enabled: false
server:
http_listen_port: 3100
distributor:
receivers: # this configuration will listen on all ports and protocols that tempo is capable of.
jaeger: # the receives all come from the OpenTelemetry collector. more configuration information can
protocols: # be found there: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver
thrift_http: #
grpc: # for a production deployment you should only enable the receivers you need!
thrift_binary:
thrift_compact:
zipkin:
otlp:
protocols:
http:
grpc:
opencensus:
ingester:
trace_idle_period: 10s # the length of time after a trace has not received spans to consider it complete and flush it
max_block_bytes: 1_000_000 # cut the head block when it hits this size or ...
max_block_duration: 5m # this much time passes
compactor:
compaction:
compaction_window: 1h # blocks in this time window will be compacted together
max_block_bytes: 100_000_000 # maximum size of compacted blocks
block_retention: 1h
compacted_block_retention: 10m
storage:
trace:
backend: local # backend configuration to use
block:
bloom_filter_false_positive: .05 # bloom filter false positive rate. lower values create larger filters but fewer false positives
index_downsample_bytes: 1000 # number of bytes per index record
encoding: zstd # block encoding/compression. options: none, gzip, lz4-64k, lz4-256k, lz4-1M, lz4, snappy, zstd
wal:
path: /tmp/tempo/wal # where to store the the wal locally
encoding: none # wal encoding/compression. options: none, gzip, lz4-64k, lz4-256k, lz4-1M, lz4, snappy, zstd
local:
path: /tmp/tempo/blocks
pool:
max_workers: 100 # the worker pool mainly drives querying, but is also used for polling the blocklist
queue_depth: 10000
Grafana 구성 (Configure Grafana)
Grafana를 구성해 메트릭, 로그, 트레이스를 수집하고 시각화하고 Prometheus, Loki, Tempo를 데이터 소스로 사용할 수 있어요.
Grafana 데이터 소스: Prometheus
datasource-prometheus.yaml 파일에는 Grafana가 Prometheus에 연결하기 위한 구성이 들어 있어요. url 필드는 Docker 환경에서 실행되는 Prometheus 서비스를 가리켜야 해요.
datasource-prometheus.yaml
datasources:
- name: Prometheus
type: prometheus
access: proxy
orgId: 1
url: http://prometheus:9090
basicAuth: false
isDefault: false
version: 1
editable: false
Grafana 데이터 소스: Loki
datasource-loki.yaml 파일에는 Grafana가 Loki에 연결하기 위한 구성이 들어 있어요. datasources.url 필드는 Docker 환경에서 실행되는 Loki 서비스를 가리켜야 해요.
datasource-loki.yaml
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: true
version: 1
editable: false
apiVersion: 1
jsonData:
derivedFields:
- datasourceUid: tempo
matcherRegex: (?:traceID|trace_id)=(\w+)
name: TraceID
url: $${__value.raw}
Grafana 데이터 소스: Tempo
datasource-tempo.yaml 파일에는 Grafana가 Tempo에 연결하기 위한 구성이 들어 있어요. url 필드는 Docker 환경에서 실행되는 Tempo 서비스를 가리켜야 해요.
datasource-tempo.yaml
datasources:
- name: Tempo
type: tempo
access: proxy
orgId: 1
url: http://tempo:3100
basicAuth: false
isDefault: false
version: 1
editable: false
apiVersion: 1
uid: tempo
Grafana 대시보드 (Grafana dashboards)
Prometheus, Loki, Tempo가 수집한 데이터를 시각화하려면 사전 구축된 대시보드를 Grafana로 가져올 수 있어요. 구성은 다음 방식으로 Grafana에 적용되며 dashboards라는 디렉터리를 참조해요.
grafana-dashboards.yaml
apiVersion: 1
providers:
- name: 'dashboards'
orgId: 1
folder: 'dashboards'
folderUid: ''
type: file
disableDeletion: true
editable: true
updateIntervalSeconds: 3600
allowUiUpdates: false
options:
path: /var/lib/grafana/dashboards
dashboards 디렉터리의 내용은 hashicorp/consul GitHub 리포지토리의 대시보드 구성을 문서화한 서비스 메시 관찰용 대시보드를 참고하세요.
또한 Grafana Dashboards 리포지토리의 Docker 특정 콘텐츠를 참조할 수도 있어요.
Grafana로 서비스 메시 탐색 (Use Grafana to explore your service mesh)
이제 Grafana 데이터 소스를 구성했으니 수집된 데이터를 시각화할 수 있어요.
Grafana에서 트레이스 탐색 (Explore traces in Grafana)
Grafana에서 Tempo가 수집한 트레이스를 탐색할 수 있어요. Grafana의 Explore 섹션으로 이동해 트레이스 검색을 실행해요. 예를 들어 web이라는 컨테이너의 트레이스를 보려면 {container_name="web"} |= "trace_id" 검색을 실행해요. 그런 다음 로그 줄 중 하나를 열고 TraceID 필드를 찾은 다음 근처의 Tempo 링크를 클릭해 로그에서 트레이스로 바로 이동해요.
트레이스는 서비스 메시 성능에 대한 통찰력을 제공해요. 애플리케이션 통신이 서비스 메시를 어떻게 통과하는지에 대해 더 알아보려면 분산 트레이싱에 대한 블로그와 분산 트레이싱 문서를 참고하세요.
Grafana에서 메트릭 탐색 (Explore metrics in Grafana)
Grafana에서 Prometheus가 수집한 메트릭을 탐색할 수 있어요. Dashboards 섹션으로 이동해 Consul Server Monitoring 대시보드를 선택해요. 이 대시보드는 Raft 커밋 시간, 카탈로그 작업 시간, autopilot 헬스 등 Consul 서버 메트릭의 포괄적인 보기를 제공해요.
이 대시보드는 Consul에 대한 중요한 애플리케이션 수준 메트릭을 제시하고 서비스 메시의 헬스와 성능에 대한 중요한 통찰력을 제공해요. Consul이 보고하는 다양한 런타임 메트릭에 대해 더 알아보려면 Consul 텔레메트리 문서를 참고하세요.