여러 VirtualService를 Istio Gateway에 연결

12445 단어 devopsistiokubernetes

나는 무엇을 배울 것인가?



이 게시물에서는 Istio의 게이트웨이 및 VirtualService 리소스를 사용하여 클러스터 내에서 실행 중인 여러 Kubernetes 서비스를 노출하는 방법을 알아봅니다.

이 게시물의 아이디어는 작년에 녹음한 I의 댓글에서 가져왔습니다.



질문은 "동일한 게이트웨이 리소스를 사용하여 여러 VirtualService를 라우팅할 수 있습니까?"였습니다.

답은 예입니다. 게이트웨이 리소스를 사용하고 여러 VirtualService를 여기에 바인딩하여 클러스터 외부에 노출할 수 있습니다.

어떻게 작동합니까?



이를 수행하는 방법을 이해하는 열쇠는 게이트웨이 및 VirtualService 리소스의 hosts 필드에 있습니다.

VirtualService를 게이트웨이에 연결하면(gateway 필드 사용) 게이트웨이 리소스에 정의된 호스트만 VirtualService에 연결할 수 있습니다.
red.example.comgreen.example.com 두 호스트를 정의하는 게이트웨이 리소스 예제를 살펴보겠습니다.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - 'red.example.com'
        - 'green.example.com'

hosts 필드를 사용하여 게이트웨이와 함께 노출하려는 하나 이상의 호스트를 정의할 수 있습니다. 이 예에서는 FQDN 이름(예: red.example.com )으로 호스트를 지정합니다. 선택적으로 와일드카드 문자(예: my-namespace/* )를 포함하여 my-namespace 에서 모든 VirtualService 호스트를 선택할 수 있습니다. 게이트웨이 리소스의 호스트 목록을 필터로 생각할 수 있습니다. 예를 들어 위의 정의를 사용하면 호스트를 red.example.comgreen.example.com 까지 필터링합니다.

게이트웨이 외에도 두 가지 VirtualService가 있습니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: red
spec:
  hosts:
    - 'red.example.com'
  gateways:
    - gateway
  http:
    - route:
        - destination:
            host: red.default.svc.cluster.local
            port:
              number: 80
--------
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: green
spec:
  hosts:
    - 'green.example.com'
  gateways:
    - gateway
  http:
    - route:
        - destination:
            host: green.default.svc.cluster.local
            port:
              number: 80


두 VirtualService는 게이트웨이에 연결되어 게이트웨이를 통해 서비스(대상)를 '노출'할 수 있습니다.

그러나 게이트웨이를 연결하는 것만으로는 충분하지 않습니다. 또한 VirtualService에 hosts을 지정해야 합니다. 게이트웨이는 hosts 필드의 값을 사용하여 트래픽이 들어올 때 일치를 수행합니다.
red.example.com을 예로 들어 보겠습니다. 우리는 다음과 같이 요청합니다.

$ curl -H "Host: red.example.com" http://$GATEWAY_URL


요청이 인그레스 게이트웨이에 도달하고(호스트가 게이트웨이 리소스의 hosts 필드에 있다고 정의했기 때문에) 게이트웨이에 일치하는 호스트가 연결된 VirtualService가 있으므로 트래픽이 대상( red.default.svc.cluster.local )으로 이동합니다.
blue.example.com 에 요청을 보내면 404를 반환합니다. 게이트웨이의 호스트 필드에 해당 호스트 이름을 지정하지 않았기 때문입니다. 게이트웨이에 연결되고 호스트 필드에 blue.example.com이 정의된 VirtualService를 배포한 경우에도 여전히 404를 반환합니다.

사용해 보세요



클러스터에서 이를 시도하려면 다음 단계를 따르십시오.
  • Istio을 설치합니다.
  • 사이드카 주입을 위해 default 네임스페이스에 레이블을 지정합니다.
  • Green 및 Red 애플리케이션 배포:

  •    kubectl apply -f https://raw.githubusercontent.com/peterj/color-app/main/examples/green.yaml
    
       kubectl apply -f https://raw.githubusercontent.com/peterj/color- app/main/examples/red.yaml
    


  • 게이트웨이 및 VirtualServices 생성:

  • apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
            - 'red.example.com'
            - 'green.example.com'
    --------
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: red
    spec:
      hosts:
        - 'red.example.com'
      gateways:
        - gateway
      http:
        - route:
            - destination:
                host: red.default.svc.cluster.local
                port:
                  number: 80
    --------
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: green
    spec:
      hosts:
        - 'green.example.com'
      gateways:
        - gateway
      http:
        - route:
            - destination:
                host: green.default.svc.cluster.local
                port:
                  number: 80
    


    모든 것이 배포되면 GATEWAY_URL에 요청을 시도할 수 있습니다.
    kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'을 사용하여 GATEWAY_URL을 가져올 수 있습니다.

    브라우저에서 이를 시도하려면 호스트 헤더를 수정할 수 있는 확장 프로그램을 설치해야 합니다. 또는 실제 도메인 이름에 대한 액세스 권한이 있는 경우 도메인 등록 기관의 설정에서 GATEWAY_URL을 A 이름 레코드로 설정하고 직접 사용할 수 있습니다.

    You can refer to article to learn how to do that.



    호스트를 green.example.com 으로 설정하여 요청해 보겠습니다.

    $ curl -H "Host: green.example.com" http://$GATEWAY_URL
    <link href="/css/style.css" rel="stylesheet" type="text/css">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@500&display=swap" rel="stylesheet">
    
    <div class="main" style="background-color:#10b981; color:#FFFFFF">
        <h1>GREEN</h1>
    </div>
    

    red.example.com을 호스트로 사용하는 경우 비슷한 응답을 받습니다.

    좋은 웹페이지 즐겨찾기