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