Kubernetes

Kubernets Ingress & Load Balancing

id1112 2025. 4. 16. 13:46

Ingress


Ingress 는 HTTP / HTTPS 요청을 Cluster 내부 서비스로 Routing 하는 Resource 이다. 외부 트래픽이 어떤 내부 서비스로 갈지 정의하는 규칙이다. 

예를 들어 host 기준 Routing, URL path 기준 Routing, SSL(TLS) 종료 설정 등

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

위 설정은 host: example.com 으로 요청이 들어오면 / 이하 모든 경로를 my-service: 80으로 전달하라는 규칙이다.

 

Ingress Controller

Ingress resource 를 해석하고 실제 Traffic Routing 을 수행하는 Controller이다. 실제 Routing 동작을 수행하는 L7 LoadBalancer 이다.

 Ingress Controller는 Kubernetes cluster에서 Ingress resource를 감시하고 규칙이 생성되거나 변경될 때 마다 Backend (Load Balancer / Proxy Setting) 를 자동으로 업데이트 한다.

예: NGINX Ingress Controller, HAProxy Ingress Controller, Traefik, Envoy, Contour 등

이처럼 Kubernetes 와 연동된 Web Server / Proxy / Load Balancer 라고 볼 수 있다.

 

-  역할

도메인 기반 라우팅 (host)

경로 기반 라우팅 (path)

TLS 종료 (HTTPS 지원)

리버스 프록시  (내부 서비스로 트래픽 전달)

 

Cluster 외부에서 내부로의 Traffic Flow

1) Cloud 환경

Service 에서 type: LoadBalancer 로 설정하면 클라우드 벤더가 제공하는 L4 Load Balancer 가 자동으로 생성된다. 외부 클라이언트는 클라우드가 부여한 LB IP / Domain 을 통해 해당 Service 에 접속할 수 있다.

L4 Level에서 트래픽을 전달하기 때문에 흔히 

L4 LB -> Ingress Controller  구조

가 많이 사용된다. Service(type: LoadBalancer)를 Ingress Controller 앞단에 둬서 외부의 트래픽을 받아드린다. 

이때 Kubernetes Ingress Controller 가 들어온 HTTP / HTTPS 요청을 Ingress Rule 에 따라 어떤 Service 에 보낼 지 결정하기 때문에 사실상 L4 LB는 트래픽 입구 역할만 한다.

 

그렇다면 Ingress 없이 Service 에서 LB를 만들 수는 없는 건가?

아니다, Ingress 를 사용하지 않아도 외부 L4 LB를 사용할 수 있다. 하지만 이 경우는 Service 는 외부로 노출되는 Endpoint가 되며 사용자는 LB IP/Domain으로 직접 접근하게 된다. 이 경우처럼 여러 Service를 각각 외부에 노출하려면 Service 마다 LB를 만들어야하기 때문에 비용 문제 및 관리가 어려워다.

 

2) 온프레미스 환경

클라우드 환경처럼 자동으로 LB를 생성할 수 없기 때문에

Ingress Controller Pod를 직접 배포해야한다. 그리고 Ingress Controler 앞단에 NodePort 또는 MetalLB 와 같은 외부 IP를 할당한다  이렇게하면 외부의 요청이 들어올시에

외부 요청 -> NodePort /MetaLB -> Ingress Controller -> 내부 라우팅 으로 트래픽이 전달된다.

 

TLS (HTTPS)

Ingress는 HTTPS를 지원한다. TLS Session을 추가하면 사용할 수 있다.

tls:
- hosts:
  - app.example.com
  secretName: tls-secret

tls-secret 에는 tls 인증서가 들어있어야한다.

tls 인증서는

kubectl create secret tls  # 로 생성이 가능하다.

Ingress Controller 가 해당 인증서를 사용해 HTTPS 통신을 처리한다.