🎯 프로메테우스-슬랙 연동 핵심 개념
📑 목차
1. 핵심 개념 요약
한 문장 정리
“쿠버네티스라는 ‘폐쇄된 섬(Internal)‘에 있는 Alertmanager가, 바다 건너 ‘육지(External)‘에 있는 Slack에게 편지를 보내기 위해서는 ‘지도(DNS)‘와 ‘배(Network)‘가 모두 필요하다.”
💡 외부 API 연동의 3대 조건
| 조건 | 역할 | 실패 시 증상 |
|---|---|---|
| DNS 해결 | 외부 도메인을 IP로 변환 | server misbehaving, lookup failed |
| Network 연결 | 실제 HTTP 요청 전송 | connection refused, timeout |
| Pod 상태 | 요청을 보낼 주체가 살아있어야함. | Pending, CrashLoopBackOff |
2. DNS 문제 (가장 빈번)
🚨 문제 상황
# 전형적인 DNS 오류 로그
level=ERROR source=dispatch.go:363 msg="Notify for alerts failed"
err="dial tcp: lookup hooks.slack.com on 10.96.0.10:53: server misbehaving"🔍 원인 분석
- CoreDNS 설정 문제: 상위 DNS 서버(회사 DNS 등)가 응답하지 않음
- DNS 캐시 문제: Pod가 잘못된 DNS 정보를 기억하고 있음
- 네트워크 정책: DNS 쿼리 자체가 차단됨
✅ 해결 방법
A. CoreDNS 설정을 구글 DNS로 변경
# CoreDNS ConfigMap 수정
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
# ... 기존 설정 ...
forward . 8.8.8.8 1.1.1.1 # 핵심: 신뢰할 수 있는 DNS 서버 지정
# ... 기존 설정 ...
}B. 즉시 적용 명령어
# 1. CoreDNS 설정 강제 업데이트
kubectl apply -f - <<EOF
[위의 YAML 내용]
EOF
# 2. CoreDNS 재시작
kubectl rollout restart deployment coredns -n kube-system
# 3. 문제 Pod도 재시작 (DNS 캐시 초기화)
kubectl delete pod -l app=prometheus-alertmanager -n monitoringC. DNS 테스트 방법
# 클러스터 내부에서 DNS 테스트
kubectl run -it --rm --restart=Never dns-test --image=busybox:1.28 \
-- nslookup hooks.slack.com
# 성공 시: Address: 3.10.15.20 (IP 주소 출력)
# 실패 시: can't resolve 'hooks.slack.com'3. 네트워크 연결성
📋 쿠버네티스 외부 통신 경로
Pod → Service → Node → Internet Gateway → External API
🛡️ 잠재적 차단 지점
- NetworkPolicy: Pod 간 통신 제한
- 노드 방화벽: 특정 포트/도메인 차단
- 클라우드 보안 그룹: AWS/GCP/Azure 레벨 제한
- 회사 프록시: 기업 환경에서 HTTP/HTTPS 프록시 필요
✅ 네트워크 테스트 방법
# 1. 기본 연결 테스트
kubectl run -it --rm --restart=Never net-test --image=curlimages/curl \
-- curl -v https://hooks.slack.com/services/YOUR/WEBHOOK/URL
# 2. Alertmanager Pod에서 직접 테스트
kubectl exec -it prometheus-alertmanager-0 -n monitoring \
-- wget -qO- --timeout=10 https://hooks.slack.com
# 성공 시: HTML 응답 또는 "Bad Request" (정상 - Webhook 형식 아니므로)
# 실패 시: timeout, connection refused4. Pod 상태 및 스토리지
🏥 Pod 건강 상태 체크
A. 기본 상태 확인
kubectl get pods -n monitoring
# 모든 Pod가 Running 상태여야 함B. 문제 Pod 상세 진단
kubectl describe pod [POD_NAME] -n monitoring
# Events 섹션에서 오류 원인 확인:
# - FailedMount: 스토리지 문제
# - FailedScheduling: 자원 부족
# - ImagePullBackOff: 이미지 다운로드 실패C. 스토리지(PVC) 문제 해결
# 1. PVC 상태 확인
kubectl get pvc -n monitoring
# 2. 문제 PVC 삭제 및 재생성
kubectl delete pvc storage-prometheus-alertmanager-0 -n monitoring
kubectl delete pod prometheus-alertmanager-0 -n monitoring
# Pod가 재시작되면서 새 PVC 자동 생성5. 실무 체크리스트
🔧 외부 API 연동 시 순서별 점검
1단계: 기본 상태 점검
- 모든 관련 Pod가 Running 상태인가?
- PVC가 정상적으로 Bound 되어 있는가?
- Service와 Endpoint가 제대로 연결되어 있는가?
2단계: DNS 해결 테스트
- 클러스터 내부에서 외부 도메인 nslookup 성공하는가?
- CoreDNS 로그에 에러가 있는가?
- 필요시 DNS를 8.8.8.8로 변경했는가?
3단계: 네트워크 연결 테스트
- curl/wget으로 외부 API 직접 호출 되는가?
- 방화벽이나 보안 그룹에서 차단하지 않는가?
- 회사 프록시 설정이 필요한가?
4단계: 애플리케이션 로그 분석
- 애플리케이션 로그에서 구체적인 에러 메시지 확인
- 재시도 횟수와 타임아웃 설정 적절한가?
- API 키나 인증 정보가 올바른가?
🚀 빠른 해결 템플릿
DNS 문제일 때
# 원라이너로 CoreDNS를 구글 DNS로 변경
kubectl get cm coredns -n kube-system -o yaml | \
sed 's|forward . /etc/resolv.conf|forward . 8.8.8.8 1.1.1.1|g' | \
kubectl apply -f -
kubectl rollout restart deployment coredns -n kube-system스토리지 문제일 때
# 해당 워크로드의 PVC 재생성
kubectl delete pvc $(kubectl get pvc -n monitoring -o name)
kubectl delete pod -l app=prometheus-alertmanager -n monitoring설정 문제일 때
# Helm으로 전체 재배포 (가장 확실한 방법)
helm uninstall prometheus -n monitoring
helm install prometheus prometheus-community/prometheus -n monitoring -f values.yaml📝 경험에서 얻은 교훈
✨ 핵심 인사이트
DNS가 80% 이상의 원인
외부 연동이 안 될 때는 DNS 문제부터 의심하자. 특히 VM 환경이나 온프레미스에서는 DNS 설정이 자주 꼬인다.
Pod 재시작의 힘
설정을 바꾸고도 안 되면 관련 Pod를 재시작하자. DNS 캐시나 연결 풀 문제를 단번에 해결할 수 있다.
테스트 순서가 중요
- Manual curl/wget 테스트 → 2. DNS 해결 → 3. 애플리케이션 설정 순서로 접근하면 시간을 절약할 수 있다.
💪 실무 적용 포인트
A. 모니터링 환경에서
- Grafana, Prometheus, Alertmanager 등은 외부 API를 많이 사용
- 각 컴포넌트별로 별도의 DNS/Network 설정이 필요할 수 있음
- 보안을 위해 NetworkPolicy 적용 시 외부 통신 예외 규칙 필요
B. 마이크로서비스 환경에서
- Service Mesh(Istio 등) 사용 시 사이드카 프록시 설정 확인
- 서비스 간 mTLS 활성화되어 있다면 외부 API 예외 처리
- API Gateway를 통한 외부 연동이 더 안전할 수 있음
C. 클라우드 환경에서
- AWS: VPC Endpoint, Security Group, NACL 확인
- GCP: Private Google Access, 방화벽 규칙 확인
- Azure: Service Endpoint, NSG 규칙 확인
