Nginx ingress controller 활용

Hoonkii·2023년 8월 8일
0

개요

EKS 환경으로 마이그레이션 하면서 클러스터에 여러 애플리케이션을 배포하다보니 로드 밸런서 개수가 늘어나는 문제가 생겼다. 가령 같은 서브도메인에서도 path에 따라서 여러 서비스를 나누어 배포하고 싶은 경우도 있었고, 다른 서브도메인이라도 하나의 로드밸런서만 사용하여 로드밸런서 비용을 낮추고 싶었다.

쿠버네티스는 이러한 요구사항을 만족하는 ingress 를 제공한다. Ingress는 외부에서 서비스로 접속이 가능한 URL, 로드 밸런스 트래픽, SSL / TLS 종료 그리고 이름-기반의 가상 호스팅을 제공하도록 구성할 수 있다.

Ingress 리소스를 동작시키려면 반드시 클러스터 내 ingress controller 를 설치해야한다.

오늘은 EKS 환경에서 ingress controller 중 하나인 nginx ingress controller 를 통해 ingress 리소스를 프로비저닝 한 과정에 대해 다룰 것이다.

Ingress

대략 위와 같은 구조이다. ingress 리소스를 쿠버네티스 클러스터 내 정의하면, ingress controller 가 해당 ingress 리소스 요청을 받아 ingress managed 로드 밸런서에 해당 설정을 업데이트한다.

Ingress Controller

kube-controller-manager 바이너리의 일부로 실행되는 컨트롤러의 다른 타입과 달리 인그레스 컨트롤러는 클러스터와 함께 자동으로 실행되지 않는다. 따라서 별도의 ingress controller를 프로비저닝 해야 한다.

프로젝트로서 쿠버네티스는 AWSGCE와 nginx 인그레스 컨트롤러를 지원하고 유지한다.

EKS 환경에서 Nginx Ingress Controller 설치

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

위 명령어를 실행하면, ingress-nginx-controller pod이 생성된다.

이 nginx controller pod은 트래픽을 받아서 설정한 ingress대로 트래픽을 알맞은 서비스로 라우팅해준다.

그리고 ingress-nginx-controller 로드밸런서 서비스가 생성된다. 이 로드 밸런서는 클러스터 앞단에서 외부의 트래픽을 맨 처음으로 받는 역할을 수행한다. (이 때 AWS에서는 로드밸런서로 Network Loadbalancer를 프로비저닝 한다.)

클러스터에 ingress-controller가 설치되었기 때문에 ingress 리소스를 배포하면 로드밸런서에 적용될 수 있다. 아래와 같이 샘플 ingress를 작성하였다. 이 때 ingressClassName은 nginx 로 지정하였다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: lemon-prod
  namespace: lemon-prod
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 30m
    nginx.ingress.kubernetes.io/rewrite-target: /$2  
spec:
  ingressClassName: nginx
  rules:
    - host: lemon.test.com
      http:
        paths:
          - path: /web(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: web-server
                port:
                  number: 80
          - path: /api(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: api-server
                port:
                  number: 80

ingress 배포가 완료되면 HOSTS, ADDRESS 가 성공적으로 할당된 것을 볼 수 있다.

실제 배포된 환경이라 HOSTS 랑 ADDRESS는 가렸지만, HOSTS 는 위에 설정한 lemon.test.com 으로 나올 것이다. ADDRESS는 Load Balancer에 할당된 주소가 동일하게 나올 것이다.

내용을 정리하면 위 그림과 같다.

결론

Kubernetes 환경에서 ingress 를 활용하면 단일 Load balancer 로 여러 애플리케이션들을 서로 다른 host 및 path 로 지정하여 배포할 수 있어 Load balancer 비용을 절감할 수 있다는 장점이 있다.

꼭 Nginx Ingress Controller 가 아니어도 Ingress Controller 종류는 많으니, Ingress 기능이 필요하다면 여러 provider 가 제공하는 Ingress controller 를 찾고 도입해보자.

profile
개발 공부 내용 정리

0개의 댓글