Kubernetes에서 Ingress를 사용하다 보면 NGINX 기반에서는 nginx.ingress.kubernetes.io/rewrite-target
같은 어노테이션으로 쉽게 rewrite 설정을 할 수 있다.
하지만 Traefik에서는 방식이 조금 다르기 때문에, 처음 접하면 왜 안 되지...? 하고 당황할 수 있다.
이번 글에서는 Traefik Ingress Controller에서 rewrite가 동작하지 않을 때,
어떻게 Middleware를 활용해서 경로 재작성(rewrite)을 처리하는지 간단하게 설명해보자.
* 문제 상황 *
Traefik을 Ingress Controller로 사용 중인데, 아래처럼 /api로 들어오는 요청을 /로 리다이렉트하려고 했다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: my-namespace
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.middlewares: my-namespace-stripprefix@kubernetescrd
spec:
ingressClassName: traefik
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: my-service
port:
number: 3000
tls:
- hosts:
- example.com
secretName: my-tls-secret
rewrite-target 같은 설정이 없으니까 아무리 해도 경로가 /api로 전달되고, 백엔드는 404를 리턴하게 된다.
💡 해결 방법: Middleware를 따로 정의하자
Traefik에서는 rewrite를 위해 Middleware라는 CRD(Custom Resource Definition)를 따로 정의해줘야 한다.
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: stripprefix
namespace: my-namespace
spec:
stripPrefix:
prefixes:
- /api
forceSlash: false
Ingress의 metadata.annotations에 아래처럼 추가한다:
annotations:
traefik.ingress.kubernetes.io/router.middlewares: my-namespace-stripprefix@kubernetescrd
여기서 주의할 점은 네임스페이스-미들웨어이름@kubernetescrd 형태로 적어야 Traefik이 해당 미들웨어를 정상 인식한다는 것!
'TIL' 카테고리의 다른 글
| Docker 로그와 PM2, Logger, 색상 출력 – 실무에서 겪은 이야기 (3) | 2025.08.15 |
|---|---|
| postgres DB 이원화 (3) | 2025.08.10 |
| 서버가 달라도 빠르게 통신하는 방법 ( 쿠버네틱스 ) (1) | 2025.07.29 |
| Node 도커 이미지 메모리 용량 줄이는 방법 (0) | 2025.07.24 |
| Loki란 (0) | 2025.07.23 |