IT/DevOps

[DevOps] ArgoCD Slack Notification 설정하기

wookiist 2021. 7. 3. 21:03

2022.01.01 업데이트 - 명령어 순서와 내용의 흐름, 가독성을 위해 수정 및 업데이트하였습니다.

Prologue

ArgoCD를 사용하게 된 이래로, 재배포나 자동 배포에 대한 불편함이 많이 사라졌습니다. 팀 DevOps 파이프라인의 CD 쪽의 개선이 이루어져서 사용하시는 분들께서도, "이젠 이 파이프라인 없으면 못 살 것 같다" 라는 말씀도 종종해주시는 걸 보면 뿌듯합니다 😝

오늘은 ArgoCD에 정의한 애플리케이션이 어떤 상태에 있는지 전달 받을 수 있도록 Notification을 설정해보고자 합니다. ArgoCD는 Email, GitHub, Slack, Grafana, Webhook, Telegram, Teams 등의 다양한 알림 채널을 지원하고 있습니다. [참고] 많은 채널 중에 오늘은 Slack Notification 과정을 살펴보겠습니다.

대부분의 내용은 [여기]를 따릅니다. 원문을 확인하고 싶으신 분들께선 링크를 참조해주세요.

Slack

우선 Slack에 App을 만들어주어야 합니다. 설명을 위해 새 워크스페이스를 생성했습니다.

Configuration

  1. Slack 애플리케이션을 생성합니다. 애플리케이션 생성은 여기에서 진행하실 수 있습니다. Create an App > From scratch 버튼을 눌러 애플리케이션을 만들 수 있습니다

  2. https://user-images.githubusercontent.com/16011260/124345330-42509a00-dc13-11eb-84ac-ecf03df74ebc.png

  3. 애플리케이션을 생성했다면 화면이 이동했을 겁니다. 이제 화면 좌측 메뉴바에 보이는 OAuth & Permissions 로 이동합니다.

  4. https://user-images.githubusercontent.com/16011260/124345407-8fcd0700-dc13-11eb-8d5a-e1a46a6d1a37.png

  5. 위 이미지에서 하단에 보이는 Scopes > Bot Token Scopes 를 보면 Add an OAuth Scope 를 눌러 새로운 OAuth Scope를 만들 수 있습니다. 다음 이미지처럼 chat:write 를 입력해서 새로운 scope을 생성해줍니다.

    • 여담으로 애플리케이션이 메시지를 보낼 때 사용할 username이나 아이콘을 수정하려면 chat:write.customize scope를 추가해줍니다.
    • https://user-images.githubusercontent.com/16011260/124345552-8d1ee180-dc14-11eb-8f87-b81bc4a80042.png
  6. https://user-images.githubusercontent.com/16011260/124345472-07029b00-dc14-11eb-8be6-0086a0637588.png

  7. 이제 화면 최상단으로 올라와서 Install to Workspace 을 눌러 OAuth Token을 워크스페이스에 등록해줍니다. 화면이 바뀌면서 확인을 요청하는 단계로 넘어가면, 확인을 눌러 마저 진행합니다.

    • 화면이 바뀌면서 확인을 요청하는 단계로 넘어가면 허용을 눌러 남은 단계를 진행합니다.
    • https://user-images.githubusercontent.com/16011260/124345610-fb63a400-dc14-11eb-9df4-305a3f0e213b.png
  8. https://user-images.githubusercontent.com/16011260/124345581-b6d80880-dc14-11eb-810f-ab077b1d867a.png

  9. 그럼 다음 화면처럼 Bot User OAuth Token 이 생성됐을 텐데요. (보안상 토큰의 나머지는 생략합니다) 이 토큰을 가지고 ArgoCD Notification Secret 오브젝트를 만들어줄 겁니다. 이 토큰이 있어야 ArgoCD가 Slack으로 알림을 보낼 수가 있습니다.

  10. https://user-images.githubusercontent.com/16011260/124345691-61e8c200-dc15-11eb-8b2c-9f099cc25732.png

  11. 이제 ArgoCD가 알림을 전송할 워크스페이스의 채널에 우리가 만든 봇을 초대해줍니다. 채널 세부정보 열기에서 통합 메뉴를 누르고 다음처럼 앱을 추가해주면 됩니다. 이 작업을 해주지 않으면 알림이 오지 않습니다!

  12. https://user-images.githubusercontent.com/16011260/124345856-6661aa80-dc16-11eb-8d64-fd00008cefe6.png

