Skip to main content
Glama
gatewayapi.md12.4 kB
在 **Kubernetes Gateway API** 资源类型体系, 官方标准定义的主要有: | 类型 | 简介 | 说明 | | :------------- | :------------------------------------- | :-------------------------------------------------- | | `HTTPRoute` | HTTP 路由(最常用) | 匹配 HTTP 方法、路径、Header、Cookie 等,转发到后端 | | `TCPRoute` | TCP 层的路由 | 直接基于 TCP 连接做转发(不解包内容) | | `UDPRoute` | UDP 层的路由 | 适配 UDP 协议流量,比如 DNS、QUIC 等 | | `TLSRoute` | 基于 TLS SNI 的路由 | 根据 TLS 握手时的 SNI 字段转发 | | `GRPCRoute` | gRPC 专用路由 | 适配 gRPC 方法/服务名的路由转发 | | `Gateway` | 网关本身资源(类似 IngressController) | 定义 Listener、地址绑定、证书配置等 | | `GatewayClass` | 网关类(网关模板) | 定义网关的实现,比如 Envoy Gateway、Istio Gateway | --- ### 总结一下各个资源定位 - `GatewayClass` —— 定义网关的**类型模板** - `Gateway` —— 定义一个**具体网关**(绑定 Listener 端口、证书、地址) - `XXXRoute`(HTTPRoute/TCPRoute/UDPRoute/TLSRoute/GRPCRoute)—— **定义流量路由规则**,每种 Route 适配不同的流量协议。 --- ### 简单画个概念结构图: ``` GatewayClass ↓ Gateway ↓ { HTTPRoute / TCPRoute / UDPRoute / TLSRoute / GRPCRoute } ``` --- ### 小提示 - **HTTPRoute** 是最常用的,几乎所有 web 流量都可以用它。 - **GRPCRoute** 是专门优化过 gRPC 语义的(可以按 gRPC 方法名匹配,不只是路径)。 - **TCPRoute/UDPRoute** 比较偏底层协议转发。 - **TLSRoute** 主要用在 L4 负载均衡(通过 TLS 的 SNI 路由)。 --- 好的,继续! 接下来我会整理 **Kubernetes Gateway API** 中各个 **Route 类型**(如 `HTTPRoute`、`TCPRoute`、`UDPRoute` 等)的字段结构和定义。这样你就能看到它们的异同,知道每种类型具体能做什么。 --- ### **1. HTTPRoute** 用于 HTTP 协议的路由,最常用,支持路径、方法、头部、Cookie 等条件。 #### 主要字段: ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute spec: parentRefs: # 绑定到一个网关上,必须指定。 - name: example-gateway rules: # 匹配条件规则 - matches: # 路由匹配条件 - path: { type: PathPrefix, value: "/foo" } backendRefs: # 目标后端服务 - name: backend port: 8080 ``` #### 说明: - **parentRefs**:指明将该 HTTPRoute 绑定到哪个 Gateway。 - **matches**:可以根据 HTTP 方法、路径、Header、Cookie 等进行流量匹配。 - **backendRefs**:指定流量匹配后将请求转发到哪个后端服务(例如,服务名和端口)。 --- ### **2. TCPRoute** 用于 **TCP 协议**,主要基于 IP 和端口进行转发,没有 HTTP 的层次性(例如路径匹配)。 #### 主要字段: ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: TCPRoute spec: parentRefs: - name: example-gateway rules: - matches: # 匹配条件 - destinationPort: 3306 backendRefs: # 后端服务 - name: mysql-backend port: 3306 ``` #### 说明: - **destinationPort**:基于目的端口来匹配流量,适合 TCP 协议(比如数据库)。 - **backendRefs**:后端服务,指定目标服务。 --- ### **3. UDPRoute** 用于 **UDP 协议**,与 TCPRoute 类似,但针对 UDP 流量。 #### 主要字段: ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: UDPRoute spec: parentRefs: - name: example-gateway rules: - matches: - destinationPort: 53 backendRefs: - name: dns-service port: 53 ``` #### 说明: - **destinationPort**:指定 UDP 数据包目标端口(例如 DNS 服务使用 53 端口)。 - **backendRefs**:指定目标服务。 --- ### **4. TLSRoute** 用于 **TLS 协议**,根据 TLS 握手中的 SNI (Server Name Indication) 字段来路由流量,适用于 HTTPS 或其它基于 TLS 的服务。 #### 主要字段: ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: TLSRoute spec: parentRefs: - name: example-gateway rules: - matches: - sniHosts: [ "example.com" ] backendRefs: - name: backend-service port: 443 ``` #### 说明: - **sniHosts**:基于 TLS 握手中的 SNI 字段进行流量匹配。 - **backendRefs**:将符合条件的流量转发到指定后端服务。 --- ### **5. GRPCRoute** 用于 **gRPC 协议**,专门匹配 gRPC 的方法和服务名。 #### 主要字段: ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: GRPCRoute spec: parentRefs: - name: example-gateway rules: - matches: - service: "example.GreeterService" - method: "SayHello" backendRefs: - name: greeter-service port: 50051 ``` #### 说明: - **service** 和 **method**:基于 gRPC 服务名和方法名来匹配流量。 - **backendRefs**:将匹配到的 gRPC 请求转发到后端服务。 --- ### **字段对比总结:** | 字段 | `HTTPRoute` | `TCPRoute` | `UDPRoute` | `TLSRoute` | `GRPCRoute` | | ----------------- | -------------------------- | ------------ | ------------ | ------------ | -------------- | | `parentRefs` | 是 | 是 | 是 | 是 | 是 | | `matches` | 路径、方法、Header、Cookie | 端口 | 端口 | SNI(域名) | 服务名、方法名 | | `backendRefs` | 服务名、端口、权重 | 服务名、端口 | 服务名、端口 | 服务名、端口 | 服务名、端口 | | `destinationPort` | 否 | 是 | 是 | 否 | 否 | | `sniHosts` | 否 | 否 | 否 | 是 | 否 | | `service` | 否 | 否 | 否 | 否 | 是 | | `method` | 否 | 否 | 否 | 否 | 是 | --- ### 小总结: 1. **HTTPRoute**: 最常用,适用于 Web 请求,支持路径、方法、头、cookie 等多种匹配。 2. **TCPRoute/UDPRoute**: 适用于底层协议的转发(比如数据库、DNS),主要基于端口匹配。 3. **TLSRoute**: 适用于 TLS 流量路由,基于 SNI 匹配。 4. **GRPCRoute**: 专门针对 gRPC 流量,可以基于服务名和方法名进行匹配。 --- 好的,接下来我将继续深入分析 **`Gateway API`** 中 **`Route`** 类型的更多细节,特别是如何配置 **`backendRefs`**、**权重控制**、**分配策略** 等,以便让你更全面地理解如何配置每种路由。 --- ### **`backendRefs` 的详细配置:** `backendRefs` 是所有类型的 `Route`(例如 `HTTPRoute`、`TCPRoute`、`UDPRoute` 等)中都会使用的字段,用来定义流量应该转发到哪个后端服务。 #### 1. **`name`**: - **描述**:指定后端服务的名称。 - **示例**: ```yaml backendRefs: - name: my-service ``` #### 2. **`port`**: - **描述**:指定后端服务的端口。如果没有设置,默认会使用服务的 `port` 字段。 - **示例**: ```yaml backendRefs: - name: my-service port: 8080 ``` #### 3. **`weight`**: - **描述**:表示负载均衡的权重,控制流量的分配比例。权重越大,分配到该后端的流量比例越大。 - **示例**: ```yaml backendRefs: - name: my-service port: 8080 weight: 80 # 80% 的流量会被分配到这个服务 - name: another-service port: 8080 weight: 20 # 20% 的流量会被分配到这个服务 ``` #### 4. **`filter`**: - **描述**:通过 `filter` 字段,可以为后端服务应用一些自定义的流量处理策略,例如请求重定向、修改请求头等。 - **示例**: ```yaml backendRefs: - name: my-service port: 8080 filter: type: RequestHeader header: "X-Request-Id" ``` --- ### **流量分配策略:** `Gateway API` 支持使用 **权重** 来进行流量的负载均衡控制。如果你有多个后端服务,你可以为每个后端设置一个权重,流量会根据权重比例进行分配。通过这种方式,你可以灵活地控制流量的分布。 #### 示例:配置多后端服务,进行流量权重分配: ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute spec: parentRefs: - name: example-gateway rules: - matches: - path: type: PathPrefix value: "/api" backendRefs: - name: service-v1 port: 8080 weight: 70 # 70% 流量分配给 service-v1 - name: service-v2 port: 8081 weight: 30 # 30% 流量分配给 service-v2 ``` #### 说明: - **`service-v1`** 将接收 70% 的流量。 - **`service-v2`** 将接收 30% 的流量。 ### **多后端服务的流量分配**: - 如果多个后端的 **`weight`** 总和为 100,系统会根据这个比例来分配流量。 - 如果没有指定 `weight`,默认情况下系统会平衡流量,默认 `weight = 1`。 --- ### **`Path` 和 `Matches` 的使用:** 在每种 `Route` 类型中,都有一个 **`matches`** 字段,这个字段用于定义流量的匹配条件(例如路径、端口等)。你可以根据不同条件来匹配流量并转发到不同的后端。 #### 1. **`Path` 匹配**: 在 **`HTTPRoute`** 和 **`TCPRoute`** 等中,`path` 用来匹配请求的路径。 - `type`:可以是 `PathPrefix`(前缀匹配)或 `Exact`(精确匹配)。 - `value`:匹配的路径。 #### 示例:匹配路径 `/foo` 并转发到 `service-v1`: ```yaml matches: - path: type: PathPrefix value: "/foo" ``` #### 2. **`Header` 和 `Cookie` 匹配**: 你可以通过设置 `header` 和 `cookie` 来匹配 HTTP 请求头或 cookie 值。 ```yaml matches: - headers: - name: "X-Request-Id" value: "12345" ``` #### 3. **`SNI` 匹配**(适用于 `TLSRoute`): 在 **`TLSRoute`** 中,你可以根据 **SNI(Server Name Indication)** 字段来路由流量。 ```yaml matches: - sniHosts: [ "example.com", "another.com" ] ``` #### 4. **`Service` 和 `Method` 匹配**(适用于 `GRPCRoute`): 在 **`GRPCRoute`** 中,流量可以根据 gRPC 的服务名和方法名进行匹配。 ```yaml matches: - service: "example.GreeterService" method: "SayHello" ``` --- ### **综合示例:完整的 `HTTPRoute` 配置** ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute spec: parentRefs: - name: example-gateway rules: - matches: - path: type: PathPrefix value: "/api" - headers: - name: "User-Agent" value: "mobile" backendRefs: - name: backend-v1 port: 8080 weight: 70 - name: backend-v2 port: 8081 weight: 30 ``` #### 说明: - 匹配路径为 `/api` 且 `User-Agent` 为 `mobile` 的流量。 - 将流量按照权重(70% 到 `backend-v1`,30% 到 `backend-v2`)分发。 --- ### **总结:** - `Route` 类型(如 `HTTPRoute`、`TCPRoute`、`UDPRoute`、`TLSRoute`、`GRPCRoute`)都支持类似的路由匹配结构。 - **`backendRefs`** 支持为每个后端服务设置权重,控制流量分配。 - **`matches`** 提供了灵活的匹配方式,可以根据路径、HTTP 头部、SNI 或 gRPC 方法来匹配流量。 - 可以使用多种条件(如路径、头部、权重等)组合来精确控制流量的路由。 --- 希望这能帮助你更好地理解和使用 Kubernetes 的 Gateway API。🚀

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/weibaohui/k8m'

If you have feedback or need assistance with the MCP directory API, please join our Discord server