Argo CD 결과를 slack 알람으로 전송하기

1. 배경

프로젝트를 진행하는 도중 Argo CD의 결과를 모니터링할 수 있도록 SNS로 보낼 수 있도록 만들어야 했는데, 직장에서 사용하는 해당 프로젝트 특성상 Slack으로 알람을 주기로 했다.

2. 도입 순서

1. Argo CD 파드 만들기

argocd의 공식 문서를 참고 하여 만들게 된다면 자동으로 리소스들이 생성되는 것을 볼 수 있다.

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

그리고 외부에서 접속할 수 있도록 설정을 해주어야 하는데, 이 경우 AWS 로드 밸런서를 사용하기로 했다.

 

argocd를 설치하면 기본적으로 argocd-server 서비스는 ClusterIP로 설정되어 있다. 이를 LoadBalancer로 변경하면 자동으로 AWS에서 로드밸런서가 생성되며 웹에서 볼 수 있게 된다.

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

2. Argo CD 알림 설정하기

argocd에는 공식 확장 기능으로 컨트롤러를 사용할 수 있도록 argocd-notifications라는 플러그인을 제공하고 있다.
자세한 내용은 공식 문서를 참고 하세요.

 

순서

  1. slack api에서 토큰 생성하기
  2. argocd-notifications 컨트롤러 생성하기
  3. 토큰 값 저장할 secret 생성
  4. 슬랙으로 보낼 데이터(Config Map) 생성
  5. 슬랙으로 보낼 곳 정해주기

  1. argocd-notification 컨트롤러 생성하기

argocd-notifications 공식 문서의 도움을 받아 생성하면 된다

kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/manifests/install.yaml -n argocd
kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/catalog/install.yaml -n argocd

 

 

  1. secret 생성하기

argocd-notifications-secret.yaml

apiVersion: v1 
kind: Secret 
metadata: 
  name: argocd-notifications-secret 
stringData:
  slack-token: #[SLACK_TOCKEN]

 

  1. Config Map 생성하기

이미 ConfigMap이 존재하지만, 우리가 필요한 알람 시스템에 맞게 변경이 필요하다.

argocd-notifications-cm.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  service.slack: |
    token: $slack-token
    username: Argo CD # optional
    icon: https://argocd-notifications.readthedocs.io/en/stable/assets/logo.png # optional
  subscriptions: |
    - recipients:
      - slack:alert
      triggers:
      - on-sync-status-unknown
      - on-sync-failed
      - on-health-degraded
      - on-deployed
      - on-sync-succeeded
# CM 적용하기
kubectl -n argocd patch cm argocd-notifications-cm --patch-file argocd-notifications-cm.yaml 
configmap/argocd-notifications-cm patched

 

  1. Slack으로 보낼 장소 지정하기

현재 알림 컨트롤러가 갖고 있는 값은 토큰 값 뿐이다. 그렇기 때문에 슬랙에서 사용할 채널 등의 정보를 주입해주고, 어떤 애플리케이션을 구독할 것인지 정해준다.

export APP_NAME=test-app
export NAMESPACE=argocd
export SLACK_CHANNEL_NAME=your-channel
# 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

 

이렇게 완료가 되면 sync 버튼을 눌렀을 때 결과가 슬랙으로 나타나는 것을 확인할 수 있다.

 


주의사항

  1. 알람 받을 '채널'에 봇이 추가되어 있어야 한다.
  2. 명령어로 채널을 등록할 때 슬랙 채널을 #---으로 작성하는 것이 아닌 ---으로 작성해야 한다.

현재는 기본 템플릿을 사용하여 영어로 알람이 오지만, 다음에는 한글화 해서 읽기 쉽도록 작업도 해봐야겠다.


참고