2.3. Kubernetes 게이트웨이 API를 사용하여 서비스 노출
Kubernetes Gateway API를 사용하여 게이트웨이
및 HTTPRoute
리소스를 생성하고 게이트웨이를 배포합니다. 리소스는 메시의 서비스를 메시 외부의 트래픽에 노출하도록 게이트웨이를 구성합니다. 그런 다음 게이트웨이에 대한 서비스를
LoadBalancer
로 설정하여 클러스터 외부의 트래픽에 게이트웨이를 노출할 수 있습니다.
사전 요구 사항
-
cluster-admin
역할의 사용자로 OpenShift Container Platform 웹 콘솔에 로그인되어 있습니다. - Red Hat OpenShift Service Mesh Operator가 설치되어 있어야 합니다.
- Istio 리소스를 배포했습니다.
프로세스
다음 명령을 실행하여
httpbin
이라는 네임스페이스를 생성합니다.oc create namespace httpbin
$ oc create namespace httpbin
Copy 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.yaml
Copy 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 - 1
- 클라이언트가 연결된 포트에서 메시 서비스에 액세스하려고 할 때 사용하는 가상 호스트 이름을 지정합니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow HTTPRoute
리소스를 정의하는httpbin-hr.yaml
이라는 YAML 파일을 생성합니다.HTTPRoute
리소스는 게이트웨이 프록시에서httpbin
서비스로 트래픽을 라우팅하는 규칙을 지정합니다.HTTPRoute 파일 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 YAML 파일을 적용합니다.
oc apply -f httpbin-hr.yaml
$ oc apply -f httpbin-hr.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Gateway API 서비스가 준비되고 주소가 서비스에 할당되었는지 확인합니다.
oc wait --for=condition=programmed gtw httpbin-gateway -n httpbin
$ oc wait --for=condition=programmed gtw httpbin-gateway -n httpbin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여
curl
클라이언트의 네임스페이스를 생성합니다.oc create namespace curl
$ oc create namespace curl
Copy 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.yaml
Copy 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/headers
Copy 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 다음 명령을 실행하여
httpbin
HTTPROUTE
에 정의된 해당 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/get
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 응답에서
404 Not Found
상태를 반환합니다. 이는/get
엔드포인트에httpbin
HTTPROUTE
리소스에 일치하는 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>-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/headers
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
응답에
HTTP/1.1 200 OK
상태가 있는지 확인합니다. 이 상태는 요청이 성공했음을 나타냅니다.