Kubernetes 이야기

Argo Event 본문

Kubernetes/devops

Argo Event

kmaster 2022. 5. 3. 19:01
반응형

Argo Events 는 Webhook, S3, 일정, 메시징 대기열, gcp pubsub, sns, sqs와 같은 다양한 소스의 이벤트에서 K8s 개체, Argo Workflows, Serverless 워크로드 등을 트리거하는 데 도움이 되는 Kubernetes용 이벤트 기반 워크플로 자동화 프레임워크이다.

 

https://argoproj.github.io/argo-events/

 

특징

  • 20개 이상의 이벤트 소스에서 이벤트를 지원
  • 워크플로 자동화를 위한 비즈니스 수준 제약 논리를 사용자 지정하는 기능
  • 단순한 선형 실시간 이벤트부터 복잡한 다중 소스 이벤트까지 모든 것을 관리
  • Kubernetes Objects, Argo Workflow, AWS Lambda, Serverless 등을 트리거로 지원

 

Architecture

https://argoproj.github.io/argo-events/concepts/architecture/

 

Component 설명
Event Source 이벤트 소스는 AWS SQS, SNS, GCP Pub/Sub 및 Webhook과 같은 소스에서 이벤트를 소비하는 데 필요한 구성을 정의한다. 이벤트 소스는 이벤트를 클라우드 이벤트로 변환하고( CloudEvents 사양 에 따라) 이벤트 버스로 전달할 수 있다.

가능한 이벤트 소스
  1. AMQP
  2. AWS SNS
  3. AWS SQS
  4. Azure Events Hub
  5. Bitbucket
  6. Bitbucket Server
  7. Calendar
  8. Emitter
  9. File Based Events
  10. GCP PubSub
  11. Generic EventSource
  12. GitHub
  13. GitLab
  14. HDFS
  15. K8s Resources
  16. Kafka
  17. Minio
  18. NATS
  19. NetApp StorageGrid
  20. MQTT
  21. NSQ
  22. Pulsar
  23. Redis
  24. Slack
  25. Stripe
  26. Webhooks
Sensor 센서는 입력 및 출력에 해당하는 이벤트의 종속성과 트리거를 정의한다. 센서는 이벤트 버스에서 이벤트를 수신하고 이벤트 종속성을 독립적으로 관리하여 트리거를 해결하고 실행한다.
Enentbus 이벤트 버스는 전송 계층 역할을 하고 이벤트 소스와 센서 간에 이벤트를 전송하는 Kubernetes의 사용자 지정 리소이다.
이벤트 소스는 이벤트를 게시하고 센서는 이벤트 트리거를 실행하기 위해 이벤트를 구독한다. 이벤트 소스는 이벤트를 게시하는 반면 센서는 이벤트를 구독하여 트리거를 실행행한다. NATS 스트리밍은 현재 이벤트 버스 구현을 지원한다.
Trigger 트리거는 이벤트 종속성을 해결한 후 센서가 실행하는 리소스 또는 워크로드이다.

다양한 유형의 트리거는 다음과 같다.
  1. AWS Lambda
  2. Apache OpenWhisk
  3. Argo Rollouts
  4. Argo Workflows
  5. Custom - Build Your Own
  6. HTTP Requests - Serverless Workloads (OpenFaaS, Kubeless, KNative etc.)
  7. Kafka Messages
  8. NATS Messages
  9. Slack Notifications
  10. Azure Event Hubs Messages
  11. Create any Kubernetes Objects
  12. Log (for debugging event bus messages)

 

설치

전제조건

  • Kubernetes 1.11 이상
  • kubectl 1.11.0 이상

1단계 : 설치

# kubectl create namespace argo-events
# kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-events/stable/manifests/install.yaml

Install with a validating admission controller
# kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-events/stable/manifests/install-validating-webhook.yaml

 

설치내역은 아래와 같다.

# k get all -n argo-events
NAME                                          READY   STATUS    RESTARTS   AGE
pod/eventbus-controller-6668956d87-dnz9l      1/1     Running   0          75s
pod/events-webhook-7f85cf8849-k6rfs           1/1     Running   0          65s
pod/eventsource-controller-797c9f4b66-dvgbg   1/1     Running   0          75s
pod/sensor-controller-6456f5f95d-m8mlm        1/1     Running   0          75s

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/events-webhook   ClusterIP   10.110.138.127   <none>        443/TCP   65s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/eventbus-controller      1/1     1            1           75s
deployment.apps/events-webhook           1/1     1            1           65s
deployment.apps/eventsource-controller   1/1     1            1           75s
deployment.apps/sensor-controller        1/1     1            1           75s

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/eventbus-controller-6668956d87      1         1         1       75s
replicaset.apps/events-webhook-7f85cf8849           1         1         1       65s
replicaset.apps/eventsource-controller-797c9f4b66   1         1         1       75s
replicaset.apps/sensor-controller-6456f5f95d        1         1         1       75s

 

2단계 : 테스트

 

Argo Events 설치 후 Webhook 에 대한 센서 및 이벤트 소스를 설정해 보자. 이를 통해 HTTP Post 요청을 통해 K8S workload나 Argo workflow 등을 트리거 할 수 있다.

 

