在 ambient 模式下通过 Kubernetes Gateway API 暴露服务
在 Istio ambient 模式中,Kubernetes Gateway API 是配置入口流量路由的推荐方式。你可以创建 Gateway 和 HTTPRoute 资源来部署一个 gateway,使 mesh 内部服务可被外部流量访问。
用于 Layer 7 路由的 waypoint proxy
要强制执行 Layer 7(L7)路由策略——包括基于路径的路由和 header 匹配——请在包含目标服务的 namespace 中部署 waypoint proxy。waypoint proxy 负责处理 L7 流量,并应用通过 HTTPRoute 和 GRPCRoute 资源定义的路由规则。
在 ambient 模式下,VirtualService 资源的兼容性有限,不应与 Gateway API 配置一起使用。请使用 Kubernetes Gateway API 资源作为 ambient 模式下流量路由的标准方法。
前提条件
- 已安装 Alauda Service Mesh v2 Operator。
Istio和IstioCNI资源已使用 ambient profile 进行配置。- 已创建
Ztunnel资源。 - 确认 Linux kernel 兼容性。
- 你的 Kubernetes 集群支持外部负载均衡器(即,类型为
LoadBalancer的 Services)。
操作步骤
-
创建一个名为
httpbin的 namespace: -
为
httpbinnamespace 添加istio-discovery=enabled标签: -
通过应用 dataplane mode 标签,为该 namespace 启用 ambient 模式:
-
部署
httpbin示例服务: -
创建名为
httpbin-waypoint.yaml的文件以定义 waypoint proxy。此Gateway资源使用istio-waypointgateway class 来处理该 namespace 中服务的 L7 流量。istio.io/waypoint-for: service标签表示该 waypoint 会处理服务流量。标签值决定了所处理的流量类型。详情请参见 Waypoint traffic types(Istio 文档)。- 指定
istio-waypointgateway class,它会部署 waypoint proxy,而不是标准的 ingress gateway。
-
应用 waypoint proxy 配置:
-
为
httpbin服务添加标签,以便将入口流量引导经过 waypoint proxy:NOTEistio.io/ingress-use-waypoint=true标签可确保从 ingress gateway 到达的流量会先经过 waypoint proxy,从而在流量到达httpbin服务之前执行在 waypoint 上配置的 L7 策略。 -
通过为 namespace 添加标签,将该 namespace 中的所有服务关联到 waypoint proxy:
-
创建名为
httpbin-gw.yaml的文件,定义一个 KubernetesGateway资源。这会配置 gateway proxy 在端口 80 上接受主机名为httpbin.example.com的 HTTP 流量。- 指定 gateway 的
Service类型;默认值为LoadBalancer。 - 指定客户端在访问该端口上的 mesh 服务时使用的虚拟主机名。
- 指定 gateway 的
-
应用 gateway 配置:
-
创建名为
httpbin-ingress-hr.yaml的文件,为 ingress gateway 定义一个HTTPRoute资源。此资源指定了流量如何从 gateway proxy 路由到httpbin服务。- 将此
HTTPRoute绑定到上一步创建的 KubernetesGateway。 - 将匹配到的流量路由到端口 8000 上的
httpbin服务。
- 将此
-
应用 ingress HTTPRoute:
-
创建名为
httpbin-waypoint-hr.yaml的文件,为 waypoint proxy 定义一个HTTPRoute资源。此资源配置 waypoint 执行的基于路径的路由规则。- 将此
HTTPRoute绑定到httpbin服务。结合istio.io/ingress-use-waypoint=true标签,这会配置由 waypoint proxy 对发往该服务的流量强制执行的 L7 路由规则。 - 将匹配到的流量转发到端口 8000 上的
httpbin服务。
- 将此
-
应用 waypoint HTTPRoute:
NOTE在此配置中,由于服务上设置了
istio.io/ingress-use-waypoint=true标签,来自 ingress gateway 的流量会经过 waypoint proxy。随后,waypointHTTPRoute会在流量到达httpbin服务之前应用基于路径的路由策略。 -
等待 waypoint proxy 就绪:
验证
-
为
curl客户端创建一个 namespace: -
部署
curl客户端: -
为
curlnamespace 添加istio-discovery=enabled标签: -
为
curlnamespace 启用 ambient 模式: -
将
curlpod 的名称存储到变量中: -
从
curl客户端,通过 ingress gatewayService向httpbin应用的/headers端点发送请求。将Hostheader 设置为httpbin.example.com,以匹配 KubernetesGateway和HTTPRoute资源中指定的主机名:响应应返回
HTTP/1.1 200 OK状态,表示请求已成功处理。示例输出
-
向 waypoint
HTTPRoute中没有匹配 URI 前缀的端点发送请求:响应返回
HTTP/1.1 404 Not Found,这是预期行为,因为/get路径在 waypointHTTPRoute中没有定义对应的前缀匹配。示例输出
-
通过将
Service类型更改为默认的LoadBalancer,使 gateway proxy 可从集群外部访问: -
使用 gateway
Service的外部主机名或 IP 地址,验证可以从集群外部访问httpbin服务。根据你的集群环境设置INGRESS_HOST变量。a. 设置
INGRESS_HOST变量:b. 设置
INGRESS_PORT变量:c. 使用 gateway 主机向
httpbin服务发送curl请求:INFO如果
$INGRESS_HOST是 IPv6 地址,在构造 URL 时请将其放在方括号中。例如: -
确认响应包含
HTTP/1.1 200 OK状态,这表示请求成功。示例输出
清理
移除此操作步骤中创建的资源: