Kubernets Ingress & Load Balancing
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 통신을 처리한다.