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