[Argo Events] webhook event source service에 ingress 걸기


webhook event source service에 ingress 를 걸어줘야 dns통해서 편하게 웹훅 호출이 가능하다.
ingress랑 어떻게 연결하는지 알아보자.

ClusterIP Service

argo workflow에서 webhook event source를 생성하면 service가 자동으로 생성된다

webhook-eventsource-svc 라는 이름으로 뜨는데 보면 cluster IP를 물고있다

포트는 내가 아래 설정한 포트 설정값으로 들어감

apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
  name: webhook
spec:
	######### k8s service 설정 
  service:
    ports:
      - port: 12000
        targetPort: 12000

	######### 웹훅 설정 
  webhook:
    example:
      port: "12000"
      endpoint: /example
      method: POST

서비스가 떴기에 같은 클러스터 내에서는 http://{서비스명}.{네임스페이스명}:{포트}/{엔드포인트} 형식으로 호출이 가능하다. 예를들어 default 네임스페이스에 위와 같은 이벤트소스를 띄웠다면 [http://webhook-eventsource-svc.default:12000/example](http://webhook-eventsource-svc.default:12000/example) 주소로 호출을 할 수 있다.

하지만 내가원하는건 클러스터 외부에서도 도메인주소를 통해 호출할수 있는 웹훅을 원했다

이를위해서는 위 서비스를 물고있는 ingress를 띄워줘야한다.

ingress는 아래와 같은 설정값으로 띄울 수 있다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webhook-eventsource-ing
  namespace: ml
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: 'ip' # 반드시 target-type을 ip로 명시 
    alb.ingress.kubernetes.io/healthcheck-path: /
spec:
  rules:
  - host: test.com # 내가사용할host (유효한 host)
    http:
      paths:
      - path: /*
        backend:
          service:
            name: webhook-eventsource-svc
            port:
              number: 12000
        pathType: ImplementationSpecific
  defaultBackend:
    service:
      name: webhook-eventsource-svc
      port:
        number: 12000

annotations 는 내가 사용하는 환경이 aws라.. alb class를 사용하고있는데 nginx class를 사용한다면 그에 해당하는 어노테이션을 찾아서 설정해주면 될거같다

저렇게 설정했다면 나는 이제 [http://test.com/example](http://test.com/example) 로 workflow webhook을 호출할 수 있게 되었다.!

NodePort

사내 특정 클러스터환경에서 clusterIP로 인그레스를 띄웠더니 도메인이 안붙는 현상이 발생..

삽질하다가 플랫폼팀으로부터 들은 청천벽력과 같은 소식.. cni라는놈이 있는데 이게 어떤 구성이냐에 따라서 clusterIP를 사용 못하는 케이스도 있다고한다.

여튼 그래서 노드포트로 서비스를 다시 띄워야하는데 이게 찾아보니까 웹훅 이벤트소스에서 굳이굳이 service targetport를 지정해줘서 내부적으로 service가 자동으로 뜬거였다. 공부 제대로 안하고 예제만 따라갔더니 크게 과오가왔다.

그래서 이벤트소스에서 굳이 설정해줬던 service 항목을 지워주자

apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
  name: webhook
spec:
	######### k8s service 설정  --> 지워버린다..^^ 
  #service:
  #  ports:
  #    - port: 12000
  #      targetPort: 12000

	######### 웹훅 설정 
  webhook:
    example:
      port: "12000"
      endpoint: /example
      method: POST

이러면 자동으로 서비스가 뜨지 않는다. 따라서 nodeport 타입 서비스를 임의로 띄워준다.

apiVersion: v1
kind: Service
metadata:
  name: webhook-eventsource-svc
  labels:
    app: webhook-eventsource-svc
spec:
  ports:
  - port: 12000
    protocol: TCP
  selector:
    controller: eventsource-controller
    eventsource-name: webhook
    owner-name: webhook
  type: NodePort # 중요 

이제 nodeport타입 서비스를 물게 ingress를 띄워준다. (target-type: ip 어노테이션은 삭제)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webhook-eventsource-ing
  namespace: ml
  annotations:
    kubernetes.io/ingress.class: alb 
    alb.ingress.kubernetes.io/healthcheck-path: /
spec:
  rules:
  - host: test.com # 내가사용할host (유효한 host)
    http:
      paths:
      - path: /*
        backend:
          service:
            name: webhook-eventsource-svc
            port:
              number: 12000
        pathType: ImplementationSpecific
  defaultBackend:
    service:
      name: webhook-eventsource-svc
      port:
        number: 12000





© 2020. by berrrrr

Powered by berrrrr