PaaS/Kubernetes

Ingress에서 Rewrite Target 사용하기

armyost 2023. 11. 9. 14:11
728x90

context path를 변경하여 서버에 라우팅을 할때는 다음과 같이 Ingress를 정의해야한다. 

metadata.annotations.nginx.ingress.kubernetes.io/rewrite-target

 

rewrite-target은 nginx의 Annotation중의 하나이다. ingress에 정의된 경로로들어온 요청을 호출경로를 재정의 하는것이다.

예를들어 http://test.armyost.com/api/test1/insertUserdata.do 를 아래의 정책으로 rewrite하면 ingress를 지나 서버에서는 http://test.armyost.com/insertUserdata.do 로 전달됩니다. 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/cors-allow-headers: Keep-Alive, User-Agent, X-Requested-With,
      X-Forwarded-For, Cache-Control, Content-Type, Authorization
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  generation: 1
  name: ${APP_NAME}-ingress
spec:
  rules:
    - host: test.armyost.com
      http:
        paths:
        - path: /api/test1(/|$)(.*)
          pathType: Prefix
          backend:
            service:
              name: test1-service
              port:
                number: 80  
    - host: test.armyost.com
      http:
        paths:
        - path: /api/test2(/|$)(.*)
          pathType: Prefix
          backend:
            service:
              name: test2-service
              port:
                number: 80

 

여기서 내가 가장 많이 삽질한 것은...

/api/test1/service .. 이렇게 Context가 아무리 길어도 이걸 모두 날리려면 그냥 rewrite-target: /$2 로 써야 한다는 것입니다.

처음에는 컨텍스트 4번째 부터 살리려면 $4라던지 해야하는지 알고 삽질을 무지했음...

(/|$) 를 Group1로 보고 (.*)를 Group2로 봅니다.

 

그리고 Regular Expression에 따르면

(/|$) : /api/test1(뒤에 뭐없이 끝나거나) 또는 /api/test1/ 인 경우 Match

(.*) : 그뒤에 char가 뭐가 오던(심지어 없어도) Match

 

그리고 ingress도 거의(아닌경우도 있음) nginx 모듈을 사용하여 아래의 nginx tester를 사용하면 좋다. Regex(Regular Expression)를 점검해보기에 좋다.

https://nginx.viraptor.info/

 

https://nginx.viraptor.info/

 

nginx.viraptor.info