인프라&운영체제/Istio

[Istio] 세분화된 url 라우팅을 위한 Virtual Service 작성방법

희랍인 조르바 2022. 2. 23. 00:06

요즘 회사에서 기존 서비스를 새로운 언어로 마이그레이션 작업을 하고 있다.

 

istio를 통해 기존 서비스의 api를 신규 서비스에 새로 작성된 api로 라우팅을 해줘야하는 상황이었다.

 

prefix를 통해 편하게 작성하면 좋았겠지만, 피처별로 완료한 개별 api 단위로 넘겨야했다.

 

api를 작성하면 api url에 path variable이 끼어있는 케이스가 많기 때문에 중간에 path variable이 들어가도

정상적으로 라우팅 해주는 방법을 찾아야했다.

 

결론적으로 Virtual Service에서 제공하는 Regex(정규식) 방식으로 라우팅을 해주면 된다.

 

공식 레퍼런스에서 구글 Re2 정규식 스타일로 작성하면 된다고 표기 되어 있다.

 

근데 공식 레퍼런스에서는 딱히 예시가 보이지 않았고, 구글링을 해봐도 괜찮은 예시가 거의 보이지 않았다.

 

정규식이란게 자주 볼 일이 없다보니 볼때마다 헤매긴 한다.


참고로 Virtual Service에 선언된 라우팅 룰은 위에서 아래로 읽기 때문에 상대적으로 라우팅하려는 api가 다른 api보다 먼저 검증해서 라우팅해줘야한다면 다른 api보다 상단에 위치해야한다.

 

reference: https://istio.io/latest/docs/concepts/traffic-management/#routing-rule-precedence


예시 yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sample-virtualservice
  namespace: sample
spec:
  hosts:
    - "sample.dev.company.io"
  gateways:
    - sample-gateway
  http:
    - name: "sample-routes"
      match:
        - uri:
            regex: ^(/api/v1/books/)([0-9A-Za-z_-]*$)     
        - uri:
            regex: ^(/api/v1/books/)([0-9A-Za-z_-]+)(/authors/)([0-9A-Za-z_-]+)(/status)
          method:
            exact: PUT
     route:
        - destination:
            host: sample-service
            port:
              number: 80

실제 api url은 다음과 같을 것이다.

(GET, POST, PUT 등) /api/v1/books/{book uuid}
PUT /api/v1/books/{book uuid}/authors/{author uuid}/status

uuid의 값들은 숫자, 알파벳 대,소문자, 하이픈(-), 언더바(_)를 허용하며 해당 api를 라우팅해줄 것이다.

 

위의 방식을 통해 세분화된 api 단위 하나하나씩을 라우팅해가며 마이그레이션 작업을 수행할 수 있다.