Kubernetes 이벤트 보존과 AI Agent 조회 아키텍처
개요
장애 발생 시 AI Agent가 Kubernetes 이벤트를 자동 분석하는 시스템을 구축하려면, 이벤트 데이터의 구조적 제약을 먼저 이해해야 합니다. Kubernetes 이벤트는 클러스터 내에서 기본 1시간만 보존되는 휘발성 데이터이므로, "이벤트를 조회한다"는 목표는 반드시 외부 저장소로의 export 파이프라인을 전제로 합니다. 이 문서는 EKS 환경에서 이벤트를 수집·저장·조회하는 3계층 아키텍처와, EKS MCP 서버·CloudWatch MCP 서버를 활용해 AI Agent에 이벤트 데이터를 노출하는 방법을 다룹니다.
배경: Kubernetes 이벤트의 구조적 제약
1시간 TTL
Kubernetes Event 객체는 etcd에 저장되며, kube-apiserver의 --event-ttl 플래그 기본값은 1h0m0s입니다. EKS는 업스트림 기본값인 60분을 유지해 왔으며, 이벤트가 etcd를 채우면 API 서버 성능이 저하되기 때문에 오랫동안 이 설정의 변경을 허용하지 않았습니다(containers-roadmap #785). 60분이 지나면 etcd가 이벤트를 삭제하므로 kubectl get events로는 최근 1시간의 이벤트만 조회할 수 있습니다.
EKS는 최근 Kubernetes control plane customization 기능을 통해 scheduler, controller manager, API server 설정 일부를 노출하기 시작했으며, 여기에 event time-to-live 설정이 포함됩니다(EKS 콘솔 도움말). 다만 TTL을 늘리면 etcd 저장 객체가 증가해 컨트롤 플레인 성능에 영향을 줄 수 있고, 아래의 best-effort 특성은 그대로 유지되므로, TTL 연장은 export 파이프라인의 대체재가 아니라 보완재로 취급해야 합니다. 지원 버전·API 세부 사항은 적용 전 최신 문서에서 확인이 필요합니다.
Best-effort 데이터
Kubernetes Event v1 API 문서는 이벤트를 다음과 같이 정의합니다: "Events have a limited retention time... should be treated as informative, best-effort, supplemental data." 이벤트는 보존과 전달이 보장되지 않는 보조 신호이며, 장애 분석의 유일한 근거로 삼을 수 없습니다.
Audit 로그로 대체 불가
EKS 컨트롤 플레인 audit 로그를 활성화해도 Event 객체는 수집되지 않습니다. EKS 감사 정책에 Do not log events resources(level: None)가 명시되어 있기 때문입니다(EKS Best Practices: Auditing and logging). Audit 로그는 "누가 어떤 API를 호출했는가"를 기록하므로 원인 추적에 유용하지만, Event 리소스 자체의 보존 수단이 될 수 없습니다.
Amazon EventBridge의 aws.eks 소스 이벤트는 EKS 서비스 이벤트(add-on 생성/삭제/헬스 등)만 전달합니다. Pod 스케줄링 실패, OOMKilled 같은 Kubernetes 클러스터 이벤트는 EventBridge로 전달되지 않습니다.
아키텍처: 수집 → 저장 → 조회 3계층
이벤트를 AI Agent가 조회할 수 있게 만들려면 수집(export), 저장(durable store), 조회(query interface)를 분리해 설계합니다.
수집 계층: Export 방식 비교
| 방식 | 수집 대상 | 특징 | 적합한 경우 |
|---|---|---|---|
| CloudWatch Observability add-on (Container Insights) | 컨테이너/호스트/데이터플레인 로그 | 관리형 add-on, Fluent Bit 기반 | CloudWatch 중심 스택 |
| kubernetes-event-exporter | Event 객체 전체 | 속성 기반 필터·라우팅, leader election HA, 20개 이상 sink | 이벤트 전용 파이프라인 |
ADOT / OTel Collector (k8sobjects receiver) | Event 포함 K8s 객체 | 기존 OTel 파이프라인에 통합 | OTel 표준화 환경 |
| 자체 watcher (aws-samples/eks-event-watcher) | 선택한 이벤트 | Kubernetes API watch 기반 커스텀 | 특수 필터링 요구 |
표준 Container Insights의 Fluent Bit DaemonSet이 기본 수집하는 것은 /aws/containerinsights/{cluster}/application(컨테이너 로그), /host(호스트 로그), /dataplane(kubelet 등 데이터플레인 로그)입니다. Event 객체(kubectl get events)는 기본 수집 대상이 아닙니다. "Container Insights로 이벤트를 저장 중"이라면 별도의 이벤트 수집 설정이 실제로 존재하는지, 어느 로그 그룹에 쌓이는지 먼저 확인해야 합니다.
kubernetes-event-exporter는 이벤트 파이프라인의 사실상 커뮤니티 표준입니다. EKS Workshop에서도 OpenSearch로의 이벤트 export에 이 도구를 사용합니다. 프로덕션 구성 시 다음을 적용합니다:
# kubernetes-event-exporter 구성 예시 (Loki sink)
logLevel: info
kubeQPS: 100 # 대규모 클러스터에서 이벤트 유실 방지
kubeBurst: 500
maxEventAgeSeconds: 60
leaderElection:
enabled: true # HA 배포 시 중복 전송 방지
receivers:
- name: "loki"
loki:
url: http://loki.monitoring:3100/loki/api/v1/push
streamLabels: # 정적 라벨만 지원 (템플릿은 layout/headers에서만 동작)
app: kube-events
route:
routes:
- match:
- receiver: "loki"
drop:
- type: "Normal" # Warning만 저장 — Normal이 대부분이므로 수집량 대폭 절감
저장 계층: 조회 패턴 기준 선택
저장소는 이벤트를 "어떻게 조회할 것인가"를 기준으로 선택합니다.
| 저장소 | 조회 패턴 | 보존 비용 | MCP 연동 |
|---|---|---|---|
| CloudWatch Logs | Logs Insights 쿼리, 패턴 분석 | 중간 (S3 export로 절감) | CloudWatch MCP, EKS MCP 직접 지원 |
| OpenSearch | 필드 기반 정밀 검색, 대시보드 | 중간~높음 | 커스텀 툴 필요 |
| Loki | LogQL, 저비용 장기 보관 | 낮음 | 커스텀 툴 필요 |
| S3 + Athena | SQL 사후 분석, 아카이브 | 매우 낮음 | 커스텀 툴 필요 |
| Kinesis / Firehose | 실시간 스트림 처리 | 전송량 기반 | 커스텀 툴 필요 |
CloudWatch에 이미 이벤트가 쌓이고 있다면 Loki로 재전송(CloudWatch → Loki)하는 구성은 홉이 하나 낭비됩니다. Loki를 목적지로 쓰려면 kubernetes-event-exporter에서 Loki로 직접 전송하는 것이 CloudWatch 수집 비용도 절감합니다.