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서비스에 도달하기 전에 waypoint 프록시에 구성된 waypoint 프록시와 L7)에 구성된 계층 7(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리소스를httpbin서비스에 바인딩합니다. 서비스에서istio.io/ingress-use-waypoint=true레이블과 결합하면HTTPRoute는 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 -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네임스페이스에 적용합니다.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 \ httpbin-gateway-istio.httpbin.svc.cluster.local/headers$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ httpbin-gateway-istio.httpbin.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 \ httpbin-gateway-istio.httpbin.svc.cluster.local/get$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ httpbin-gateway-istio.httpbin.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 httpbin-gateway-istio -n httpbin -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service httpbin-gateway-istio -n httpbin -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 httpbin-gateway -n httpbin -o jsonpath='{.status.addresses[0].value}')$ export INGRESS_HOST=$(oc get gtw httpbin-gateway -n httpbin -o jsonpath='{.status.addresses[0].value}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
INGRESS_PORT변수를 설정합니다.INGRESS_PORT=$(oc get gtw httpbin-gateway -n httpbin -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')$ INGRESS_PORT=$(oc get gtw httpbin-gateway -n httpbin -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상태가 있는지 확인합니다. 이 상태는 요청이 성공했음을 나타냅니다.