728x90
 
 

안녕하세요, 이번 포스팅에서는 ArgoCD의 애플리케이션의 변동사항을 슬랙을 통해서 수신하는 방법에 대해서 알아보겠습니다.

1. 슬랙의 api 설정 (api.slack.com)

  • application 설정

그림 1) 앱 만들기

 

Your Apps에서 애플리케이션을 만들어줍니다.

application의 이름을 설정하고, 설치할 슬랙의 workspace을 선택한 다음, Create App을 누릅니다.

그림 2) 앱 이름 설정 및 워크 스페이스 선택

App Home에서 Scopes를 설정합니다.

그림 3) App Home에서 Bot Token에 대한 Scope 설정

다음의 권한을 봇 토큰 범위에 넣습니다.

chat:write, chat:write.customize를 넣어줍니다.

(TMI: 공식 문서에 따르면 chat:write:bot, chat:write.customize의 설정이 필요하지만,
해당 내용 현재는 User와 Bot의 토큰 범위가 구분되고 있습니다.)

그림 4) 토큰 범위 설정

 

그림 5) 워크스페이스에 애플리케이션 설치

 

그림 6) workspace 권한 허용
그림 7) 워크스페이스의 OAuth 토큰 생성

생성 후 OAuth 토큰을 받아둡니다.

2. 쿠버네티스 클러스터 변수 설정 (secret / configmap / application)

그림 8) argocd-notifications-secret 설정

 

먼저, argocd namespace에 있는 argocd-notifications-secret을 위와 같이 설정합니다.
stringData에 slack-token을 설정해야 합니다. Base64로 인코드 한 내용을 넣어도 좋습니다.

echo -n "TOKEN_NUMBER" | base64

 

그림 9) argocd-notifications-secret의 설정 값

 

그런 다음 argocd-notifications-cm을 수정합니다.
해당 코드는 Slack 서비스 설정 / 알림 템플릿 / 트리거 설정으로 나뉩니다.

apiVersion: v1
data:
  service.slack: |
    token: $slack-token
  template.app-deployed: |
    subject: New version of an application {{.app.metadata.name}} is up and running.
    message: |
      slack:
        attachments: |
          [{
            "title": "{{ .app.metadata.name}}",
            "fields": [
              {
                "title": "Sync Status",
                "value": "{{.app.status.sync.status}}",
                "short": true
              },
              {
                "title": "Repository",
                "value": "{{.app.spec.source.repoURL}}",
                "short": true
              },
              {
                "title": "Revision",
                "value": "{{.app.status.sync.revision}}",
                "short": true
              }
              {{range $index, $c := .app.status.conditions}}
              {{if not $index}},{{end}}
              {{if $index}},{{end}}
              {
                "title": "{{$c.type}}",
                "value": "{{$c.message}}",
                "short": true
              }
              {{end}}
            ]
          }]
  trigger.on-sync-succeeded: |
    - description: Application syncing has succeeded
      send:
        - app-sync-succeeded
        - app-deployed
      when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'

먼저, 슬랙 서비스 설정은 다음과 같습니다.

service.slack: |
  token: $slack-token

다음으로 알림 템플릿 설정은 다음과 같습니다.

template.app-deployed: |
  email:
    subject: New version of an application {{.app.metadata.name}} is up and running.
  slack:
    attachments: |
      [{
        "title": "{{ .app.metadata.name}}",
        "fields": [
        {
          "title": "Sync Status",
          "value": "{{.app.status.sync.status}}",
          "short": true
        },
        {
          "title": "Repository",
          "value": "{{.app.spec.source.repoURL}}",
          "short": true
        },
        {
          "title": "Revision",
          "value": "{{.app.status.sync.revision}}",
          "short": true
        }
        ]
      }]

그 다음 트리거 설정은 다음과 같습니다.

다음과 같이 설정하면, app-sync가 성공적이고 애플리케이션이 배포 되었을때 메시지를 보냅니다.

trigger.on-sync-succeeded: |
  - description: Application syncing has succeeded
    send:
    - app-sync-succeeded
    - app-deployed
    when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'

 

마지막으로 애플리케이션 설정입니다.

