Nginx Ingress Controller란?
Nginx를 기반으로 하여 Kubernetes Ingress 리소스를 처리하는 컨트롤러로, HTTP/HTTPS 트래픽을 라우팅하고 로드 밸런싱을 제공.
- Ingress Controller: Kubernetes 클러스터에서 외부 트래픽을 서비스로 라우팅하는 역할을 하는 컴포넌트.
- Nginx Ingress Controller: Nginx를 기반으로 하여 Kubernetes Ingress 리소스를 처리하는 컨트롤러로, HTTP/HTTPS 트래픽을 라우팅하고 로드 밸런싱을 제공.
- 구성 방법: Helm chart 또는 kubectl을 사용하여 Nginx Ingress Controller를 설치할 수 있으며, ConfigMap을 통해 Nginx 설정을 사용자 정의 가능.
- 기본 동작: Ingress 리소스를 감지하고 적절한 Nginx 설정을 생성하여 트래픽을 해당 서비스로 라우팅.
쉽게 말하자면, 즉 외부 사용자가 쿠버네티스 클러스터내의 서비스로 접근을 하려고 할때, 접근을 하도록 도와주는 일종의 게이트 웨이라고 보면 된다.
또한 Ingress 요청을 처리하기 위한 Service는 일반적으로 Cloud Platform에서 제공되는 Load Balancer 타입의 Service를 사용한다.
즉 이런식으로 원래는 쿠버네티스의 파드 안에 ClusterIP로 저장이 되어 있었다면 이제 이거를 외부 주소로 노출을 시켜줘야한다.
현재 카카오 클라우드 쿠버네티스 엔진을 사용하고 있었기에 Ingress 요청을 처리하기 위해 KAKAO CLOUD 의 Load Balancer를 사용하기로했다. 로드밸런서를 통해 외부 포트로 노출 시켜준 결과는 다음과 같다.
먼저 프론트 서비스의 ingress.yaml 파일이다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-web
namespace: clovider
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "http://localhost:3000,http://210.109.55.28:3000,http://210.109.52.95:80, http://kidsincompany.shop,http://api.kidsincompany.shop"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PATCH, DELETE, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/cors-allow-headers: "Authorization, Content-Type"
spec:
ingressClassName: nginx
rules:
- host: kidsincompany.shop
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: clovider-fe-service
port:
number: 80
다음으로는 백엔드 서비스의 ingress.yaml 파일을 보자.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
namespace: clovider
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "http://localhost:3000,http://210.109.55.28:3000,http://210.109.52.95,http://kidsincompany.shop,http://api.kidsincompany.shop"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PATCH, DELETE, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/cors-allow-headers: "Authorization, Content-Type"
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: clovider-be-service
port:
number: 80
두가지 ingress에서 큰 차이점은 프론트 서비스에서는 host를 지정해주었다면 백엔드에서는 그렇지 않다는 것이다.
이는 두 서비스는 같은 로드밸런서를 사용하지만 적절하게 로드밸런싱을 하기 위해 지정한 것인데,
가령 예를 들어 현재 쿠버네티스의 nginx ingress가 LoadBalancer 타입으로 설정되어 있으면
백엔드는 로드밸런서의 Public IP를 할당받아 사용하게 되는 것이고 프론트엔드는 로드밸런서에 도메인(kidsincompany.shop)을 붙여서 사용하게 되는 것이다.
이런식으로 경로 라우팅만 잘해준다면 아래에서 보이는것과 같이 다양한 서비스에서도 로드밸런싱을 진행해줄 수 있다.
어렵다고 느껴졌던 로드밸런싱이었지만 막상 하나만 배포해보니 나머지도 어렵지 않게 금방 할 수 있었다!
'DevOps&Cloud' 카테고리의 다른 글
JWT: JWT와 Session (2) | 2024.12.26 |
---|---|
GitActions: 환경변수 저장하기 (0) | 2024.12.22 |
Git ACTIONS: Gradle Plugin JIB 빌드 VS Docker Build (0) | 2024.08.12 |
GIT ACTIONS: Self Hosted Runner와 k8s ARC (0) | 2024.08.11 |
Kubernetes에 ArgoCD 배포하기 (0) | 2024.08.11 |