2.3. 使用 Kubernetes 网关 API 公开服务
使用 Kubernetes 网关 API 创建 网关和
HTTPRoute
资源并部署网关。资源配置网关,将网格中的服务公开给网格外的流量。然后,您可以将网关的 Service
设置为 LoadBalancer
,将网关公开给集群外的流量。
先决条件
-
以具有
cluster-admin
角色的用户身份登录到 OpenShift Container Platform Web 控制台。 - 已安装 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 创建名为
httpbin-gw.yaml
的 YAML 文件,用于定义 Kubernetes 网关资源。此资源将网关代理配置为为主机公开端口 80 (HTTP),即httpbin.example.com
。网关资源文件示例
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 创建名为
httpbin-hr.yaml
的 YAML 文件,该文件定义HTTPRoute
资源。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 运行以下命令,确保网关 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_POD
变量: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 网关和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 运行以下命令,向没有相应 Uniform Resource Identifier (URI)前缀匹配
的端点
发送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 通过将
Service
类型设置为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 使用网关主机,运行以下命令来向
httpbin
服务发送curl
请求: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
状态,这表示请求是否成功。