Knative Eventing
1️⃣ Knative Eventing이란? (이벤트 기반 아키텍처)
Knative Eventing은 이벤트 기반 아키텍처(Event-Driven Architecture, EDA)를 Kubernetes에서 쉽게 구현할 수 있도록 지원하는 컴포넌트입니다.
이를 통해 외부 시스템(GitHub, Kafka, NATS 등) 또는 내부 애플리케이션에서 발생한 이벤트를 처리하고, 이벤트 기반 서버리스 애플리케이션을 구현할 수 있습니다.
✅ Knative Eventing의 주요 특징
- 이벤트 기반 아키텍처 지원 → 애플리케이션 간 느슨한 결합(Loose Coupling)
- CloudEvents 표준 지원 → 다양한 이벤트 소스와의 상호운용성 보장
- 자동 확장(Autoscaling) → 필요할 때만 실행되는 서버리스 컴퓨팅
- 다양한 이벤트 소스 지원 → Kafka, GitHub Webhook, Google Cloud Pub/Sub 등과 연동 가능
💡 Knative Eventing의 전체 아키텍처
2️⃣ EventSources (이벤트 생산자 설정, GitHub, Kafka 등)
EventSources는 외부 또는 내부 시스템에서 발생한 이벤트를 수집하는 역할을 합니다.
이벤트는 Knative Eventing 시스템으로 전달되며, 이후 트리거(Trigger)를 통해 특정 서비스로 라우팅됩니다.
1. GitHub EventSource 설정 예제
apiVersion: sources.knative.dev/v1
kind: GitHubSource
metadata:
name: github-source
spec:
eventTypes:
- "push"
- "pull_request"
ownerAndRepositories:
- "my-org/my-repo"
secretRef:
name: github-secret
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-display
- GitHub의
push
와pull_request
이벤트를 감지하여 event-display 서비스로 전달.
2. Kafka EventSource 설정 예제
apiVersion: sources.knative.dev/v1beta1
kind: KafkaSource
metadata:
name: kafka-source
spec:
bootstrapServers: my-cluster-kafka-bootstrap.kafka:9092
topics: my-topic
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-display
- Kafka의
my-topic
에서 메시지를 받아 event-display 서비스로 전달.
3️⃣ Triggers (이벤트 트리거링, Knative 서비스와의 연결)
Trigger는 특정 이벤트를 필터링하여 Knative 서비스로 전달하는 역할을 합니다.
1. 특정 이벤트 필터링 및 전달 예제
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: my-trigger
spec:
broker: default
filter:
attributes:
type: dev.knative.example.event
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-processor
dev.knative.example.event
타입의 이벤트를 감지하면 event-processor 서비스로 전달.
4️⃣ Channels (이벤트 전송 및 버퍼링)
Channel은 이벤트를 버퍼링하여 여러 구독자(Subscription)에게 전송하는 역할을 합니다.
Knative는 InMemoryChannel, KafkaChannel 등 다양한 채널 유형을 지원합니다.
1. InMemoryChannel 생성 예제
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
metadata:
name: my-channel
2. KafkaChannel 생성 예제
apiVersion: messaging.knative.dev/v1alpha1
kind: KafkaChannel
metadata:
name: kafka-channel
spec:
numPartitions: 3
replicationFactor: 1
5️⃣ Subscriptions (이벤트 소비자 정의 및 구독)
Subscription은 Channel에서 발생한 이벤트를 특정 서비스로 전달하는 역할을 합니다.
1. InMemoryChannel에 대한 Subscription 예제
apiVersion: messaging.knative.dev/v1
kind: Subscription
metadata:
name: my-subscription
spec:
channel:
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
name: my-channel
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-handler
my-channel
을 구독하고, 이벤트를 event-handler 서비스로 전달.
6️⃣ Sink (이벤트를 수신할 대상)
Sink는 이벤트를 수신하는 최종 대상으로, 보통 Knative 서비스, Kubernetes 서비스, 외부 HTTP 엔드포인트 등이 될 수 있습니다.
1. Sink를 Knative Service로 지정
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: my-service
2. Sink를 외부 HTTP 엔드포인트로 지정
sink:
uri: "https://external-api.example.com/webhook"
7️⃣ EventBus (이벤트 전송 및 처리의 중앙 허브 역할)
EventBus는 이벤트를 수집하고 다양한 서비스로 전달하는 중앙 허브 역할을 합니다.
Knative에서 Broker와 Channel이 EventBus 역할을 수행합니다.
1. 기본 Broker 생성 예제
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: default
default
Broker를 생성하여 이벤트를 중앙에서 관리.
8️⃣ 이벤트 라우팅 및 필터링
Knative Eventing에서는 이벤트의 특정 속성(attribute)을 기반으로 필터링하여 서비스로 전달할 수 있습니다.
1. 특정 이벤트 필터링 예제
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: filter-trigger
spec:
broker: default
filter:
attributes:
type: dev.knative.example.event
source: my-source
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-processor
type
이dev.knative.example.event
이고source
가my-source
인 이벤트만 필터링.
9️⃣ Kafka, NATS 등 외부 이벤트 시스템과의 연동
Knative Eventing은 Kafka, NATS, Google Cloud Pub/Sub 등 다양한 외부 이벤트 시스템과 연동할 수 있습니다.
1. KafkaSource를 사용한 Kafka 연동
apiVersion: sources.knative.dev/v1beta1
kind: KafkaSource
metadata:
name: kafka-source
spec:
bootstrapServers: my-cluster-kafka-bootstrap.kafka:9092
topics: my-topic
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-display
- Kafka의
my-topic
에서 메시지를 읽어 event-display 서비스로 전달.
2. NATS 연동 예제
apiVersion: messaging.knative.dev/v1alpha1
kind: NatsChannel
metadata:
name: nats-channel
spec:
natsURL: "nats://nats.example.com:4222"
- NATS 메시징 시스템과 Knative Eventing을 연결.