여러 VirtualService를 Istio Gateway에 연결
12445 단어 devopsistiokubernetes
나는 무엇을 배울 것인가?
이 게시물에서는 Istio의 게이트웨이 및 VirtualService 리소스를 사용하여 클러스터 내에서 실행 중인 여러 Kubernetes 서비스를 노출하는 방법을 알아봅니다.
이 게시물의 아이디어는 작년에 녹음한 I의 댓글에서 가져왔습니다.
질문은 "동일한 게이트웨이 리소스를 사용하여 여러 VirtualService를 라우팅할 수 있습니까?"였습니다.
답은 예입니다. 게이트웨이 리소스를 사용하고 여러 VirtualService를 여기에 바인딩하여 클러스터 외부에 노출할 수 있습니다.
어떻게 작동합니까?
이를 수행하는 방법을 이해하는 열쇠는 게이트웨이 및 VirtualService 리소스의
hosts
필드에 있습니다.VirtualService를 게이트웨이에 연결하면(
gateway
필드 사용) 게이트웨이 리소스에 정의된 호스트만 VirtualService에 연결할 수 있습니다.red.example.com
및 green.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.com
및 green.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를 반환합니다.사용해 보세요
클러스터에서 이를 시도하려면 다음 단계를 따르십시오.
default
네임스페이스에 레이블을 지정합니다. 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
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
을 호스트로 사용하는 경우 비슷한 응답을 받습니다.
Reference
이 문제에 관하여(여러 VirtualService를 Istio Gateway에 연결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/peterj/attach-multiple-virtualservices-to-istio-gateway-7do텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)