안녕하세요, 이번 포스팅에서는 ArgoCD의 애플리케이션의 변동사항을 슬랙을 통해서 수신하는 방법에 대해서 알아보겠습니다.
1. 슬랙의 api 설정 (api.slack.com)
- application 설정
Your Apps에서 애플리케이션을 만들어줍니다.
application의 이름을 설정하고, 설치할 슬랙의 workspace을 선택한 다음, Create App을 누릅니다.
App Home에서 Scopes를 설정합니다.
다음의 권한을 봇 토큰 범위에 넣습니다.
chat:write, chat:write.customize를 넣어줍니다.
(TMI: 공식 문서에 따르면 chat:write:bot, chat:write.customize의 설정이 필요하지만,
해당 내용 현재는 User와 Bot의 토큰 범위가 구분되고 있습니다.)
생성 후 OAuth 토큰을 받아둡니다.
2. 쿠버네티스 클러스터 변수 설정 (secret / configmap / application)
먼저, argocd namespace에 있는 argocd-notifications-secret을 위와 같이 설정합니다.
stringData에 slack-token을 설정해야 합니다. Base64로 인코드 한 내용을 넣어도 좋습니다.
echo -n "TOKEN_NUMBER" | base64
그런 다음 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
pod로 접근하여 app/argocd-notification를 실행하고, guestbook에 app-sync-failed를 발생시켜 <슬랙 채널명>로 테스트 결과를 전송해 봅니다.
kubectl exec -it argocd-notifications-controller-1234a567b8-cd90e -- /app/argocd-notifications template notify app-sync-failed guestbook --recipient slack:<슬랙 채널명>
실행 화면은 다음과 같습니다.
감사합니다.
'DevOps > Kubernetes' 카테고리의 다른 글
[kubernetes] EKS 노드 트러블 슈팅 (0) | 2024.11.21 |
---|---|
[Kubernetes] 트러블슈팅: ImagePullBackOff 상태의 Pod 해결하기! 🔍 (7) | 2024.11.20 |
[Kubernetes] ContainerCreating 상태 깊이 있게 이해하기 (0) | 2024.11.19 |