#고민리스트 #쿠버네티스
- 정리한 날짜 : #2025-06-24
### 상황
쿠버네티스로 마이그레이션 하면서 외부 요청을 내부 리소스로 라우팅 하는 방법을 고민해야 했다. 클라이언트에서는 443 포트로 요청을 전송하기 때문에 443포트에서 서비스로 라우팅 하는 방법이 필요하다.
만약, 쿠버네티스 내부에 `nginx`를 구축하면 443 포트에서 `nginx`로 라우팅하는 외부 게이트웨이를 또 구축해야 한다.
### 문제
HTTP 또는 HTTPS 통신으로 원하는 API로 보내기 위해서는 게이트웨이가 필요하다.
### 해결
#### 단기 해결책 - 포트 포워딩
백그라운드에서 포트 포워딩을 실행해 외부 요청을 라우팅했다.
```
kubectl port-forward a-service-7cbc644fbd-2528b --address=0.0.0.0 3306:3306 &
Forwarding from 0.0.0.0:3306 -> 3306
```
진행하면서 다음과 같은 장단점이 존재했다.
- 장점
- 빠르게 적용 가능하다.
- 단점
- 파드 이름과 연결되기 때문에 파드가 재실행되면 포트 포워딩이 종료된다.
- 백그라운드에서 실행되는 포트 포워딩을 직접 관리해야 한다.
#### 장기 해결책 - 인그레스
인그레스를 활용해 트래픽을 전달할 수 있도록 할 수 있다.
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: est-api-gateway-ingress
namespace: est-k8s-platform
spec:
rules:
- host: {host}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {service-name}
port:
number: {service-port}
```
### 딥다이브 - 인그레스 정리
인그레스는 쿠버네티스 API를 통해 정의한 규칙에 기반해 트래픽을 다른 백엔드에 매핑할 수 있게 도와준다.

클러스터 내 서비스 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리한다.
- load balancing : 부하 분산 동작
- SSL termination : SSL 인증서를 사용해 암호화된 트래픽 복호화 동작
- name-based virtual hosting : 하나의 IP 주소에서 여러 도메인 구분해서 처리하는 동작
ingress를 사용하려면 ingress 컨트롤러가 있어야 한다. ingress-nginx 같은 컨트롤러를 함께 배포해야 한다.
#### Name-based Virtual Hosting
하나의 IP 주소에서 여러 도메인을 구분해서 처리하는 방식이다. 즉, `Host` 헤더 값에 따라 어떤 백엔드 서비스로 보낼지 결정이다.
- 활용 방법 : dev, test 환경이 동일한 플랫폼으로 구성된다면 `Name-based Virtual Hosting` 방식으로 라우팅해볼 수 있어보인다.
```yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: virtual-host-ingress
spec:
rules:
- host: a.example.com # a.example.com 도메인은
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: a-service # a 서비스 라우팅
port:
number: 80
- host: b.example.com # b.example.com 도메인은
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: b-service # b 서비스 라우팅
port:
number: 80
```