ArgoCD Notification Configuration

Slack 설정은 마쳤으니 이제 ArgoCD Notification을 설정할 차례입니다.

  1. ArgoCD Notification 관련 패키지를 설치합니다. 본 포스트에서 사용하는 ArgoCD는 Kubernetes 클러스터에 배포된 상태입니다. 따라서 ArgoCD Notification 패키지도 Kubernetes에 배포합니다. 다음의 명령어를 실행해주세요. (단, ArgoCD를 배포한 네임스페이스에 함께 배포해주셔야 합니다.)

    $ kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/manifests/install.yaml
  2. 이제 ArgoCD Trigger 설정을 설치합니다. ArgoCD에서 관리하는 애플리케이션이 어떤 상황에서 어떤 메시지를 보내야 하는지를 정의하는 설정입니다. 마찬가지로 다음 명령어를 실행합니다. 또한 네임스페이스 역시 이전과 동일하게 설정해주세요.

    $ kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/catalog/install.yaml
  3. Slack 설정 과정에서 만든 토큰을 ArgoCD Notification 컴포넌트에 알려주어야 합니다. 다음의 내용을 파일로 생성하고, 이 다음에 나오는 명령어를 수행해주세요.

     $ kubectl apply -f argocd-notifications-secret.yaml

    참고로 현재 진행하는 모든 작업은 같은 네임스페이스에서 수행하셔야 합니다!

    # argocd-notifications-secret.yaml 
    apiVersion: v1 
    kind: Secret 
    metadata: 
      name: argocd-notifications-secret 
    stringData:
      slack-token: <여기에 토큰을 입력합니다>
  4. 이번엔 argocd-notifications-cm을 수정해줍니다. 토큰을 넣어주는 작업입니다. 이 작업도 다른 작업들과 동일하게 같은 네임스페이스에서 수행합니다. 아래 명령을 수행하면 argocd-notifications-cm 을 수정할 수 있는 편집기가 열립니다. 편집기 안에서 다음과 같이 수정해줍니다. 다른 내용은 건드리지 않고, 수정이 완료되었다면 저장하고 빠져나옵니다.

$ kubectl edit cm argocd-notifications-cm
apiVersion: v1 
kind: ConfigMap 
metadata: 
    name: argocd-notifications-cm 
data: 
    service.slack: | token: <여기에 토큰을 입력합니다> ...
  1. 이제 마지막 단계입니다. 애플리케이션에 Notification Trigger를 설정해주는 작업을 해줍니다.
    • Sync가 성공했을 때 알림
      $ kubectl patch app $APP\_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-succeeded.slack":"$SLACK\_CHANNEL\_NAME"}}}' --type merge
    • Sync가 실패했을 때 알림
      $ kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-failed.slack":"$SLACK_CHANNEL_NAME"}}}' --type merge
    • Sync가 진행중일 때 알림
      $ kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-running.slack":"$SLACK_CHANNEL_NAME"}}}' --type merge
    • Sync 상태가 Unknown일 때 알림
      $ kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-status-unknown.slack":"$SLACK_CHANNEL_NAME"}}}' --type merge
    • Health가 Degrade 되었을 때 알림
      $ kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-health-degraded.slack":"$SLACK_CHANNEL_NAME"}}}' --type merge
    • Deploy 되었을 때 알림
      $ kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-deployed.slack":"$SLACK_CHANNEL_NAME"}}}' --type merge

참고

마무리

여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 튜토리얼이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.

혹시라도 튜토리얼에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊

반응형