-
Istio Ingress Gateway 정리2 (Prefix based routing, Header based routing)K8S 2021. 6. 24. 00:32
이번 포스팅은 istio ingress gateway를 이용한 prefix based routing과 header based rotuing에 대해서 다룬다.
prefix 매칭이란 front로 들어오는 uri가 특정 Rule과 매칭되면, 특정 룰에 맞게 routing하는 것이다.
prefix 매칭은 정확하게 매칭되지 않아도 된다. 예를들어 룰은 /abc, 실제 들어온 경로가 /abcd라면 /abc로 들어왔다고 치고 룰에 맞게 Routing한다.
그리고 header based routing은 말 그대로 Header값을 이용한 라우팅으로 key value를 이용하여 routing한다.
1. prefix based routing
다음은 istio proxy를 위한 yaml로 저번 포스팅의 virtual service에서 새로운 라우팅 규칙만 추가해주었다.
<Gateway, virtual service, destination rule >
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: ingress-gateway-configuration spec: selector: istio: ingressgateway # use Istio default gateway implementation servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" # Domain name of the external website --- kind: VirtualService apiVersion: networking.istio.io/v1alpha3 metadata: name: fleetman-webapp namespace: default spec: hosts: # which incoming host are we applying the proxy rules to??? - "*" # Copy the value in the gateway hosts - usually a Domain Name gateways: - ingress-gateway-configuration http: - match: # This is a LIST - uri: # 들어오는 Uri가 http://[ingress gateway의 ip]/experimental거나 prefix: "/experimental" - uri: # http://[ingress gateway의 ip]/canary라면 prefix: "/canary" route: # THEN - destination: # fleetman-webapp 서비스로 라우팅한다. 단, subset을 고려해서! host: fleetman-webapp subset: experimental - match: - uri: prefix: "/" route: - destination: host: fleetman-webapp subset: original --- kind: DestinationRule apiVersion: networking.istio.io/v1alpha3 metadata: name: fleetman-webapp namespace: default spec: host: fleetman-webapp subsets: - labels: version: original name: original - labels: version: experimental name: experimental
키알리를 통해서 보면 다음과 같은 구조를 확인할 수 있다.
그리고 Ingress gateway로 traffic을 보내 지정된 prefix routing 규칙이 잘 적용되는지 확인해본다.
여기서 주의할 부분은 프록시에서 관리하는 routing 규칙이기 때문에 K8S 서비스 오브젝트로 접근해서는 routing 규칙이 적용되지 않는다.
ingress gateway를 통해 접속해야 Routing 규칙이 적용된다.
다음은 K8S 서비스 오브젝트를 통해서 접근했을 때다. (주의사항을 어긴 경우)
while (true) do curl -s http://[k8s service 주소]/experimental | grep title; sleep 0.5; done
서비스의 external ip로 접속했을 때, prefix 라우팅 규칙이 적용되지 않아 라운드로빈 방식으로 동작하는 것 을 알 수 있다.
그렇다면 ingress gateway로 접속했을 때는 잘 넘어가는지 확인해보자.
1) /experimental or /canary 경로로 접속
while (true) do curl -s http://[ingress gateway 주소]/experimental | grep title; sleep 0.5; done
원하는 responese가 온다. 굿
2) / 경로로 접속
while (true) do curl -s http://[ingress gateway 주소]/ | grep title; sleep 0.5; done
마찬가지로 원하는 response가 온다.
2. header based routing
다음 yaml 파일은 header matching을 이용하여 "my-header: canary" 헤더를 가진 패킷은 모두 카나리로 보낸다.
<gateway, virtual service, destination rule>
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: ingress-gateway-configuration spec: selector: istio: ingressgateway # use Istio default gateway implementation servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" # Domain name of the external website --- kind: VirtualService apiVersion: networking.istio.io/v1alpha3 metadata: name: fleetman-webapp namespace: default spec: hosts: # which incoming host are we applying the proxy rules to??? - "*" gateways: - ingress-gateway-configuration http: - match: - headers: # IF my-header: # my-header: canary면 exact: canary route: # THEN # canary 서비스로 Routing한다. - destination: host: fleetman-webapp subset: experimental - route: # CATCH ALL 위에서 해당되지 않은 모든 규칙은 다음 routing rule을 따른다. - destination: host: fleetman-webapp subset: original --- kind: DestinationRule apiVersion: networking.istio.io/v1alpha3 metadata: name: fleetman-webapp namespace: default spec: host: fleetman-webapp subsets: - labels: version: original name: original - labels: version: experimental name: experimental
apply 해준 후, "my-header: canay"라는 헤더 값을 넣어서 보내서 확인해보자.
while (true) do curl -s -H "my-header: canary" http://[ingress gateway 주소] | grep title; sleep 0.5; done
canary 포드로 잘 routing되고 있다.
하지만 만약 다음과 같이 header 값이 다르거나 헤더가 없다면 절대로 canary쪽으로 routing되지 않는다.
while (true) do curl -s -H "my-header: abcd" http://[ingress gateway 주소] | grep title; sleep 0.5; done
while (true) do curl -s http://[ingress gateway 주소] | grep title; sleep 0.5; done
틀린 내용이 있을 수도 있습니다!
틀린 내용이 있다면 댓글로 달아주시면 감사하겠습니다!
반응형'K8S' 카테고리의 다른 글
Istio Circuit breaking 정리 (0) 2021.06.25 Istio Header based routing를 이용한 Dark Release (0) 2021.06.25 Istio Ingress gateway 정리(Weighted routing, Canary) (0) 2021.06.22 Istio Session Affinity 정리 (0) 2021.06.22 Istio kiali를 이용한 카나리 구성과 virtual service, destination rule 정리 (0) 2021.06.21