EKS 지능형 관찰성 스택 구축
📅 작성일: 2026-02-12 | 수정일: 2026-02-14 | ⏱️ 읽는 시간: 약 45분
1. 개요
현대 분산 시스템에서 **관찰성(Observability)**은 단순한 모니터링을 넘어, 시스템의 내부 상태를 외부 출력을 통해 이해하는 능력을 의미합니다. EKS 환경에서는 수백 개의 Pod, 복잡한 서비스 메시, 동적 스케일링이 결합되어 전통적 모니터링만으로는 문제의 근본 원인을 파악하기 어렵습니다.
1.1 3-Pillar 관찰성 + AI 분석 레이어
관찰성의 세 가지 기둥과 AI 분석 레이어를 결합하면 진정한 지능형 운영이 가능합니다.
Managed Add-on 기반 관찰성 기초부터 AI 분석 레이어까지, EKS 환경에서 지능형 관찰성 스택을 구축하는 전체 과정을 다룹니다. AWS가 오픈소스 관찰성 도구를 관리형으로 운영하여 복잡도를 제거하면서 K8s 네이티브 관찰성을 극대화하는 전략을 중심으로 설명합니다. 이 문서는 AWS 네이티브 스택을 기준으로 작성되었지만, ADOT(OpenTelemetry)를 수집 레이어로 사용하면 3rd Party 백엔드와도 동일한 아키텍처를 적용할 수 있습니다.
1.3 관찰성 스택 선택 패턴
실제 EKS 운영 환경에서는 조직의 요구사항과 기존 투자에 따라 크게 세 가지 관찰성 스택 패턴이 사용됩니다:
어떤 백엔드를 선택하든, 수집 레이어에 ADOT(OpenTelemetry)를 사용하면 백엔드 교체가 자유롭습니다. OpenTelemetry는 CNCF 표준이므로 Prometheus, Jaeger, Datadog, Sumo Logic 등 대부분의 백엔드로 데이터를 내보낼 수 있습니다. 이것이 AWS가 자체 에이전트 대신 OpenTelemetry를 Managed Add-on(ADOT)으로 제공하는 이유입니다.
이 문서는 AWS 네이티브 및 OSS 중심 패턴을 기준으로 구성을 설명합니다. 3rd Party 백엔드를 사용하는 경우, ADOT Collector의 exporter 설정만 변경하면 동일한 수집 파이프라인을 활용할 수 있습니다.
1.2 왜 EKS에서 관찰성이 중요한가
EKS 환경의 관찰성은 다음 이유로 필수적입니다:
- 동적 인프라: Pod가 수시로 생성/삭제되며, 노드가 Karpenter에 의해 동적 프로비저닝
- 마이크로서비스 복잡성: 서비스 간 호출 체인이 복잡하여 단일 장애 지점 파악이 어려움
- 멀티 레이어 문제: 애플리케이션, 컨테이너 런타임, 노드, 네트워크, AWS 서비스 등 다층 구조
- 비용 최적화: 리소스 사용 패턴 분석을 통한 Right-sizing 필요
- 규정 준수: 감사 로그, 접근 기록 등 컴플라이언스 요구사항
2. Managed Add-ons 기반 관찰성 기초
EKS Managed Add-ons는 AWS가 관찰성 에이전트의 설치, 업그레이드, 패치를 관리하여 운영 복잡성을 제거합니다. aws eks create-addon 한 줄의 명령으로 프로덕션 수준의 관찰성 기초를 확립할 수 있습니다.
2.1 ADOT (AWS Distro for OpenTelemetry) Add-on
ADOT는 OpenTelemetry의 AWS 배포판으로, 메트릭·로그·트레이스를 단일 에이전트로 수집합니다.
# ADOT Add-on 설치
aws eks create-addon \
--cluster-name my-cluster \
--addon-name adot \
--addon-version v0.40.0-eksbuild.1 \
--service-account-role-arn arn:aws:iam::ACCOUNT_ID:role/adot-collector-role
# 설치 확인
aws eks describe-addon \
--cluster-name my-cluster \
--addon-name adot \
--query 'addon.status'
ADOT Add-on을 사용하면 OpenTelemetry Operator가 자동 설치되며, AWS 서비스 인증(SigV4)이 내장됩니다. 자체 배포 대비 운영 부담이 크게 줄어들며, EKS 버전 호환성이 AWS에 의해 보장됩니다.
2.2 CloudWatch Observability Agent Add-on
CloudWatch Observability Agent는 Container Insights Enhanced, Application Signals, CloudWatch Logs를 통합 제공합니다.
# CloudWatch Observability Agent Add-on
aws eks create-addon \
--cluster-name my-cluster \
--addon-name amazon-cloudwatch-observability \
--service-account-role-arn arn:aws:iam::ACCOUNT_ID:role/cloudwatch-agent-role
# 구성 확인
kubectl get pods -n amazon-cloudwatch
2.3 Node Monitoring Agent Add-on (2025)
Node Monitoring Agent는 EC2 노드의 하드웨어 및 OS 수준 문제를 탐지합니다.
# Node Monitoring Agent Add-on
aws eks create-addon \
--cluster-name my-cluster \
--addon-name eks-node-monitoring-agent
주요 탐지 항목:
- NVMe 디스크 오류: EBS 볼륨 성능 저하 사전 감지
- 메모리 하드웨어 오류: EDAC(Error Detection and Correction) 이벤트
- 커널 소프트 락업: CPU가 비정상적으로 오래 점유된 상태
- OOM(Out of Memory): 메모리 부족으로 인한 프로세스 종료
2.3.1 Node Readiness Controller와 관찰성 통합
**Node Readiness Controller(NRC)**는 Kubernetes 1.32에 Beta로 도입된 컨트롤러로, Node Problem Detector(NPD)가 보고한 노드 문제를 기반으로 노드 taint를 자동 관리합니다. 이는 관찰성 데이터를 자동 조치(remediation)로 연결하는 Closed-Loop 관찰성(Closed-Loop Observability) 패턴의 핵심 구성 요소입니다.
관찰성 파이프라인에서의 역할:
- 수집: Node Monitoring Agent Add-on이 하드웨어/OS 문제 탐지
- 보고: NPD가 Node Condition으로 K8s API에 상태 보고
- 감지: NRC가 Node Condition 변화를 모니터링
- 조치: NRC가 자동으로
node.kubernetes.io/unschedulabletaint 적용/제거 - 관찰: CloudWatch Container Insights 및 AMP가 taint 변경 이벤트 추적
- 알림: SNS/EventBridge를 통해 운영팀에 노드 상태 변화 통지
CloudWatch Container Insights 통합:
# NRC 관련 노드 taint 변경 이벤트를 CloudWatch Logs Insights로 조회
aws logs start-query \
--log-group-name /aws/containerinsights/my-cluster/application \
--start-time $(date -u -d '1 hour ago' +%s) \
--end-time $(date -u +%s) \
--query-string '
fields @timestamp, kubernetes.node_name, message
| filter message like /NoSchedule/
| filter message like /node.kubernetes.io\/unschedulable/
| sort @timestamp desc
'
# 출력 예시:
# 2026-02-12 10:23:45 | node-abc123 | Taint added: node.kubernetes.io/unschedulable:NoSchedule (DiskPressure)
# 2026-02-12 10:28:12 | node-abc123 | Taint removed: node.kubernetes.io/unschedulable (DiskPressure resolved)
Prometheus 메트릭 수집:
NRC는 kube-controller-manager의 일부로 동작하며, 다음 메트릭을 노출합니다:
# ServiceMonitor로 NRC 메트릭 수집
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: node-readiness-controller
namespace: kube-system
spec:
selector:
matchLabels:
component: kube-controller-manager
endpoints:
- port: metrics
path: /metrics
interval: 30s
# 주요 메트릭:
# - node_readiness_controller_reconcile_total: NRC reconciliation 실행 횟수
# - node_readiness_controller_reconcile_duration_seconds: Reconciliation 처리 시간
# - node_readiness_controller_taint_changes_total: Taint 적용/제거 횟수
AMG(Amazon Managed Grafana) 대시보드 시각화:
{
"dashboard": {
"title": "Node Readiness & Health",
"panels": [
{
"title": "Nodes with Unschedulable Taints",
"targets": [{
"expr": "count(kube_node_spec_taint{key='node.kubernetes.io/unschedulable'})"
}]
},
{
"title": "NRC Reconciliation Rate",
"targets": [{
"expr": "rate(node_readiness_controller_reconcile_total[5m])"
}]
},
{
"title": "Node Condition Changes (24h)",
"targets": [{
"expr": "increase(node_readiness_controller_taint_changes_total[24h])"
}]
}
]
}
}
EventBridge 기반 알림 자동화:
# EventBridge Rule: NRC taint 변경 시 SNS 알림
apiVersion: v1
kind: ConfigMap
metadata:
name: eventbridge-rule
data:
rule.json: |
{
"source": ["aws.eks"],
"detail-type": ["EKS Node Taint Change"],
"detail": {
"taintKey": ["node.kubernetes.io/unschedulable"],
"action": ["added", "removed"]
}
}
---
# SNS 주제로 알림 전송
# 알림 예시:
# [ALERT] Node ip-10-0-1-45.ap-northeast-2.compute.internal
# Taint added: node.kubernetes.io/unschedulable:NoSchedule
# Reason: DiskPressure detected by Node Monitoring Agent
# Action: Pods will not be scheduled until condition resolves
Dry-run 모드 활용 (프로덕션 적용 전 검증):
NRC는 세 가지 모드를 지원합니다:
| 모드 | 설명 | 사용 시기 |
|---|---|---|
dry-run | Taint 변경을 시뮬레이션만 수행 (실제 적용 안 함) | 프로덕션 적용 전 영향 범위 평가 |
bootstrap-only | 클러스터 부팅 시에만 taint 적용 | 초기 노드 준비 단계에서만 사용 |
continuous | 지속적으로 노드 상태 모니터링 및 taint 관리 | 프로덕션 환경 (권장) |
# Dry-run 모드로 NRC 활성화 (영향 범위 시뮬레이션)
kubectl patch deployment kube-controller-manager \
-n kube-system \
--type='json' \
-p='[{
"op": "add",
"path": "/spec/template/spec/containers/0/command/-",
"value": "--feature-gates=NodeReadinessController=true"
},{
"op": "add",
"path": "/spec/template/spec/containers/0/command/-",
"value": "--node-readiness-controller-mode=dry-run"
}]'
# Dry-run 결과를 CloudWatch Logs Insights로 분석
aws logs start-query \
--log-group-name /aws/containerinsights/my-cluster/application \
--start-time $(date -u -d '1 hour ago' +%s) \
--end-time $(date -u +%s) \
--query-string '
fields @timestamp, message
| filter message like /dry-run/
| filter message like /would add taint/
| stats count() by kubernetes.node_name
'
# 출력: 각 노드별로 적용될 taint 개수 확인
# → 영향 범위 평가 후 continuous 모드로 전환 결정
점진적 Rollout 전략:
- Dry-run 단계: 관찰 성 대시보드에서 시뮬레이션 결과 모니터링
- Bootstrap-only 단계: 노드 부팅 시에만 taint 적용하여 초기 영향 평가
- Continuous 단계: 프로덕션 환경에 완전 활성화 및 지속 모니터링
NRC는 관찰성 데이터를 바탕으로 자동 조치를 수행하는 Closed-Loop Observability 패턴의 좋은 예시입니다. Node Monitoring Agent가 문제를 탐지하면 NRC가 자동으로 노드를 격리하여 워크로드 안정성을 유지합니다. 이는 사람의 개입 없이 시스템이 스스로 회복하는 Self-Healing Infrastructure의 핵심 구성 요소입니다.
2.4 Container Network Observability (2025.11)
2025년 11월 re:Invent에서 발표된 Container Network Observability는 EKS 환경에서 K8s 컨텍스트를 포함한 네트워크 가시성을 제공하는 기능입니다. 기존 VPC Flow Logs가 IP 수준의 트래픽만 보여주었다면, Container Network Observability는 Pod → Pod, Pod → Service, Pod → 외부 서비스 수준의 네트워크 플로우를 K8s 메타데이터(네임스페이스, 서비스명, Pod 라벨)와 함께 제공합니다.
# Network Flow Monitoring Agent Add-on 설치
aws eks create-addon \
--cluster-name my-cluster \
--addon-name aws-network-flow-monitoring-agent
# VPC CNI에서 Container Network Observability 활성화
aws eks update-addon \
--cluster-name my-cluster \
--addon-name vpc-cni \
--configuration-values '{"enableNetworkPolicy":"true"}'
주요 기능:
- Pod 수준 네트워크 메트릭: TCP 재전송, 패킷 드롭, 연결 지연시간을 Pod/Service 단위로 추적
- Cross-AZ 트래픽 가시성: AZ 간 데이터 전송량을 서비스별로 측정하여 불필요한 Cross-AZ 비용 식별
- K8s 컨텍스트 네트워크 맵: 네트워크 플로우에 네임스페이스, 서비스명, Pod 라벨 자동 매핑
- AWS 서비스 통신 추적: Pod에서 S3, RDS, DynamoDB 등 AWS 서비스로의 트래픽 패 턴 분석
- 선호 관찰성 스택 연동: AMP/Grafana, CloudWatch, Datadog 등 어떤 백엔드로든 메트릭 전송 가능
Container Network Observability와 함께, EKS는 Enhanced Network Security Policies도 도입했습니다. 클러스터 전체에 걸친 네트워크 접근 필터를 중앙에서 적용하고, DNS 기반 이그레스 정책으로 외부 트래픽을 세밀하게 제어할 수 있습니다. VPC CNI의 Network Policy 기능을 기반으로 동작합니다.
5개의 관찰성 Managed Add-on만으로 인프라(Node Monitoring), 네트워크(NFM Agent → Container Network Observability), 애플리케이션(ADOT, CloudWatch Agent) 전 레이어 의 관찰성 기초가 확립됩니다. 모두 aws eks create-addon 한 줄로 배포되며, 버전 관리와 보안 패치는 AWS가 담당합니다.
2.6 CloudWatch Generative AI Observability
2025년 7월 Preview로 시작하여 10월 GA를 달성한 CloudWatch Generative AI Observability는 AI/ML 워크로드를 위한 새로운 관찰성 차원을 제공합니다. 기존 3-Pillar 관찰성(Metrics, Logs, Traces)에 AI 워크로드 전용 관찰성을 추가하여 4-Pillar 관찰성 시대를 엽니다.
2.6.1 핵심 기능
LLM 및 AI Agent 모니터링:
- Amazon Bedrock, EKS, ECS, 온프레미스 등 모든 인프라에서 실행되는 LLM 및 AI Agent 모니터링
- 토큰 소비 추적 (입력/출력 토큰 수, 토큰당 비용)
- 추론 레이턴시 분석 (요청-응답 시간, P50/P90/P99 레이턴시)
- End-to-end 트레이싱으로 전체 AI 스택 가시성 확보
AI 워크플로우 특화 관찰성:
- Hallucination 위험 경로 탐지: 모델이 잘못된 정보를 생성할 가능성이 높은 경로 식별
- Retrieval miss 식별: RAG(Retrieval-Augmented Generation) 시스템에서 검색 실패 추적
- Rate-limit retry 모 니터링: API 제한으로 인한 재시도 패턴 분석
- Model-switch 결정 추적: 여러 모델 간 전환 로직 모니터링
Amazon Bedrock AgentCore 통합:
- Agent 워크플로우, Knowledge Base, Tool 사용에 대한 즉시 사용 가능한 뷰 제공
- 크로스 도구 프롬프트 플로우 가시성
- 외부 프레임워크(LangChain, LangGraph, CrewAI) 지원
2.6.2 4-Pillar 관찰성 아키텍처
기존 3-Pillar 관찰성은 시스템의 **동작(behavior)**을 관찰하지만, AI 관찰성은 모델의 **의사결정(decision-making)**과 **품질(quality)**을 관찰합니다. 예를 들어, API 레이턴시(전통적)와 추론 품질(AI 특화)은 서로 다른 관찰 대상입니다.
2.6.3 활성화 방법
# CloudWatch Generative AI Observability 활성화 (EKS 워크로드)
# ADOT Collector에 AI Observability Exporter 추가
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: adot-ai-observability
namespace: observability
spec:
mode: deployment
config:
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
processors:
batch:
timeout: 10s
exporters:
awsxray:
region: ap-northeast-2
indexed_attributes:
- "gen_ai.system"
- "gen_ai.request.model"
- "gen_ai.usage.input_tokens"
- "gen_ai.usage.output_tokens"
awscloudwatch:
region: ap-northeast-2
namespace: "GenAI/Observability"
metric_declarations:
- dimensions:
- ["service.name", "gen_ai.request.model"]
metric_name_selectors:
- "gen_ai.usage.input_tokens"
- "gen_ai.usage.output_tokens"
- "gen_ai.request.duration"
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [awsxray]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [awscloudwatch]
EOF