在 sidecar 模式下通过 Kubernetes Gateway API 暴露服务
您可以使用 Kubernetes Gateway API 创建 Gateway 和 HTTPRoute 资源来部署网关。这些资源会配置网关,使网格内部的服务能够被来自外部的流量访问。随后,您可以将网关的 Service 更改为 LoadBalancer,以将其暴露给来自集群外部的流量。
前提条件
- 已安装 Alauda Service Mesh v2 Operator。
- 已部署 Istio 控制平面。
- 确认 Linux kernel 兼容性。
- 您的 Kubernetes 集群支持外部负载均衡器(即,类型为
LoadBalancer的 Service)。
操作步骤
-
使用以下命令创建名为
httpbin的新命名空间: -
使用以下命令部署
httpbin示例服务: -
创建一个名为
httpbin-k8s-gw.yaml的文件,其中定义一个 KubernetesGateway资源。此文件将配置网关代理,为httpbin.example.com主机暴露 80 端口(HTTP)。自动部署默认情况下,每个
Gateway都会自动创建一个Service和Deployment。这些资源的名称将为<Gateway name>-<GatewayClass name>(istio-waypointGatewayClass除外,它不会附加后缀)。如果Gateway发生变更(例如添加了新端口),这些配置也会自动更新。示例 gateway 资源文件
- 指定网关的
Service类型;默认为LoadBalancer。 - 指定 Istio 修订版本名称;默认为
default。 - 指定网关名称。
- 指定网关的命名空间。
- 指定客户端在通过此端口访问网格服务时使用的虚拟主机名。
- 指定网关的
-
使用以下命令应用 YAML 文件:
-
创建一个名为
httpbin-hr.yaml的 YAML 文件,其中定义一个HTTPRoute资源。该资源指定从网关代理到httpbinService 的流量路由规则。示例 HTTPRoute 文件
- 通过将网关名称添加到 gateways 列表,将
HTTPROUTE资源关联到前面创建的 KubernetesGateway。 - 通过定义一个
backendRefs条目将匹配的流量定向到httpbinService,该条目包含httpbinService的名称和端口。
- 通过将网关名称添加到 gateways 列表,将
-
执行以下命令应用 YAML 文件:
-
运行以下命令,确认 Gateway API 服务已就绪并已分配地址:
-
可选:将网关部署到 基础设施节点:
单击展开
前提条件Alauda Container Platform 4.2.0 或更高版本,或者将 Gateway API CRD 升级到最新版本。
a. 在您计划部署 Gateway 的相同命名空间中创建一个名为
asm-kube-gateway-options的 ConfigMap:- 指定 ConfigMap 的名称。
- 指定与网关相同的 ConfigMap 命名空间。
- 设置 node selector 和 tolerations,使网关 Pod 调度到基础设施节点上。
b. 通过添加
infrastructure.parametersRef字段,在 Gateway 资源中引用该 ConfigMap:- 指定网关名称。
- 指定网关命名空间。
验证
-
使用以下命令创建用于
curl客户端的命名空间: -
使用下面的命令部署
curl客户端: -
使用以下命令,将
CURL_POD变量设置为curlPod 的名称: -
从
curl客户端,通过 ingress gatewayService向httpbin应用的/headers端点发送请求。将Host标头设置为httpbin.example.com,以匹配 KubernetesGateway和HTTPROUTE资源中指定的主机。运行以下curl命令:响应应显示
200 OKHTTP 状态,表示请求成功。示例输出
-
运行以下命令,向
httpbinHTTPROUTE中没有匹配的统一资源标识符(URI)前缀的端点发送curl请求:响应将返回
404 Not Found状态。这是预期结果,因为/get端点没有在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状态,这表明请求成功。
清理
删除在此操作步骤中创建的资源: