#고민리스트 #쿠버네티스 - 정리한 날짜 : #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를 통해 정의한 규칙에 기반해 트래픽을 다른 백엔드에 매핑할 수 있게 도와준다. ![인그레스 다이어그램](https://kubernetes.io/docs/images/ingress.svg) 클러스터 내 서비스 외부 접근을 관리하는 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 ```