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