2.2. Istio 게이트웨이 및 VirtualService 리소스를 사용하여 서비스 노출
Istio 게이트웨이 및 VirtualService 리소스를 사용하여 게이트웨이 삽입을 통해 배포된 게이트웨이를 구성할 수 있습니다. 리소스는 메시의 서비스를 메시 외부에 있는 트래픽에 노출합니다. 게이트웨이 서비스 유형을 LoadBalancer 로 설정하여 클러스터 외부의 트래픽을 허용할 수 있습니다.
사전 요구 사항
- 게이트웨이 삽입을 사용하여 Istio 게이트웨이를 설치했습니다.
-
Istio
게이트웨이및VirtualService리소스를 사용하고 있습니다. -
기존
VirtualService구성이 있으며 앰비언트 모드로 마이그레이션하지 않습니다.
프로세스
다음 명령을 실행하여
httpbin이라는 네임스페이스를 생성합니다.oc create namespace httpbin
$ oc create namespace httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow 네임스페이스에서 사이드카 삽입을 활성화합니다.
InPlace업그레이드 전략을 사용하는 경우 다음 명령을 실행합니다.oc label namespace httpbin istio-injection=enabled
$ oc label namespace httpbin istio-injection=enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow 참고RevisionBased업그레이드 전략을 사용하는 경우 다음 명령을 실행합니다.<
revision-name>을 찾으려면 다음 명령을 실행합니다.oc get istiorevisions.sailoperator.io
$ oc get istiorevisions.sailoperator.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 예와 유사한 출력이 표시됩니다.
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33s
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 사이드카 삽입을 활성화하려면 버전 이름으로 네임스페이스에 레이블을 지정합니다.
oc label namespace httpbin istio.io/rev=default
$ oc label namespace httpbin istio.io/rev=defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow
다음 명령을 실행하여
httpbin이라는 샘플 서비스를 배포합니다.oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
$ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Istio
게이트웨이리소스를 정의하는httpbin-gw.yaml이라는 YAML 파일을 생성합니다. 이 리소스는 호스트httpbin.example.com의 포트 80(HTTP)을 노출하도록 게이트웨이 프록시를 구성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow VirtualService에 대한httpbin-vs.yaml이라는 YAML 파일을 생성합니다.VirtualService는 게이트웨이 프록시에서httpbin서비스로 트래픽을 라우팅하는 규칙을 정의합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-vs.yaml
$ oc apply -f httpbin-vs.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 확인을 위해 다음 명령을 실행하여
curl클라이언트의 네임스페이스를 생성합니다.oc create namespace curl
$ oc create namespace curlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
curl클라이언트를 배포합니다.oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
CURL_POD변수를curl포드의 이름으로 설정합니다.CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')$ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 응답에는 요청이 성공했음을 나타내는
200 OK HTTP상태가 있어야 합니다.HTTP/1.1 200 OK server: istio-envoy ...
HTTP/1.1 200 OK server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
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$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/getCopy to Clipboard Copied! Toggle word wrap Toggle overflow 응답에서
404 Not Found상태를 반환해야 합니다. 이는/get끝점에httpbinVirtualService리소스에 일치하는 URI 접두사가 없기 때문에 예상됩니다.HTTP/1.1 404 Not Found server: istio-envoy ...
HTTP/1.1 404 Not Found server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 서비스유형을LoadBalancer로 설정하여 클러스터 외부의 트래픽에 게이트웨이 프록시를 노출합니다.oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고게이트웨이는 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}')$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 클러스터가 GCP 또는 Azure에서 실행되는 경우 다음 명령을 실행하여
INGRESS_HOST변수를 설정합니다.INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 게이트웨이 호스트를 사용하여
curl요청을httpbin서비스로 보냅니다.curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
응답에
HTTP/1.1 200 OK상태가 있는지 확인합니다. 이 상태는 요청이 성공했음을 나타냅니다.