인그레스
- 8.1 인그레스의 구조와 동작 원리
- 8.2 인그레스로 SSL/TLS 설정하기
- 8.3 여러 인그레스 컨트롤러 사용
서비스마다 로드 밸런서를 하나씩 만들면 비용이 폭발해. 인그레스는 하나의 진입점으로 여러 서비스를 라우팅하는 L7 레벨의 HTTP 라우터야.
인그레스를 이해하려면 두 가지를 구분해야 해. 인그레스 오브젝트는 "이런 규칙으로 트래픽을 라우팅해줘"라고 선언한 YAML이야. 규칙만 정의하는 거지, 이것 자체가 뭔가를 하지는 않거든. 실제로 인그레스 규칙을 읽어서 트래픽을 라우팅하는 구현체가 인그레스 컨트롤러야. Nginx Ingress Controller, Traefik, HAProxy 같은 것들이 있지. 쿠버네티스는 인그레스 컨트롤러를 기본 제공하지 않아. 직접 설치해야 해. 가장 많이 쓰이는 건 Nginx Ingress Controller야:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml
인그레스 오브젝트 예시를 보면:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: api.example.com
http:
paths:
- path: /users
pathType: Prefix
backend:
service:
name: user-service
port:
number: 80
- path: /orders
pathType: Prefix
backend:
service:
name: order-service
port:
number: 80
- host: admin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 80
이 인그레스는 두 가지 라우팅을 해:
api.example.com/users→user-serviceapi.example.com/orders→order-serviceadmin.example.com→admin-service
호스트 기반 라우팅과 경로 기반 라우팅을 조합할 수 있어. 하나의 로드 밸런서(인그레스 컨트롤러)로 여러 서비스를 라우팅하니까 비용도 절약되고, 관리도 깔끔해지지. pathType은 Prefix(접두사 매칭)와 Exact(정확히 일치) 두 가지가 있는데, Prefix가 기본적으로 많이 쓰여. annotations는 인그레스 컨트롤러에 전달하는 추가 설정이야. 컨트롤러마다 지원하는 어노테이션이 다르니까, 사용하는 컨트롤러의 문서를 확인해야 해.
인그레스의 큰 장점 중 하나가 **SSL/TLS 종료(termination)**를 한곳에서 처리할 수 있다는 거야. 각 서비스마다 인증서를 설정하는 대신, 인그레스에서 HTTPS를 받아서 복호화한 뒤 내부 서비스에는 HTTP로 전달하는 거지. 먼저 TLS 인증서를 시크릿으로 생성해:
kubectl create secret tls my-tls-secret \
--cert=tls.crt --key=tls.key
인그레스에 TLS 설정을 추가하면 돼:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
tls:
- hosts:
- api.example.com
secretName: my-tls-secret
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
tls 섹션에 호스트와 인증서 시크릿을 지정하면, 인그레스 컨트롤러가 HTTPS를 처리해줘. HTTP로 들어오는 요청을 HTTPS로 리다이렉트하려면:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
인증서 관리를 자동화하고 싶으면 cert-manager를 사용할 수 있어. cert-manager는 Let's Encrypt 같은 CA에서 인증서를 자동으로 발급받고 갱신해주는 쿠버네티스 애드온이야. 프로덕션에서는 거의 필수지.
하나의 클러스터에 여러 인그레스 컨트롤러를 설치할 수도 있어. 예를 들어 외부 트래픽용 Nginx와 내부 트래픽용 Traefik을 동시에 운영하는 경우지. 이때는 IngressClass를 사용해서 어떤 인그레스가 어떤 컨트롤러에 의해 처리될지 지정해:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx-external
spec:
controller: k8s.io/ingress-nginx
인그레스에서 참조할 때:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: external-ingress
spec:
ingressClassName: nginx-external
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
ingressClassName을 생략하면 기본 IngressClass가 선택돼. 기본 IngressClass는 ingressclass.kubernetes.io/is-default-class: "true" 어노테이션으로 지정하면 돼.
인그레스 컨트롤러를 선택할 때 고려할 점이 있어:
- Nginx Ingress Controller: 가장 널리 쓰이고, 커뮤니티 문서가 풍부해
- Traefik: 동적 설정 변경에 강하고, 미들웨어 체인 구성이 편리해
- AWS ALB Ingress Controller: AWS 환경에서 ALB를 네이티브로 사용하지
- Istio Gateway: 서비스 메시를 이미 사용 중이라면 자연스러운 선택이야
정리
8장 읽고 기억할 거 세 가지:
- 인그레스는 L7 HTTP 라우터다. 호스트와 경로 기반으로 여러 서비스를 하나의 진입점으로 라우팅. LoadBalancer 서비스를 서비스마다 만드는 것보다 효율적.
- 인그레스 오브젝트는 규칙이고, 인그레스 컨트롤러가 실제 구현이다. 컨트롤러를 별도로 설치해야 인그레스가 동작한다.
- SSL/TLS 종료를 인그레스에서 한 번에 처리할 수 있다. cert-manager와 조합하면 인증서 발급과 갱신까지 자동화 가능.