2.6. 앰비언트 모드에서 Kubernetes 게이트웨이 API를 사용하여 서비스 노출
Kubernetes Gateway API를 사용하여 게이트웨이 및 HTTPRoute 리소스를 생성하고 앰비언트 모드로 게이트웨이를 배포할 수 있습니다. 리소스는 메시의 서비스를 메시 외부의 트래픽에 노출하도록 게이트웨이를 구성합니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 OpenShift Container Platform 웹 콘솔에 로그인되어 있습니다. - Red Hat OpenShift Service Mesh Operator가 설치되어 있습니다.
-
Istio리소스를 배포했습니다. - Kubernetes 네이티브 게이트웨이 API 리소스를 사용합니다.
- Istio 앰비언트 모드를 사용하거나 앰비언트 모드로 마이그레이션할 계획입니다.
앰비언트 모드(istio.io/dataplane-mode=앰비언트)를 사용하는 경우 Istio 게이트웨이 및 VirtualService 리소스가 앰비언트 모드와 완전히 호환되지 않으므로 수신 구성에 Kubernetes 게이트웨이 API를 사용하는 것이 좋습니다.
프로세스
다음 명령을 실행하여
httpbin이라는 네임스페이스를 생성합니다.oc create namespace httpbin
$ oc create namespace httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 앰비언트 모드의 레이블을 적용합니다.
oc label namespace httpbin istio.io/dataplane-mode=ambient
$ oc label namespace httpbin istio.io/dataplane-mode=ambientCopy 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 다음 예와 유사하게
httpbin-waypoint.yaml이라는 YAML 파일을 생성하여 waypoint 프록시를 배포합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-waypoint.yaml
$ oc apply -f httpbin-waypoint.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
httpbin서비스에서 ingress waypoint 라우팅을 활성화합니다.oc label service httpbin -n httpbin istio.io/ingress-use-waypoint=true
$ oc label service httpbin -n httpbin istio.io/ingress-use-waypoint=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 레이블은
httpbin서비스에 도달하기 전에 Ingress 게이트웨이의 트래픽이 waypoint 프록시에 구성된 waypoint 프록시에 구성된 L7 정책이 수신 트래픽에 적용되는지 확인합니다.다음 명령을 실행하여 네임스페이스 내부의 모든 서비스가 길 포인트를 통과하도록 네임스페이스에 waypoint 레이블을 적용합니다.
oc label ns httpbin istio.io/use-waypoint=httpbin-waypoint
$ oc label ns httpbin istio.io/use-waypoint=httpbin-waypointCopy to Clipboard Copied! Toggle word wrap Toggle overflow Kubernetes Gateway 리소스를 정의하는
httpbin-gw.yaml이라는 YAML 파일을 생성합니다. 이 리소스는 호스트httpbin.example.com의 포트 80(HTTP)을 노출하도록 게이트웨이 프록시를 구성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow "httpbin.example.com"- 클라이언트가 연결된 포트에서 메시 서비스에 액세스하려고 할 때 사용하는 가상 호스트 이름을 지정합니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 예와 유사하게 수신 게이트웨이에 대한
HTTPRoute리소스를 정의하는httpbin-ingress-hr.yaml이라는 YAML 파일을 만듭니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
spec.parentRefs는HTTPROUTE리소스를 이전 단계에서 생성한 Kubernetes 게이트웨이 리소스에 바인딩합니다. -
spec.rules.backendRefs는httpbin서비스의 이름과 포트를 포함하는backendRefs를 정의하여 일치하는 트래픽을httpbin서비스로 라우팅합니다.
HTTPRoute리소스는 게이트웨이 프록시에서httpbin서비스로 트래픽을 라우팅하는 규칙을 지정합니다.-
다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-ingress-hr.yaml
$ oc apply -f httpbin-ingress-hr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow waypoint 프록시에 대해
HTTPRoute리소스를 정의하는httpbin-waypoint-hr.yaml이라는 YAML 파일을 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
spec.parentRefs는HTTPROUTE리소스를 waypoint Gateway 리소스에 바인딩합니다. waypoint가 적용할 L7 라우팅 규칙을 구성합니다. -
spec.rules.backendRefs는httpbin서비스의 이름과 포트를 포함하는backendRefs를 정의하여 일치하는 트래픽을httpbin서비스로 라우팅합니다.
-
다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-waypoint-hr.yaml
$ oc apply -f httpbin-waypoint-hr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
이 예제 사용 사례에서 istio.io/ingress-use-waypoint=true 레이블 때문에 수신 게이트웨이의 트래픽이 waypoint 프록시를 통해 이동합니다. 그런 다음 HTTPRoute 리소스는 트래픽이 httpbin 서비스에 도달하기 전에 경로 기반 라우팅 정책을 적용합니다.
다음 명령을 실행하여 waypoint 프록시가 준비되었는지 확인합니다.
oc wait --for=condition=programmed gtw httpbin-waypoint -n httpbin
$ oc wait --for=condition=programmed gtw httpbin-waypoint -n httpbinCopy 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
$ oc apply -n curlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 앰비언트 모드의 레이블을
curl네임스페이스에 적용합니다.oc label namespace curl istio.io/dataplane-mode=ambient
$ oc label namespace curl istio.io/dataplane-mode=ambientCopy 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으로 설정하여 Kubernetes Gateway 및HTTPROUTE리소스가 지정하는 호스트와 일치시킵니다. 다음 명령을 실행하여curl요청을 보냅니다.oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/headers$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 응답은 다음 예제와 유사하게 요청이 성공했음을 나타내는
200 OKHTTP 상태를 반환해야 합니다.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 다음 명령을 실행하여
httpbinHTTPROUTE에 정의된 해당 URI(Uniform Resource Identifier) 접두사 일치가 없는 엔드포인트에curl요청을 보냅니다.oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/get$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/getCopy to Clipboard Copied! Toggle word wrap Toggle overflow /get끝점에 다음 예와 유사하게httpbinHTTPROUTE리소스에 일치하는 URI 접두사가 없기 때문에 응답에서404 Not Found상태를 예상대로 반환합니다.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>-istio -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service <gateway_name>-istio -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고게이트웨이는 OpenShift 경로를 사용하여 클러스터 외부의 트래픽에도 노출될 수 있습니다. 자세한 내용은 "OpenShift 경로를 사용하여 클러스터 외부의 트래픽에 게이트웨이 추가"를 참조하십시오.
게이트웨이 서비스 리소스의 외부 호스트 이름 또는 IP 주소를 사용할 때 클러스터 외부에서
httpbin서비스에 액세스할 수 있는지 확인합니다. 클러스터가 실행 중인 환경에 대해INGRESS_HOST변수를 적절하게 설정해야 합니다.다음 명령을 실행하여
INGRESS_HOST변수를 설정합니다.export INGRESS_HOST=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.addresses[0].value}')$ export INGRESS_HOST=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.addresses[0].value}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
INGRESS_PORT변수를 설정합니다.INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')$ INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 게이트웨이 호스트를 사용하여 다음 명령을 실행하여
curl요청을httpbin서비스에 보냅니다.curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers
$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
응답에
HTTP/1.1 200 OK상태가 있는지 확인합니다. 이 상태는 요청이 성공했음을 나타냅니다.