본문 바로가기

개발관련/Kubernetes

Argo CD Webhook(with Bitbucket)

반응형

Argo CD에서는 기본적으로 3분 뒤 Git Repository를 폴링하여 새로운 manifest의 업데이트를 감지한다.

 

이런 지연 시간이 맘에 안든다면, Argo CD API 서버가 Git Repository의 Webhook 이벤트를 수신하도록 구성할 수 있다.

Argo CD는 Github, GitLab, Bitbucket, Bitbucket Server 및 Gogs의 git webhook 알림을 지원한다.

 

이번 글에서는 Bitbucket Webhook 이벤트를 트리거하여 Argo CD Sync를 자동으로 하는 방법을 알아본다.

 

 

사전 준비사항은 아래와 같다.

  1. kubectl이 설치되어 있어야 한다.
  2. Argo CD 대시보드가 있어야 한다.(Argo CD가 설치되어 있어야 한다.)
  3. Argo CD에 Webhook 이벤트를 연결할 Bitbucket Repository가 등록되어 있어야 한다.
  4. Argo CD 대시보드의 프로토콜이 HTTPS를 사용할 경우,(대게 그렇다) 인증서가 등록되어 있어야 한다.
  5. Argo CD 대시보드가 세팅되어있는 워커 노드의 방화벽에서 atlassian cidr을 수용해야 한다. (atlassian이 사용하고 있는 cidr 리스트)

 

우선 Bitbucket을 사용중이라고 가정한다.

 

 

Argo CD에서 바라보고 있는 Repository의 설정을 들어가서 왼쪽의 Webhooks 메뉴를 클릭한다.

 

 

 

 

 

그 다음, Webhooks 메뉴로 들어가서 Add webhook 버튼을 클릭한다.

 

 

 

 

아래 그림과 같이 Argo CD 대시보드로 사용하고 있는 서버의 도메인 + /api/webhook 을 URL에 넣고 Request History 옵션을 활성화 한 뒤 Save 버튼을 클릭하여 Webhook을 생성한다.(이는 Bitbucket Webhook의 UUID를 얻기 위함이다.)

 

 

 

 

Webhook을 생성하면 아래와 같이 확인할 수 있다. View requests 버튼을 클릭해보자.

 

 

 

 

그럼 아래와 같이 Webhook을 통해 Argo CD API로 요청을 날린 히스토리를 볼 수 있다.

만약 해당 Repository에 Push가 없었다면 Webhook 이벤트가 트리거되지 않아 아래와 같이 히스토리가 없을 수 있다.

그럴 때에는 테스트를 위해 간단한 코드 수정 후 Push를 해보자.

히스토리가 생겼다면 히스토리 리스트에서 오른쪽에 위치한 View details를 클릭한다.

 

 

 

 

View details를 클릭하면 아래와 같이 해당 Webhook event의 자세한 내용을 볼 수 있다.

여기서 우리는 DDos 방지를 위하여 UUID라는 고유한 값을 argocd-secret에 등록하여 해당 UUID가 헤더에 세팅된 요청만 수용하도록 argocd-secret을 수정할 것이다.

아래 화면에서 볼 수 있듯이 X-Hook-UUID라는 헤더가 존재한다. 이 헤더 값을 복사한다.

 

 

 

 

이제 복사한 UUID를 argocd-secret에 적용해보자.

아래 명령어를 통해 argocd-secret을 수정한다.

$ kubectl edit secret argocd-secret -n argocd

 

 

그럼 아래와 비슷한 화면을 볼 수 있다.

이 파일 내용이 argocd-secret manifest 내용이고 여기에 우리는 UUID 값을 추가할 것이다.

 

 

아래 그림과 같이 코드를 추가하고 저장한다.

 

 

아래 명령어를 통해 잘 적용되었는지 확인한다.

$ kubectl describe secret/argocd-secret -n argocd
Name:         argocd-secret
Namespace:    argocd
Labels:       app.kubernetes.io/name=argocd-secret
              app.kubernetes.io/part-of=argocd
Annotations:
Type:         Opaque

Data
====
webhook.bitbucket.uuid:  36 bytes <--- 해당 항목이 보인다면 성공한 것이다.
admin.password:          60 bytes
admin.passwordMtime:     20 bytes
server.secretkey:        44 bytes
tls.crt:                 1237 bytes
tls.key:                 1679 bytes

 

 

이제 실제 테스트를 위해 Repository에 Push를 한 뒤, 바로 Argo CD에서 Sync 되는지 확인해본다.

반응형