이번 글에서는 eventsource를 통해 특정 요청을 받으면 Sensor를 통해 Kubernetes Deployment를 실행하는 간단한 테스트를 해보자.

 

Eventbus 설치

# kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/eventbus/native.yaml

 

Event Source 생성

apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
  name: webhook
  namespace: argo       
spec:
  service:
    ports:
    - port: 12000
      targetPort: 12000
  webhook:
    example:
      endpoint: /deploy
      method: POST
      port: "12000"
      url: ""

 

마지막으로 webhook 센서를 생성한다.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dev-user
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-role
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["deployments", "replicasets", "pods", "services", "ingresses"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-rolebinding
subjects:
- kind: ServiceAccount
  name: dev-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dev-role
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
  name: webhook
spec:
  template:
    serviceAccountName: dev-user
  dependencies:
    - name: test-dep
      eventSourceName: webhook
      eventName: example
  triggers:
    - template:
        name: webhook-pod-trigger
        k8s:
          operation: create
          source:
            resource:
              apiVersion: apps/v1
              kind: Deployment
              metadata:
                name: nginx-deployment
                namespace: argo-events
                labels:
                  app: nginx
              spec:
                replicas: 1
                selector:
                  matchLabels:
                    app: nginx
                template:
                  metadata:
                    labels:
                      app: nginx
                  spec:
                    containers:
                    - name: nginx
                      image: nginx:1.14.2
                      ports:
                      - containerPort: 80
          parameters:
            - src:
                dependencyName: test-dep
              dest: spec.containers.0.args.0

 

 

3. HTTP 요청 및 Trigger 실행 확인

# curl -d '{"message":"this is my first webhook"}' -H "Content-Type: application/json" -X POST http://10.107.232.23:12000/example
success

 

10.107.232.23는 webhook-eventsource의 service ip주소이다. 외부에서는 nodeport로 생성하여 호출하면 된다.

 

결과

 

# k get all -n argo-events
NAME                                             READY   STATUS    RESTARTS   AGE
pod/eventbus-controller-6668956d87-dnz9l         1/1     Running   0          141m
pod/eventbus-default-stan-0                      2/2     Running   0          139m
pod/eventbus-default-stan-1                      2/2     Running   0          138m
pod/eventbus-default-stan-2                      2/2     Running   0          138m
pod/events-webhook-7f85cf8849-k6rfs              1/1     Running   0          141m
pod/eventsource-controller-797c9f4b66-dvgbg      1/1     Running   0          141m
pod/nginx-deployment-66b6c48dd5-2grsw            1/1     Running   0          32s
pod/sensor-controller-6456f5f95d-m8mlm           1/1     Running   0          141m
pod/webhook-eventsource-snlbk-7dc686497d-dx27n   1/1     Running   0          137m
pod/webhook-sensor-mrjhb-8b7874fc7-xjgtx         1/1     Running   0          4m22s

NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/eventbus-default-stan-svc   ClusterIP   None             <none>        4222/TCP,6222/TCP,8222/TCP   139m
service/events-webhook              ClusterIP   10.110.138.127   <none>        443/TCP                      141m
service/webhook-eventsource-svc     ClusterIP   10.107.232.23    <none>        12000/TCP                    137m

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/eventbus-controller         1/1     1            1           141m
deployment.apps/events-webhook              1/1     1            1           141m
deployment.apps/eventsource-controller      1/1     1            1           141m
deployment.apps/nginx-deployment            1/1     1            1           32s
deployment.apps/sensor-controller           1/1     1            1           141m
deployment.apps/webhook-eventsource-snlbk   1/1     1            1           137m
deployment.apps/webhook-sensor-mrjhb        1/1     1            1           4m22s

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/eventbus-controller-6668956d87         1         1         1       141m
replicaset.apps/events-webhook-7f85cf8849              1         1         1       141m
replicaset.apps/eventsource-controller-797c9f4b66      1         1         1       141m
replicaset.apps/nginx-deployment-66b6c48dd5            1         1         1       32s
replicaset.apps/sensor-controller-6456f5f95d           1         1         1       141m
replicaset.apps/webhook-eventsource-snlbk-7dc686497d   1         1         1       137m
replicaset.apps/webhook-sensor-mrjhb-8b7874fc7         1         1         1       4m22s

NAME                                     READY   AGE
statefulset.apps/eventbus-default-stan   3/3     139m

 

위와 같이 nginx-deployment가 실행된 것을 볼 수 있다.

 

argo event 자체로는 별 거 아닌거 같지만, webhook이나 argo workflow등과 같이 이용하게 되면 많은 부분을 자동화 할 수 있는 좋은 오픈소스이다. 

 

다음에 좀 더 다양한 테스트를 진행해 보자.

반응형

'Kubernetes > devops' 카테고리의 다른 글

argocd (설치)  (0) 2022.05.13
GitOps and Flux  (0) 2022.05.07
Keda와 Prometheus를 이용한 Scale in/out  (0) 2022.04.28
Kubernetes의 Replica를 0으로 확장 (KEDA)  (0) 2022.04.27
OWASP ZAP 을 Kubernetes 환경에서 사용하기  (0) 2022.04.02
Comments