4 분 소요

개요

  • 공식 사이트 / 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에 통합

Generic EventSource


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 시간 범위 내 이벤트만 통과

Event Transformation

  • 필터 적용 전에 이벤트 데이터를 변환
  • 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 스케일링 특화


관련 포스트