kubectl patch app analytics -n argocd -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-succeeded.slack":"<슬랙 채널명>"}}}' --type merge

 

애플리케이션마다 패치를 안하고 노티를 받을 수 있는 방법이 있을까 찾아 봤지만 별다른 방법이 따로 없었습니다.

트리거를 설정하여 애플리케이션에서의 변화를 체크하도록 설정합니다.

notifications.argoproj.io/subscribe.on-deployed.slack: <슬랙 채널명>
notifications.argoproj.io/subscribe.on-health-degraded.slack: <슬랙 채널명>
notifications.argoproj.io/subscribe.on-promote-full.slack: <슬랙 채널명>
notifications.argoproj.io/subscribe.on-sync-failed.slack: <슬랙 채널명>
notifications.argoproj.io/subscribe.on-sync-running.slack: <슬랙 채널명>
notifications.argoproj.io/subscribe.on-sync-status-unknown.slack: <슬랙 채널명>
notifications.argoproj.io/subscribe.on-sync-succeeded.slack: <슬랙 채널명>

 

또한 이때, 채널을 여러개 설정이 가능하며 조건에 따라서 별도의 슬랙 채널로 분기처리 역시 가능합니다.

 

수동으로 namespace argocd에 있는 모든 애플리케이션마다 수동으로 설정할 수 있지만, 시간을 절약하기 위해서 다음과 같이 쉘 스크립트를 사용하여 전체 argocd 애플리케이션에 한번에 적용해봅시다.

#!/bin/bash

# 모든 네임스페이스에서 Argo CD 애플리케이션 검색
APPS=$(kubectl get applications --all-namespaces -o jsonpath='{range .items[*]}{.metadata.namespace},{.metadata.name}{"\n"}{end}')

# 각 앱에 대해 패치 적용
while IFS=',' read -r NAMESPACE APP_NAME; do
    echo "Patching app: $APP_NAME in namespace: $NAMESPACE"

    kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-succeeded.slack":"<슬랙 채널명>"}}}' --type merge
    kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-failed.slack":"<슬랙 채널명>"}}}' --type merge
    kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-running.slack":"<슬랙 채널명>"}}}' --type merge
    kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-status-unknown.slack":"<슬랙 채널명>"}}}' --type merge
    kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-health-degraded.slack":"<슬랙 채널명>"}}}' --type merge
    kubectl patch app $APP_NAME -n $NAMESPACE -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-deployed.slack":"<슬랙 채널명>"}}}' --type merge

    echo "Finished patching $APP_NAME"
    echo "-------------------------"
done <<< "$APPS"

echo "All applications have been patched."
~

 

3. 수신 가능 이벤트 트리거 종류

수신 가능한 이벤트 트리거 종류는 다음과 같습니다.

앱 생성 / 제거 / 배포 / 상태 이상 / 동기화 실패 / 동기화 중 / 동기화 상태 알 수 없음 / 동기화 성공

링크

Name Description Template
on-created Application is created. app-created
on-deleted Application is deleted. app-deleted
on-deployed Application is synced and healthy. Triggered once per commit. app-deployed
on-health-degraded Application has degraded. app-health-degraded
on-sync-failed Application syncing has failed. app-sync-failed
on-sync-running Application is being synced. app-sync-running
on-sync-status-unknown Application status is 'Unknown'. app-sync-status-unknown
on-sync-succeeded Application syncing has succeeded. app-sync-succeeded

4. 테스트

이제 적용된 내용을 확인해 보겠습니다.

먼저, argocd 네임스페이스에서 notifications-controller 파드를 찾아봅니다.

kubectl get pods -n argocd

 

그림 10) argocd pods 확인

 

pod로 접근하여 app/argocd-notification를 실행하고, guestbookapp-sync-failed를 발생시켜 <슬랙 채널명>로 테스트 결과를 전송해 봅니다.

kubectl exec -it argocd-notifications-controller-1234a567b8-cd90e -- /app/argocd-notifications template notify app-sync-failed guestbook --recipient slack:<슬랙 채널명>

실행 화면은 다음과 같습니다.

 
 

감사합니다.

728x90
반응형