02-19 04:15
반응형
250x250
Recent Posts
Recent Comments
Link
관리 메뉴

DevOps Tasks

[Kubernetes] EKS에서 Datadog APM 적용하기 (Auto Instrumentation + Trace Optimization) 본문

Datadog

[Kubernetes] EKS에서 Datadog APM 적용하기 (Auto Instrumentation + Trace Optimization)

데밥스 2025. 2. 12. 23:28
728x90
반응형

Datadog APM 개요

Datadog APM (애플리케이션 성능 모니터링) 은 UDS (Unix Domain Socket), TCP(IP:Port), Kubernetes 서비스를 통해 트레이스를 전송할 수 있습니다.

Datadog에서는 UDS 방식을 권장하지만, 특정 환경에서는 TCP 또는 Kubernetes 서비스 방식이 필요할 수 있습니다.

 

🔹 트레이스 전송 방식 비교

 

방식 장점 단점
UDP - 네트워크 오버헤드 최소화
- 빠른 통신 속도
- 보안성이 높음
- Pod 간 통신이 필요할 경우 설정이 다소 복잡
TCP - 다양한 네트워크 환경에서 활용 가능
- Kubernetes 서비스와의 통합 용이
- 네트워크 오버헤드 발생 가능
- 방화벽 및 보안 정책 추가 필요
Kubernetes
서비스
- 서비스 디스커버리 활용 가능
- 클러스터 내 트래픽을 쉽게 라우팅 가능
- 추가적인 서비스 리소스 필요
- 네트워크 오버헤드 발생 가능

 


트레이스 전송 방식 설정

`UDS` ( Unix Domain Socket ) 활성화

datadog:
  apm:
    socketEnabled: true                             # UDS 활성화
  env:
    - name: DD_TRACE_AGENT_URL
      value: 'unix:///var/run/datadog/apm.socket'   # UDS 경로 지정
  • `DD_TRACE_AGENT_URL` : 애플리케이션에서 Datadog Agent로 트레이스를 보낼 UDS 소켓 경로 지정

 

`TCP` ( IP : Port ) 활성화

datadog:
  apm:
    portEnabled: true               # TCP 활성화
  env:
    - name: DD_AGENT_HOST
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP  # 실행 중인 노드의 IP 주소 참조
  • `DD_AGENT_HOST` : Datadog Agent의 IP 주소 지정

 

`Kubernetes 서비스` 활성화

datadog:
  apm:
    useLocalService: true                               # Kubernetes 서비스 사용
    portEnabled: true                                   # APM 포트 활성화
  env:
    - name: DD_AGENT_HOST
      value: "datadog-agent.default.svc.cluster.local"  # Kubernetes 서비스 주소
  • `DD_AGENT_HOST` : 트레이스를 보낼 Datadog Agent 서비스의 DNS 이름 지정

 

Datadog APM 자동 계측 적용

기존 방식 : 개별적으로 Tracing 라이브러리 주입

# Dockerfile
RUN wget -O dd-java-agent.jar <http://github.com/DataDog/dd-trace-java/releases/download/<VERSION>/dd-java-agent.jar>

# entrypoint.sh
JAVA_OPTS="$JAVA_OPTS -javaagent:$APP_HOME/dd-java-agent.jar"
  • 각 애플리케이션별로 개별 라이브러리 다운로드 및 설정 필요 → 운영 부담 증가

 

개선 방식: Admission Controller를 통한 자동 계측

datadog:
  apm:
    instrumentation:
      enabled: true
      enabledNamespaces: ["<NAMESPACE_NAME>"]
      libVersions:
        java: "v1.45.2"                        # 특정 언어 버전 지정
      language_detection:
        enabled: true                          # 언어 자동 감지
  • `datadog.apm.instrumentation.enabled` 활성화 시 개별 주입 없이 자동 계측 가능
  • `libVersions` 지정 시 특정 언어만 실행되어 불필요한 오버헤드 감소
  • Java의 경우 `JAVA_TOOL_OPTIONS`에 자동으로 `javaagent:/opt/datadog/apm/library/java/dd-java-agent.jar` 주입

 

Init-Container 기반 Tracing 라이브러리 자동 관리

`datadog-init-apm-inject` (공통 자동 계측 설정)

  • APM 자동 계측을 위한 공통 Init-Container
  • `LD_PRELOAD`를 설정하여 애플리케이션이 Datadog APM을 자동 로드하도록 구성

