목차
문제 개요
배포 환경
•
Kubernetes를 활용한 컨테이너 환경 배포
•
Public Subnet: 웹 서버(WS)를 배포 (LoadBalancer 타입으로 외부에 노출)
•
Private Subnet: 웹 애플리케이션 서버(WAS)를 배포 (ClusterIP 타입으로 내부 전용)
•
프론트엔드는 내부에서 *.svc.cluster.local 도메인을 통해 백엔드와 통신하도록 구성
증상
•
외부 웹 브라우저에서 서비스 접속 시, 백엔드 API 호출이 전혀 이뤄지지 않음
•
개발자 도구에서 net::ERR_NAME_NOT_RESOLVED 에러가 발생하여 DNS 해석에 문제가 있음을 확인
원인 분석
테스트
•
웹 서버의 Pod 내에서 같은 도메인으로 API 요청을 보내면 정상 응답이 오지만, 브라우저에서는 해당 도메인에 접근할 수 없음
내부 DNS 도메인 사용 문제
•
클러스터 내부에서는 *.svc.cluster.local 도메인을 사용해 서비스 간 통신이 원활히 이뤄짐
•
하지만 이 도메인은 클러스터 내부 전용으로, 외부(브라우저)에서는 이름 해석이 되지 않음
•
결과적으로 외부에서 접근 시 DNS 해석 오류(ERR_NAME_NOT_RESOLVED)가 발생함
해결 방안
방안 1. Proxy
•
프론트엔드 서버에 Nginx Reverse Proxy를 구성하여, 브라우저 요청을 내부 DNS 도메인으로 중계
•
프록시를 통해 외부와 내부 네트워크를 분리하여 문제를 우회하는 방식
방안 2. 백엔드 서비스 외부 노출
•
백엔드 서비스를 외부에서 접근 가능하도록 LoadBalancer 또는 Ingress를 사용하여 도메인(api.my-domain 등)을 할당
•
Kubernetes 네이티브 방식으로, 라우팅, TLS 종료, 인증 등의 기능을 중앙에서 관리 가능
결정: Kubernetes 환경에서는 관리와 확장성 측면에서 Ingress Controller를 사용하는 방식이 선호되므로, Ingress를 통한 외부 노출 방식으로 결정
해결 과정
1. Ingress 리소스 생성
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cinebox-ingress
namespace: dev
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: api.cine-box.store
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cinebox-service
port:
number: 8080
YAML
복사
•
api.cine-box.store 도메인으로 들어오는 요청을 cinebox-service의 8080 포트로 라우팅
•
Ingress Controller(Nginx)를 통해 외부에서 들어오는 요청을 내부 서비스로 연결
2. Route53 설정
•
Route53에서 api.cine-box.store 도메인에 대한 A 레코드를 생성하여 Ingress Controller와 연동
3. 프론트엔드 요청 수정
•
프론트엔드에서 백엔드 API 호출 시, 내부 DNS(.svc.cluster.local) 대신 외부 도메인(api.cine-box.store)으로 요청을 보내도록 수정
•
이로 인해 브라우저에서 DNS 해석이 올바르게 이루어지고, Ingress를 통해 백엔드와 정상 통신
4. 후속 작업
•
TLS 인증서(crt) 작업과 ALB(Application Load Balancer) 사용 등 추가적인 설정을 통해 전체 트래픽 관리와 보안을 강화
•
프론트엔드 서비스도 동일 Ingress에 추가하여 중앙집중형 라우팅 관리
결론
•
클러스터 내부 전용 DNS 도메인(*.svc.cluster.local)은 외부 브라우저에서 접근할 수 없으므로, 이를 외부에 노출하려면 별도의 도메인과 라우팅 구성이 필요하다.
•
Ingress를 사용하여 여러 서비스에 대한 라우팅, TLS 종료, 인증 등의 기능을 중앙에서 일원화할 수 있다.
•
Ingress를 사용하면 별도의 프록시 서버 구성 없이, Kubernetes 리소스를 통해 해결 가능하다.
궁금증
외부와의 통신을 차단하기 위해 Private Subnet에 WAS를 위치시키는 건데 LoadBalancer로 외부 노출해도 되는 것인가? 추가 설정을 통해 프론트 서비스에서 오는 트래픽만을 허용해야할 것 같은데, 이 생각이 맞다면 어떻게 처리해야 할까?