通过 Kubernetes Gateway API 暴露服务
您可以使用 Kubernetes Gateway API 创建 Gateway 和 HTTPRoute 资源来部署网关。这些资源配置网关,使网格内的服务可以被外部流量访问。然后,您可以将网关的 Service 类型更改为 LoadBalancer,以便将其暴露给集群外部的流量。
前提条件
- 已安装 Alauda Service Mesh v2 Operator。
- 已部署 Istio 控制平面。
- 请确认Linux 内核兼容性。
操作步骤
-
使用以下命令创建一个名为
httpbin的新命名空间: -
使用以下命令部署
httpbin示例服务: -
创建一个名为
httpbin-k8s-gw.yaml的文件,定义一个 KubernetesGateway资源。该资源将配置网关代理,暴露端口 80(HTTP)供httpbin.example.com主机使用。自动部署默认情况下,每个
Gateway会自动创建一个Service和Deployment。它们的名称格式为<Gateway 名称>-<GatewayClass 名称>(istio-waypointGatewayClass除外,该类不添加后缀)。如果Gateway发生更改(例如添加新端口),这些配置会自动更新。示例网关资源文件
- 指定网关的
Service类型;默认为LoadBalancer。 - 指定 Istio 版本名称;默认为
default。 - 指定网关名称。
- 指定网关所在命名空间。
- 指定客户端访问该端口时使用的虚拟主机名。
- 指定网关的
-
使用以下命令应用该 YAML 文件:
-
创建一个名为
httpbin-hr.yaml的 YAML 文件,定义一个HTTPRoute资源。该资源指定从网关代理到httpbin服务的流量路由规则。示例 HTTPRoute 文件
- 通过将网关名称添加到网关列表,将
HTTPRoute资源关联到之前创建的 KubernetesGateway。 - 通过定义包含
httpbin服务名称和端口的backendRefs条目,将匹配的流量定向到httpbin服务。
- 通过将网关名称添加到网关列表,将
-
使用以下命令应用该 YAML 文件:
-
运行以下命令,确认 Gateway API 服务已准备就绪并分配了地址:
-
可选:将网关部署到 Infra Nodes:
点击展开
前提条件Alauda Container Platform 4.2.0 或更高版本,或将 Gateway API CRDs 升级到最新版本。
a. 在计划部署 Gateway 的同一命名空间中创建名为
asm-kube-gateway-options的 ConfigMap:- 指定 ConfigMap 名称。
- 指定 ConfigMap 命名空间,与网关相同。
- 设置节点选择器和容忍度,将网关 Pod 调度到 Infra 节点。
b. 在 Gateway 资源中通过添加
infrastructure.parametersRef字段引用该 ConfigMap:- 指定网关名称。
- 指定网关命名空间。
验证
-
通过执行以下命令为
curl客户端创建一个命名空间: -
使用以下命令部署一个
curl客户端: -
使用以下命令将
curlPod 的名称设置为变量CURL_POD: -
从
curl客户端发送请求到httpbin应用的/headers端点,访问入口网关的Service。将Host头设置为httpbin.example.com,以匹配 KubernetesGateway和HTTPROUTE资源中指定的主机。运行以下curl命令:响应应显示
200 OKHTTP 状态,表示请求成功。示例输出
-
发送一个请求到
httpbinHTTPROUTE中没有匹配 URI 前缀的端点,运行以下命令:响应将是
404 Not Found状态。这是预期行为,因为/get端点在httpbinHTTPROUTE资源中没有定义匹配的 URI 前缀。示例输出
-
通过将其
Service类型设置为默认的LoadBalancer,将网关代理暴露给外部流量。运行以下命令: -
使用网关
Service的外部主机名或 IP 地址,验证httpbin服务是否可从集群外访问。确保根据集群环境正确设置INGRESS_HOST变量。a. 运行以下命令设置
INGRESS_HOST变量:b. 运行以下命令设置
INGRESS_PORT变量:c. 使用网关主机,运行以下命令发送
curl请求到httpbin服务:INFO如果
$INGRESS_HOST是 IPv6 地址,构造 URL 时请用方括号括起来。例如: -
验证响应显示
HTTP/1.1 200 OK状态,确认请求成功。