2장. 메시로 트래픽 가져오기
Istio API를 사용하여 게이트웨이 삽입을 사용하여 설치된 게이트웨이 프록시를 구성하여 메시 외부에서 발생하는 트래픽을 수락하고 해당 트래픽을 메시 내의 서비스로 라우팅할 수 있습니다.
LoadBalancer 유형 Service 또는 OpenShift 경로를 사용하여 클러스터 외부의 트래픽에 게이트웨이 프록시를 노출할 수 있습니다.
2.1. 수신 트래픽을 수락하도록 게이트웨이 삽입을 사용하여 설치된 게이트웨이 구성 정보 링크 복사링크가 클립보드에 복사되었습니다!
게이트웨이 삽입을 사용하여 게이트웨이를 설치할 때 Istio Gateway 및 VirtualService 리소스를 결합하여 수신 트래픽을 수신하도록 구성할 수 있습니다. Istio Gateway 리소스는 수신 또는 발신 HTTP/TCP 연결을 수신하는 메시의 에지에서 작동하는 로드 밸런서를 설명합니다. 게이트웨이 사양은 노출해야 하는 포트 세트, 사용할 프로토콜 유형, 로드 밸런서에 대한 SNI(Server Name Indication) 구성을 설명합니다. VirtualServices 는 VirtualServices 를 사용하여 내부 메시 트래픽에 대한 라우팅 규칙을 정의하는 방법과 유사하게 Istio 게이트웨이 에 적용할 라우팅 규칙을 정의합니다.
다음 예에서 Istio Gateway 리소스는 외부 트래픽의 진입점으로 작동하도록 게이트웨이 프록시를 구성합니다. 이 구성은 호스트 info.com 의 포트 443(HTTPS)을 노출합니다. 예제 구성은 istio: ingressgateway 레이블이 있는 포드에 적용됩니다. tls 모드는 ScanSetting PLE 로 구성되며, 이 모드는 예제에서 제공하는 인증서 및 개인 키를 사용하여 들어오는 HTTPS 트래픽을 종료합니다.
샘플 구성
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: info-gateway
namespace: info
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- info.com
tls:
mode: SIMPLE
serverCertificate: /etc/certs/servercert.pem
privateKey: /etc/certs/privatekey.pem
다음 VirtualService 는 이전 예제 구성에 표시된 Istio Gateway 리소스에 바인딩됩니다. 사양은 /reviews/ 경로 접두사를 사용하여 info 네임스페이스의 reviews 서비스로 트래픽을 라우팅하는 규칙을 정의합니다. VirtualService 는 이전에 표시된 Gateway 리소스를 명시적으로 참조합니다. 이렇게 하면 라우팅 규칙이 지정된 게이트웨이를 통해 들어오는 트래픽에만 적용됩니다.
샘플 구성
kind: VirtualService
metadata:
name: info-rule
namespace: info
spec:
hosts:
- info.com
gateways:
- info/bookinfo-gateway
http:
- match:
- uri:
prefix: /reviews/
route:
- destination:
port:
number: 9080
host: reviews.info.svc.cluster.local
2.1.1. Istio 게이트웨이 및 VirtualService 리소스를 사용하여 서비스 노출 링크 복사링크가 클립보드에 복사되었습니다!
이 절차에서는 Istio 게이트웨이 및 VirtualService 리소스를 사용하여 게이트웨이 삽입을 통해 배포된 게이트웨이를 구성합니다. 리소스는 메시의 서비스를 메시 외부의 트래픽에 노출하도록 게이트웨이를 구성합니다. 그런 다음 게이트웨이의 Service 를 LoadBalancer 로 입력하여 클러스터 외부의 트래픽에 게이트웨이를 노출합니다.
사전 요구 사항
- 게이트웨이 삽입을 사용하여 Istio 게이트웨이를 설치했습니다.
프로세스
다음 명령을 실행하여
httpbin이라는 네임스페이스를 생성합니다.$ oc create namespace httpbin네임스페이스에서 사이드카 삽입을 활성화합니다.
InPlace업그레이드 전략을 사용하는 경우 다음 명령을 실행합니다.$ oc label namespace httpbin istio-injection=enabled참고RevisionBased업그레이드 전략을 사용하는 경우 다음 명령을 실행합니다.<
revision-name>을 찾으려면 다음 명령을 실행합니다.$ oc get istiorevisions.sailoperator.io샘플 출력:
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33s사이드카 삽입을 활성화하려면 버전 이름으로 네임스페이스에 레이블을 지정합니다.
$ oc label namespace httpbin istio.io/rev=default
다음 명령을 실행하여
httpbin이라는 샘플 서비스를 배포합니다.$ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yamlIstio
게이트웨이리소스를 정의하는httpbin-gw.yaml이라는 YAML 파일을 생성합니다. 이 리소스는 호스트httpbin.example.com의 포트 80(HTTP)을 노출하도록 게이트웨이 프록시를 구성합니다.apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: httpbin-gateway namespace: httpbin spec: selector: istio: <gateway_name>1 servers: - port: number: 80 name: http protocol: HTTP hosts: - httpbin.example.com2 다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f httpbin-gw.yamlVirtualService에 대한httpbin-vs.yaml이라는 YAML 파일을 생성합니다.VirtualService는 게이트웨이 프록시에서httpbin서비스로 트래픽을 라우팅하는 규칙을 정의합니다.apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: httpbin namespace: httpbin spec: hosts: - httpbin.example.com1 gateways: - httpbin-gateway2 http: - match: - uri: prefix: /status - uri: prefix: /headers route: - destination:3 port: number: 8000 host: httpbin다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f httpbin-vs.yaml확인을 위해 다음 명령을 실행하여
curl클라이언트의 네임스페이스를 생성합니다.$ oc create namespace curl다음 명령을 실행하여
curl클라이언트를 배포합니다.$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml다음 명령을 실행하여
CURL_POD변수를curl포드의 이름으로 설정합니다.$ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')curl클라이언트를 사용하여 수신 게이트웨이서비스리소스를 통해httpbin애플리케이션의/headers엔드포인트로 요청을 보냅니다. 요청의Host헤더를httpbin.example.com으로 설정하여 IstioGateway및VirtualService리소스가 지정하는 호스트와 일치시킵니다. 다음curl명령을 실행하여 요청을 보냅니다.$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/headers응답에는 요청이 성공했음을 나타내는
200 OK HTTP상태가 있어야 합니다.출력 예
HTTP/1.1 200 OK server: istio-envoy ...다음 명령을 실행하여
httpbinVirtualService에 정의된 해당 URI 접두사 일치가 없는 엔드포인트에 curl 요청을 보냅니다.$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/get응답에서
404 Not Found상태를 반환해야 합니다. 이는/get끝점에httpbinVirtualService리소스에 일치하는 URI 접두사가 없기 때문에 예상됩니다.출력 예
HTTP/1.1 404 Not Found server: istio-envoy ...서비스유형을LoadBalancer로 설정하여 클러스터 외부의 트래픽에 게이트웨이 프록시를 노출합니다.$ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'참고게이트웨이는 OpenShift 경로를 사용하여 클러스터 외부의 트래픽에도 노출될 수 있습니다. 자세한 내용은 "OpenShift 경로를 사용하여 클러스터 외부의 트래픽에 게이트웨이 추가"를 참조하십시오.
게이트웨이 서비스 리소스의 외부 호스트 이름 또는 IP 주소를 사용할 때 클러스터 외부에서
httpbin서비스에 액세스할 수 있는지 확인합니다.클러스터가 실행 중인 환경에 대해INGRESS_HOST변수를 적절하게 설정해야 합니다.클러스터가 AWS에서 실행되는 경우 다음 명령을 실행하여
INGRESS_HOST변수를 설정합니다.$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')클러스터가 GCP 또는 Azure에서 실행되는 경우 다음 명령을 실행하여
INGRESS_HOST변수를 설정합니다.$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')다음 명령을 실행하여 게이트웨이 호스트를 사용하여
curl요청을httpbin서비스로 보냅니다.$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
-
응답에
HTTP/1.1 200 OK상태가 있는지 확인합니다. 이 상태는 요청이 성공했음을 나타냅니다.