通过 Istio Gateway 和 VirtualService 资源暴露服务
本指南演示如何使用 Istio 的 Gateway 和 VirtualService 资源来配置通过网关注入部署的网关。这些资源将网关配置为将网格内的服务暴露给外部流量。随后,通过将网关的 Service 类型更改为 LoadBalancer,将网关暴露给集群外部的流量。
前提条件
- 已使用网关注入安装 Istio 网关。
操作步骤
-
通过执行以下命令创建一个名为
httpbin的新命名空间: -
为该命名空间启用 sidecar 注入。如果您的环境使用
InPlace升级策略,请运行以下命令:NOTE如果您使用的是
RevisionBased升级策略,请执行以下命令:-
运行以下命令以查找您的
<revision-name>:示例输出:
-
使用修订名称为命名空间打标签以启用 sidecar 注入:
-
-
通过运行以下命令部署
httpbin示例服务: -
创建一个名为
httpbin-gw.yaml的文件,包含 IstioGateway资源定义。该资源配置网关代理打开端口 80(HTTP),用于主机httpbin.example.com。- 将
selector设置为与网关代理Deployment的 Pod 模板中定义的唯一标签匹配。默认情况下,IstioGateway配置适用于所有命名空间中匹配的网关 Pod。 - 在
hosts字段中列出客户端可用于访问对应端口网格服务的地址。
- 将
-
使用以下命令应用该 YAML 文件:
-
创建另一个名为
httpbin-vs.yaml的 YAML 文件,用于定义VirtualService。该VirtualService将定义规则,将流量从网关代理路由到httpbin服务。- 定义
hosts,指定VirtualService路由规则适用的主机。所指定的hosts必须由此VirtualService所附加的 IstioGateway资源暴露。 - 通过将网关名称添加到
gateways列表,将VirtualService附加到上一步的 IstioGateway资源。 - 通过定义指定
httpbinService的host和port的destination,将匹配的流量定向到之前部署的httpbin服务。
- 定义
-
使用以下命令应用该 YAML 文件:
验证
-
通过执行以下命令创建一个用于
curl客户端的命名空间: -
使用以下命令部署
curl客户端: -
通过运行以下命令将
curlPod 的名称存储在变量CURL_POD中: -
从
curl客户端通过入口网关Service向httpbin应用的/headers端点发送请求。将Host头设置为httpbin.example.com,以匹配 IstioGateway和VirtualService中指定的主机。执行以下curl命令: -
响应应显示
200 OKHTTP 状态,确认请求成功。示例输出
-
发送另一个请求,访问
httpbinVirtualService中未定义 URI 前缀匹配的端点,运行以下命令:响应应为
404 Not Found状态。这是预期结果,因为/get端点在httpbinVirtualService中没有定义 URI 前缀匹配。示例输出
-
通过将网关的
Service类型更改为LoadBalancer,将网关代理暴露给集群外部流量: -
使用网关
Service的外部主机名或 IP 地址确认httpbin服务可从集群外部访问。请确保根据您的集群环境正确设置INGRESS_HOST变量。a. 使用以下命令设置
INGRESS_HOST变量:在某些环境中,负载均衡器可能通过主机名而非 IP 地址暴露。在这种情况下,入口网关的
EXTERNAL-IP值不是 IP 地址,而是主机名,上述命令将无法正确设置INGRESS_HOST环境变量。请使用以下命令修正INGRESS_HOST的值:b. 通过运行以下命令,使用网关主机向
httpbin服务发送curl请求:INFO如果
$INGRESS_HOST是 IPv6 地址,构造 URL 时请用方括号括起来。例如: -
检查响应是否包含
HTTP/1.1 200 OK状态,确认请求成功。