`datadog-lib-<언어>-init` (언어별 APM 라이브러리 설치)

  • Java, Python, Node.js 등 각 언어별 APM 라이브러리를 설치
  • `datadog-init-apm-inject`가 기본 설정 담당, `datadog-lib-<언어>-init`이 세부 계측 보완

 

✅ 버전 미지정 시 실행되는 Init-Container와 실행 시간 비교

📌  libVersions를 지정하지 않으면 위의 5개 언어에 대한 Init-Container가 모두 실행됨

 


OOM Kill 감지 기능 추가

Datadog APM에서는 메모리 부족으로 인해 프로세스가 종료(OOM Kill)되는 상황을 감지할 수 있도록 `datadog.systemProbe.enableOOMKill` 기능을 지원합니다.

✅ OOM Kill 활성화 설정

datadog:
  systemProbe:
    enableOOMKill: true  # OOM Kill 감지 활성화
  • 기존에는 `message:java.lang.OutOfMemoryError` 로그를 필터링하여 OOM을 감지했지만 이는 정확하지 않은 지표였습니다.
  • `datadog.systemProbe.enableOOMKill`을 활성화하면 `eBPF` 기반 시스템 프로브를 통해 OOM Kill 이벤트를 감지합니다.

 

🔎 eBPF와 cgroup을 활용한 OOM Kill 감지 원리

  • eBPF(Extended Berkeley Packet Filter)
    • `eBPF`는 커널 내에서 실행되는 고성능 추적 및 모니터링 기술로, `커널 이벤트`를 실시간으로 감지할 수 있도록 지원합니다.
    • Datadog의 OOM Kill 감지 기능은 `eBPF`를 활용하여 OOM Killer가 실행된 순간을 직접 감지하고 기록합니다.
  • cgroup(Control Groups) 기반 프로세스 관리
    • Kubernetes 환경에서는 컨테이너가 `cgroup`을 통해 메모리 및 CPU 사용량을 제한받습니다.
    • `eBPF` 기반의 Datadog System Probe는 `cgroup` 내에서 메모리 제한을 초과한 프로세스가 OOM Killer에 의해 종료될 때 이를 감지할 수 있습니다.
    • 이를 통해 단순한 로그 분석이 아니라 커널 레벨에서 정확한 OOM Kill 감지가 가능합니다.

 


 특정 API 트레이스 제외 (불필요한 트래픽 제거)

✅ 특정 요청 제외 설정 (/health 예시)

agents:
  enabled: true
  containers:
    traceAgent:
      env:
        - name: DD_APM_IGNORE_RESOURCES
          value: "GET /health$, POST /health$"
  • Health Check (/health) 같은 불필요한 요청을 제외하여 트레이스 데이터 최적화
  • /health API는 주기적으로 호출되므로 트레이스 저장량을 줄이고 비용 절감 가능

🎯 기대되는 효과

 불필요한 트래픽 제거 → 비용 절감
헬스 체크(/health)와 같은 반복 요청을 필터링하여 Datadog APM 저장 비용을 최적화할 수 있습니다.

 노이즈 감소 → 중요한 트레이스에 집중
트레이스 목록을 불필요한 요청이 가득 채우는 문제를 방지하고, 핵심 트랜잭션의 가시성을 극대화합니다.

 APM 성능 최적화
트레이스 데이터 최적화를 통해 에이전트 리소스 사용량을 줄이고, 분석 속도를 향상할 수 있습니다.


🚀 Datadog APM 최적화 결론

기존 수동 설정 방식(`Dockerfile` + `entrypoint.sh`)에서 → Admission Controller 기반 자동 계측으로 전환하여 운영 부담을 줄이고 최적화된 성능을 확보할 수 있습니다.

  • `Mutating Webhook`을 활용한 `JAVA_TOOL_OPTIONS` 자동 설정
  • Init-Container(`datadog-init-apm-inject`, `datadog-lib-<언어>-init`)로 Tracing 중앙 관리
  • `DD_APM_IGNORE_RESOURCES` 설정을 통해 불필요한 트레이스 제거 → 비용 절감 및 성능 개선

💡 Datadog APM을 Kubernetes 환경에서 효과적으로 적용하면 자동 계측과 최적화를 통해 운영 효율을 극대화하고, 모니터링 비용을 절감할 수 있습니다.

이제 Kubernetes에서 Datadog APM을 최적화하여 더 나은 성능과 가시성을 확보하세요!

728x90
반응형