通过 Kubernetes Gateway API 在 ambient 模式下暴露服务
在 Istio ambient 模式下,Kubernetes Gateway API 是配置入口流量路由的推荐方式。你可以创建 Gateway 和 HTTPRoute 资源来部署一个 gateway,使 mesh 内部服务能够被外部流量访问。
用于 Layer 7 路由的 waypoint 代理
要强制执行 Layer 7(L7)路由策略——包括基于路径的路由和 header 匹配——请在包含目标服务的 namespace 中部署 waypoint 代理。waypoint 代理负责处理 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 代理。此Gateway资源使用istio-waypointgateway class 来处理该 namespace 中服务的 L7 流量。istio.io/waypoint-for: service标签表示该 waypoint 处理的是服务流量。标签值决定其处理的流量类型。详情请参见 Waypoint traffic types(Istio 文档)。- 指定
istio-waypointgateway class,它会部署 waypoint 代理,而不是标准的 ingress gateway。
-
应用 waypoint 代理配置:
-
为
httpbin服务添加标签,使入口流量通过 waypoint 代理进行转发:NOTEistio.io/ingress-use-waypoint=true标签可确保来自 ingress gateway 的流量会经过 waypoint 代理,从而在流量到达httpbin服务之前,先执行配置在 waypoint 上的 L7 策略。 -
通过为 namespace 添加标签,将该 namespace 中的所有服务关联到 waypoint 代理:
-
创建一个名为
httpbin-gw.yaml的文件,用于定义 KubernetesGateway资源。该配置会让 gateway 代理在 80 端口接受主机名为httpbin.example.com的 HTTP 流量。- 指定 gateway 的
Service类型;默认值为LoadBalancer。 - 指定客户端访问该端口上的 mesh 服务时使用的虚拟主机名。
- 指定 gateway 的
-
应用 gateway 配置:
-
创建一个名为
httpbin-ingress-hr.yaml的文件,用于定义 ingress gateway 的HTTPRoute资源。该资源指定流量如何从 gateway 代理路由到httpbin服务。- 将此
HTTPRoute绑定到上一步创建的 KubernetesGateway。 - 将匹配的流量路由到 8000 端口上的
httpbin服务。
- 将此
-
应用 ingress HTTPRoute:
-
创建一个名为
httpbin-waypoint-hr.yaml的文件,用于定义 waypoint 代理的HTTPRoute资源。该资源配置 waypoint 所执行的基于路径的路由规则。- 将此
HTTPRoute绑定到httpbin服务。结合istio.io/ingress-use-waypoint=true标签,这会为目标服务的流量配置由 waypoint 代理执行的 L7 路由规则。 - 将匹配的流量转发到 8000 端口上的
httpbin服务。
- 将此
-
应用 waypoint HTTPRoute:
NOTE在此配置中,由于服务上设置了
istio.io/ingress-use-waypoint=true标签,来自 ingress gateway 的流量会经过 waypoint 代理。随后,waypointHTTPRoute会在流量到达httpbin服务之前应用基于路径的路由策略。 -
等待 waypoint 代理就绪:
-
可选:将 gateway 部署到 基础设施节点:
单击展开
前提条件Alauda Container Platform 4.2.0 或更高版本,或者将 Gateway API CRDs 升级到最新版本。
a. 在计划部署 Gateway 的同一 namespace 中创建一个名为
asm-kube-gateway-options的 ConfigMap:- 指定 configmap 的名称。
- 指定 configmap 的 namespace 与 gateway 相同。
- 设置 node selector 和 toleration,以便将 gateway pods 调度到基础设施节点上。
b. 通过添加
infrastructure.parametersRef字段,在 Gateway 资源中引用该 ConfigMap:- 指定 gateway 的名称。
- 指定 gateway 的 namespace。
验证
-
为
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 代理能够接收来自集群外部的流量: -
使用 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状态,这表示请求成功。示例输出
清理
删除在此操作步骤中创建的资源: