개요
- 공식 사이트 / GitHub
- Kubernetes용 이벤트 기반 워크플로 자동화 프레임워크 — CNCF Incubating
- 외부 이벤트(웹훅, 메시지 큐, 클라우드 이벤트 등)를 감지하고 Kubernetes 작업(Argo Workflow, Job, HTTP 호출 등)을 트리거
- CloudEvents 표준 준수
- 핵심 흐름:
EventSource → EventBus → Sensor → Trigger
| 특징 |
설명 |
| 다양한 이벤트 소스 지원 |
Webhook, Kafka, AWS SQS/SNS, GitHub, GitLab, GCP PubSub 등 20+ |
| 복잡한 종속성 표현 |
AND/OR 등 임의 불리언 논리로 다중 이벤트 조합 |
| 확장성 |
gRPC 기반 Generic EventSource로 커스텀 소스 추가 가능 |
| HA 지원 |
Active-Active / Active-Passive 전략 선택 |
| 필터링 & 변환 |
이벤트 데이터에 조건·스크립트 적용 후 트리거 |

아키텍처

- EventSource: 외부 이벤트 수신 → CloudEvents 포맷으로 변환 → EventBus 발행
- EventBus: EventSource ↔ Sensor 간 메시지 전송 계층 (NATS JetStream / Kafka)
- Sensor: EventBus에서 이벤트 구독 → 종속성 조건 평가 → Trigger 실행
- Trigger: 실제 작업 수행 (Argo Workflow 제출, K8s 오브젝트 생성, HTTP 호출 등)
EventSource
- 외부 소스의 이벤트를 소비하는 구성 정의 — Pod로 배포되어 이벤트를 수신
- 이벤트를 CloudEvents 포맷으로 변환해 EventBus에 발행
지원 소스
| 카테고리 |
소스 |
| 메시지 큐 |
Kafka, AMQP, NATS, MQTT, NSQ, Pulsar, Redis, Redis Streams, Emitter |
| 클라우드 |
AWS SQS, AWS SNS, Azure Events Hub, Azure Service Bus, Azure Queue Storage, GCP PubSub |
| Git |
GitHub, GitLab, Bitbucket, Bitbucket Server |
| K8s |
K8s Resources (리소스 변경 감지) |
| 기타 |
Webhook (HTTP), Calendar, File, Minio, Stripe, Slack, NetApp StorageGrid |
| 커스텀 |
Generic EventSource (gRPC 확장) |
HA 전략
- Active-Active: 모든 복제본이 트래픽 처리 — 지원: Webhook, GitHub, GitLab, AWS SNS/SQS, Slack 등
- Active-Passive: 하나만 활성, 나머지 대기 — 지원: Kafka, NATS, GCP PubSub, Calendar, Redis 등
spec.replicas로 복제본 수 설정
- Kafka EventBus 외에는 NATS 기반 Leader Election 사용
Filtering
- 이벤트 게시 여부를 결정 — 조건에 맞는 이벤트만 EventBus로 전달
Webhook 인증
spec.webhook.authSecret 필드로 시크릿 지정
- 헬스체크:
:${port}/health 엔드포인트 자동 생성
Generic EventSource (gRPC 확장)
- gRPC 서버를 구현해 커스텀 이벤트 소스를 Argo Events에 통합

EventBus
- EventSource와 Sensor 사이의 전송 계층 — 이벤트 큐 역할
- EventSource → (발행) → EventBus → (구독) → Sensor
| 유형 |
특징 |
| NATS Streaming (deprecated) |
레거시, 신규 사용 비권장 |
| JetStream (권장) |
NATS JetStream — 정확히 한 번(exactly-once) 보장 |
| Kafka |
기존 Kafka 클러스터 연동, 대용량 이벤트 처리 |
Sensor
- 이벤트 종속성(입력) 과 트리거(출력) 를 정의
- EventBus에서 이벤트 구독 → 조건 평가 → 트리거 실행
Filters (이벤트 필터)
유효성을 검사해 조건에 맞는 이벤트만 트리거:
| 필터 유형 |
설명 |
| Expr Filter |
표현식 기반 조건 |
| Data Filter |
이벤트 데이터 필드 비교 |
| Script Filter |
Lua / JS 스크립트 조건 |
| Context Filter |
CloudEvent 컨텍스트 필드 검사 |
| Time Filter |
시간 범위 내 이벤트만 통과 |
- 필터 적용 전에 이벤트 데이터를 변환
- Lua 스크립트 또는 JQ 명령 사용
- 변환 실패 시 이벤트 드롭
다중 종속성 (Multiple Dependencies)
A && B 조건: A·B가 모두 도착했을 때 각 소스의 최신 이벤트로 트리거
- A가 a1~a10 발행 후 b1 도착 → a10 + b1 조합으로 실행
- 임의 불리언 논리 (
&&, ||, 중첩 조건) 표현 가능
이벤트 전달 보장
| EventBus |
전달 보장 |
| NATS Streaming |
최소 한 번 (at-least-once) |
| JetStream |
정확히 한 번 (exactly-once) |
| Kafka |
최소 한 번 (at-least-once) |
- 최근 5분 전달된 이벤트 ID를 인메모리 캐시에 보관 → 중복 이벤트 방지
트리거 재시도 & Rate Limit
- 기본 재시도 없음 (예상치 못한 결과 방지)
sensor.spec.triggers[].retryStrategy로 재시도 정책 설정
sensor.spec.triggers[].rateLimit으로 트리거 속도 제한
revisionHistoryLimit으로 히스토리 보관 수 제한
Trigger
- 이벤트 종속성이 충족되면 Sensor가 실행하는 실제 작업
sensor.spec.triggers[].conditions로 조건 지정 (없으면 모든 종속성 AND)
지원 트리거
| 트리거 유형 |
설명 |
| Argo Workflow |
Argo Workflow 리소스 제출 |
| Argo Rollouts |
Rollout 업데이트 |
| Kubernetes Objects |
K8s 리소스 생성 / 업데이트 / 삭제 |
| HTTP |
HTTP POST 등 외부 엔드포인트 호출 |
| Kafka |
Kafka 토픽으로 메시지 발행 |
| NATS |
NATS 주제로 메시지 발행 |
| Pulsar |
Pulsar 토픽으로 메시지 발행 |
| AWS Lambda |
Lambda 함수 호출 |
| Azure Event Hubs |
Azure Event Hub으로 이벤트 전송 |
| Slack |
Slack 메시지 전송 |
| Log |
이벤트 내용 로그 출력 (디버그용) |
| OpenWhisk |
Apache OpenWhisk 액션 호출 |
| Build Your Own |
커스텀 트리거 구현 |
설치
kubectl
kubectl create namespace argo-events
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-events/stable/manifests/install.yaml
Helm
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argo-events argo/argo-events \
-n argo-events --create-namespace
기본 사용 예시
EventBus 생성
apiVersion: argoproj.io/v1alpha1
kind: EventBus
metadata:
name: default
namespace: argo-events
spec:
jetstream:
version: "2.9.6"
Webhook EventSource
apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
name: webhook
namespace: argo-events
spec:
webhook:
example:
port: "12000"
endpoint: /example
method: POST
Argo Workflow 트리거 Sensor
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
name: webhook-sensor
namespace: argo-events
spec:
dependencies:
- name: test-dep
eventSourceName: webhook
eventName: example
triggers:
- template:
name: trigger-workflow
argoWorkflow:
operation: submit
source:
resource:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: webhook-wf-
spec:
entrypoint: whalesay
templates:
- name: whalesay
container:
image: docker/whalesay
command: [cowsay]
args: ["hello world"]
운영 고려사항
- Managed Namespace: 특정 네임스페이스만 감시하도록 제한 가능
- Validating Admission Webhook: EventSource / Sensor 리소스 유효성 사전 검증
- Prometheus Metrics: EventSource·Sensor의 이벤트 처리 지표 자동 노출 (
/metrics)
- HA/DR: 멀티 복제본 + JetStream Clustering + 외부 Kafka EventBus 조합으로 고가용성 구성
유사 도구 비교
| 도구 |
접근 방식 |
특징 |
| Argo Events |
K8s 네이티브 이벤트 |
복잡한 이벤트 종속성, Argo Workflow 연동 강점 |
| Tekton Triggers |
K8s 네이티브 CI/CD |
Tekton Pipeline과 통합, 단순 Webhook→Pipeline 패턴 |
| Knative Eventing |
서버리스 이벤트 |
CloudEvents 표준, 서버리스 스케일-투-제로 |
| KEDA |
이벤트 기반 오토스케일 |
메시지 큐 큐 크기에 따른 Pod 스케일링 특화 |
관련 포스트