TIL

Ingress Controller rewrite 안될때

하얀잔디 2025. 7. 30. 20:20

 

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이 해당 미들웨어를 정상 인식한다는 것!