반응형
쿠버네티스에서 ArgoCD와 여러 앱을 ALB(aws-load-balancer-controller) 뒤에 붙이고, 그 앞단에 CloudFront를 둔 구조를 쓰다 보면 HTTP→HTTPS 리다이렉션 충돌 문제가 자주 발생합니다. 이번 글에서는 실제 경험한 케이스와 함께, 왜 문제가 생기는지, 그리고 어떻게 정리하는 것이 좋은지 정리합니다.
문제 상황
- ArgoCD, Grafana, Invitation 앱 등 여러 서비스가 같은 ALB 그룹(shared-alb) 을 공유.
- Invitation 앱의 Ingress에 리다이렉트 액션 (alb.ingress.kubernetes.io/actions.redirect-to-https) 이 설정되어 있었음.
- 이 액션이 host 제한 없이 / catch-all 로 걸려 있어, 같은 ALB를 쓰는 ArgoCD까지 영향을 받음.
결과적으로 ArgoCD UI 접속 시 브라우저에서같은 에러 발생.
Unable to load data: Request has been terminated
재밌는 점은, Grafana 같은 다른 앱은 정상 접속이 가능했다는 것.
→ 왜 유독 ArgoCD만?
왜 ArgoCD만 문제가 됐을까?
- ALB DNS로 접근
- ArgoCD는 http://<ALB-DNS> 로 접속하고 있었음.
- invitation Ingress가 host 제한 없이 리다이렉트 룰을 걸어둔 상태라, ALB DNS로 들어오는 트래픽은 그대로 redirect 매칭.
- 포트 착각
- ArgoCD Ingress는 listen-ports: [{"HTTP":8080}] 이었지만, 브라우저가 :8080을 명시하지 않으면 기본적으로 80/443 리스너를 탐.
- 그 리스너에 invitation의 redirect 룰이 있었음.
- ArgoCD의 특성
- /api, /events, /stream 같은 XHR/SSE 통신을 많이 사용.
- 한 번이라도 301/302 redirect가 섞이면 브라우저에서 바로 실패.
- 반대로 Grafana는 단순 GET 요청 위주라 체감 영향이 적었음.
ALB 레벨 리다이렉션의 문제점
ALB에서 HTTP→HTTPS 리다이렉션을 걸면 다음과 같은 문제가 있습니다.
- 같은 ALB 그룹(group.name)을 공유하는 모든 서비스가 영향을 받음.
- 특정 호스트/경로에만 걸어야 하는데, host 없는 catch-all / 규칙으로 걸리면 사실상 전역 redirect.
- 규칙 우선순위 충돌 때문에 원치 않는 서비스까지 영향을 받음.
해결 방법
1. Ingress에서 리다이렉션 제거
- alb.ingress.kubernetes.io/ssl-redirect 주석 제거
- alb.ingress.kubernetes.io/actions.redirect-to-https 주석 제거
- 액션 backend (name: redirect-to-https, port.name: use-annotation) 경로 삭제
→ Ingress는 순수 라우팅만 담당.
2. CloudFront에서만 HTTPS 강제
- CloudFront Behavior의 Viewer protocol policy 를
→ Redirect HTTP to HTTPS 로 설정 - CloudFront ACM 인증서(us-east-1) 연결
- HSTS 헤더도 Response Headers Policy로 추가 가능
이렇게 하면 ALB/Ingress 쪽 리다이렉션은 필요 없습니다. CloudFront가 전부 책임지기 때문입니다.
3. (선택) ArgoCD에 전용 호스트 부여
- argocd.example.com 같이 명시적인 host를 Ingress에 지정
- invitation 등 다른 서비스도 host를 반드시 명시
- ALB DNS로 직접 접속하지 말고, CloudFront + 전용 도메인으로만 접근
4. (대안) ALB 분리
- 리다이렉트가 꼭 필요한 서비스는 group.name 을 분리해서 별도 ALB 사용
- 비용은 늘지만 서비스 간섭은 0
점검 방법 (Windows PowerShell)
Ingress 전수 검사:
리눅스용
# 같은 ALB로 병합되는지 확인
kubectl get ing -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.metadata.annotations.alb\.ingress\.kubernetes\.io/group\.name}{"\n"}{end}' | sort
# 전역 ssl-redirect 쓰는 Ingress 찾기
kubectl get ing -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.metadata.annotations.alb\.ingress\.kubernetes\.io/ssl-redirect}{"\n"}{end}' | grep -v '^\s*$'
# 액션 리다이렉트 쓰는 Ingress 찾기
kubectl get ing -A -o json | jq -r '
.items[] as $i
| ($i.metadata.annotations // {}) | to_entries[]
| select(.key|startswith("alb.ingress.kubernetes.io/actions."))
| "\($i.metadata.namespace)\t\($i.metadata.name)\t\(.key)"'
윈도우용
# ALB 그룹 이름 확인
kubectl get ing -A -o json | ConvertFrom-Json |
Select-Object -ExpandProperty items |
ForEach-Object {
$ns=$_.metadata.namespace; $name=$_.metadata.name
$group=$_.metadata.annotations."alb.ingress.kubernetes.io/group.name"
if ($group) { "$ns`t$name`t$group" }
}
# ssl-redirect 주석 확인
kubectl get ing -A -o json | ConvertFrom-Json |
Select-Object -ExpandProperty items |
ForEach-Object {
$ns=$_.metadata.namespace; $name=$_.metadata.name
$redirect=$_.metadata.annotations."alb.ingress.kubernetes.io/ssl-redirect"
if ($redirect) { "$ns`t$name`t$redirect" }
}
# 액션 redirect 주석 확인
kubectl get ing -A -o json | ConvertFrom-Json |
Select-Object -ExpandProperty items |
ForEach-Object {
$ns=$_.metadata.namespace; $name=$_.metadata.name
$_.metadata.annotations.PSObject.Properties.Name |
Where-Object { $_ -like "alb.ingress.kubernetes.io/actions.*" } |
ForEach-Object { "$ns`t$name`t$_" }
}
최종 아키텍처 권장안
- CloudFront
- Viewer protocol policy = Redirect HTTP to HTTPS
- ACM(us-east-1) 인증서 연결
- WAF, Caching, HSTS 헤더 관리
- ALB/Ingress
- 순수 라우팅만 (redirect 없음)
- host와 path를 명확히 지정
- group.name 공유 시에도 redirect 간섭 없음
- ArgoCD
- --insecure 로 HTTP 모드 + ALB HTTPS 종료,
또는 end-to-end TLS(backend-protocol=HTTPS)로 일관되게 - 전용 host 지정 후 CloudFront로만 접근
- --insecure 로 HTTP 모드 + ALB HTTPS 종료,
결론
- HTTP→HTTPS 리다이렉션은 CloudFront에서만
- Ingress/ALB는 리다이렉션을 제거하고 순수 라우팅만 담당
- 서비스마다 host를 명시해 충돌 방지
- (필요시) ALB 그룹 분리로 간섭 완전 제거
이렇게 구성하면 ArgoCD 같은 민감한 앱도 안정적으로 동작하고, 리다이렉션 정책도 CloudFront에서 일원화할 수 있습니다.
반응형
'DevOps' 카테고리의 다른 글
| Argo CD에서 “읽기 전용(READ-ONLY)” 사용자 만들기 (Helm/Terraform 예시) (0) | 2025.08.29 |
|---|---|
| 원격 프로그램 추천 Remote Desktop Manager(Devolutions) (2) | 2025.08.29 |
| OpenVPN Split Tunnel 환경에서 특정 서브넷 라우팅 누락 문제와 EKS 환경 라우팅 고려사항 (0) | 2025.08.15 |
| EKS에서 Amazon DocumentDB 연결 테스트: 왜 telnet은 안되고 mongo는 될까? (1) | 2025.08.12 |
| AWS ALB + Grafana: 헬스체크는 unhealty지만 접속은 되는 이유와 해결법 (0) | 2025.08.08 |
댓글