ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Istio Ingress Gateway 정리2 (Prefix based routing, Header based routing)
    K8S 2021. 6. 24. 00:32

     

     

    Istio Ingress gateway 정리

    k8s의 Ingress는 클러스터 외부에서 접근하고 트래픽을 원하는 서비스로 보낼 수 있는 오브젝트다. 그리고 이스티오 서비스 매쉬에서도 ingress gateway라는 모델을 제공하는데 어떤 차이가 있어서 새

    seungjuitmemo.tistory.com

     

    이번 포스팅은 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

     

     

    틀린 내용이 있을 수도 있습니다! 

    틀린 내용이 있다면 댓글로 달아주시면 감사하겠습니다!

     

     

    반응형

    댓글

Designed by Tistory.