- Fargate
- cloudnative
- SAA-CO3
- K8S
- containerorchestration
- SAA-CO2
- 메일 인증 프로토콜
- SPF
- Java
- kubernetes 클러스터 보안
- Kubernetes
- aws
- nodeaffinity
- Certified Solutions Architect
- DevOps
- kubernetesstudyguide
- SMTP
- aws ses
- kubernetesscheduling
- DKIM
- go
- Lambda
- kubernetesadmin
- JVM
- EKS
- dMarc
- gochannel
- kubernetes admission controller
- CKA
- Today
- Total
DevOps Tasks
[Kubernetes] EKS에서 Datadog APM 적용하기 (Auto Instrumentation + Trace Optimization) 본문
[Kubernetes] EKS에서 Datadog APM 적용하기 (Auto Instrumentation + Trace Optimization)
데밥스 2025. 2. 12. 23:28Datadog 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와 실행 시간 비교
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을 최적화하여 더 나은 성능과 가시성을 확보하세요!
'Datadog' 카테고리의 다른 글
Kubernetes Admission Controller로 Fargate에 Datadog Agent Sidecar 자동 주입하기 (0) | 2025.02.09 |
---|---|
Datadog 이상탐지 ( Anomaly Detection ) 적용기 (0) | 2023.12.24 |