2.2. 使用 Istio 网关和 VirtualService 资源公开服务
您可以使用 Istio 网关和 VirtualService 资源来配置使用网关注入部署的网关。资源将网格中的服务公开给网格之外的流量。您可以将网关 Service 类型设置为 LoadBalancer,以允许来自集群外部的流量。
先决条件
- 已使用网关注入安装了 Istio 网关。
-
您使用 Istio
网关和VirtualService资源。 -
您已有
VirtualService配置,且不会计划迁移到 ambient 模式。
流程
运行以下命令,创建名为
httpbin的命名空间:oc create namespace httpbin
$ oc create namespace httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在命名空间中启用 sidecar 注入。如果您使用
InPlace升级策略,请运行以下命令:oc label namespace httpbin istio-injection=enabled
$ oc label namespace httpbin istio-injection=enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果使用
基于 Revision 的升级策略,请运行以下命令:要查找您的 &
lt;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 使用修订名称标记命名空间,以启用 sidecar 注入:
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 创建名为
httpbin-gw.yaml的 YAML 文件,该文件定义了 Istio网关资源。此资源将网关代理配置为为主机公开端口 80 (HTTP),即httpbin.example.com。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 运行以下命令,使用
curlpod 的名称设置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,以匹配 Istio网关和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 运行以下命令,将 curl 请求发送到在
httpbinVirtualService中定义的对应 URI 前缀匹配的端点: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 通过将
Service类型设置为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 运行以下命令,使用网关的主机向
httpbin服务发送curl请求: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状态,这表示请求是否成功。