Gateway API v1.2:WebSockets、超时、重试及更多

Gateway API logo

Kubernetes SIG Network 很高兴宣布 Gateway API v1.2 正式发布!该 API 版本于 10 月 3 日发布,我们很高兴地报告说,我们现在有许多符合规范的实现供您尝试。

Gateway API v1.2 为标准通道(Gateway API 的 GA 发布通道)带来了一些新功能,引入了一些新的实验性功能,并启动了我们新的发布流程 - 但它也带来了两个需要注意的重大更改。

重大更改

GRPCRoute 和 ReferenceGrant v1alpha2 版本移除

现在 GRPCRoute 和 ReferenceGrant 的 v1 版本已升级到标准版,为了减轻长期支持旧版本给 Gateway API 社区带来的维护负担,旧的 v1alpha2 版本已从标准通道和实验通道中移除。

在升级到 Gateway API v1.2 之前,您需要确认 Gateway API 的所有实现都已升级为支持这些资源的 v1 API 版本,而不是 v1alpha2 API 版本。请注意,即使您在 YAML 清单中使用的是 v1 版本,控制器可能仍然在使用 v1alpha2 版本,这会导致升级期间失败。此外,Kubernetes 本身也会尽力阻止您删除它认为您正在使用的 CRD 版本:请查看发布说明,了解有关如何安全升级的更多信息。

更改 .status.supportedFeatures(实验性)

一个较小的重大更改:Gateway 中的 .status.supportedFeatures 现在是一个对象列表,而不是字符串列表。这些对象有一个 name 字段,因此从字符串的转换很简单,但移动到对象允许未来有更大的灵活性。此节尚未出现在标准通道中。

升级到标准通道

Gateway API 1.2.0 将四个功能升级到标准通道,这意味着它们现在可以被认为是正式发布。包含在标准发布通道中表示对 API 表面的高度信任,并提供向后兼容性的保证。当然,与任何其他 Kubernetes API 一样,标准通道功能可以在未来继续通过向后兼容的添加进行发展,我们当然希望在未来对这些新功能进行进一步的改进和完善。有关所有这些如何工作的更多信息,请参阅 Gateway API 版本控制策略

HTTPRoute 超时

GEP-1742timeouts 节引入到 HTTPRoute 中,允许配置 HTTP 流量的基本超时。这是一个简单但重要的功能,对于处理 HTTP 流量时的适当弹性至关重要,现在已成为标准。

例如,此 HTTPRoute 配置将到 /face 路径的流量超时时间设置为 300 毫秒

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: face-with-timeouts
  namespace: faces
spec:
  parentRefs:
    - name: my-gateway
      kind: Gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /face
    backendRefs:
    - name: face
      port: 80
    timeouts:
      request: 300ms

有关更多信息,请查看 HTTP 路由文档。(请注意,这仅适用于 HTTPRoute 超时。GRPCRoute 超时还不属于 Gateway API。)

Gateway 基础设施标签和注解

Gateway API 的实现负责创建使每个 Gateway 正常工作所需的后端基础设施。例如,在 Kubernetes 集群中运行的实现通常会创建服务和部署,而基于云的实现可能会创建云负载均衡器资源。在许多情况下,能够将标签或注解传播到这些生成的资源可能会很有帮助。

在 v1.2.0 中,Gateway 的 infrastructure 节移动到标准通道,允许您为 Gateway API 控制器创建的基础设施指定标签和注解。例如,如果您的 Gateway 基础设施在集群中运行,您可以使用以下 Gateway 配置指定 Linkerd 和 Istio 注入,从而使基础设施更容易集成到您安装的任何服务网格中

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: meshed-gateway
  namespace: incoming
spec:
  gatewayClassName: meshed-gateway-class
  listeners:
  - name: http-listener
    protocol: HTTP
    port: 80
  infrastructure:
    labels:
      istio-injection: enabled
    annotations:
      linkerd.io/inject: enabled

有关更多信息,请查看 infrastructure API 参考

后端协议支持

自 Kubernetes v1.20 以来,Service 和 EndpointSlice 资源支持稳定的 appProtocol 字段,允许用户指定 Service 支持的 L7 协议。随着 KEP 3726 的采用,Kubernetes 现在支持三个新的 appProtocol

kubernetes.io/h2c
RFC7540 中描述的基于明文的 HTTP/2:RFC7540
kubernetes.io/ws
RFC6445 中描述的基于明文的 WebSocket:RFC6445
kubernetes.io/wss
RFC6445 中描述的基于 TLS 的 WebSocket:RFC6445

使用 Gateway API 1.2.0,现在支持遵守 appProtocol 成为标准。例如,给定以下 Service

apiVersion: v1
kind: Service
metadata:
  name: websocket-service
  namespace: my-namespace
spec:
  selector:
    app.kubernetes.io/name: websocket-app
  ports:
    - name: http
      port: 80
      targetPort: 9376
      protocol: TCP
      appProtocol: kubernetes.io/ws

然后,包含此 Service 作为 backendRef 的 HTTPRoute 将自动升级连接以使用 WebSockets,而不是假设连接是纯 HTTP。

有关更多信息,请查看 GEP-1911

实验通道中的新增加项

*Route 资源命名规则

现在可以命名 HTTPRoute 和 GRPCRoute 资源中的 rules 字段,以便更容易引用特定的规则,例如

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: multi-color-route
  namespace: faces
spec:
  parentRefs:
    - name: my-gateway
      kind: Gateway
      port: 80
  rules:
  - name: center-rule
    matches:
    - path:
        type: PathPrefix
        value: /color/center
    backendRefs:
    - name: color-center
      port: 80
  - name: edge-rule
    matches:
    - path:
        type: PathPrefix
        value: /color/edge
    backendRefs:
    - name: color-edge
      port: 80

现在,日志或状态消息可以将这两个规则称为 center-ruleedge-rule,而不是被迫按索引引用它们。有关更多信息,请参阅 GEP-995

HTTPRoute 重试支持

Gateway API 1.2.0 引入了对计数 HTTPRoute 重试的实验性支持。例如,以下 HTTPRoute 配置在重试之间延迟 500 毫秒的情况下,将对 /face 路径的请求重试最多 3 次

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: face-with-retries
  namespace: faces
spec:
  parentRefs:
    - name: my-gateway
      kind: Gateway
      port: 80
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /face
    backendRefs:
    - name: face
      port: 80
    retry:
      codes: [ 500, 502, 503, 504 ]
      attempts: 3
      backoff: 500ms

有关更多信息,请查看 GEP 1731

基于百分比的 HTTPRoute 镜像

Gateway API 长期以来一直支持请求镜像功能,该功能允许将相同的请求发送到多个后端。在 Gateway API 1.2.0 中,我们引入了基于百分比的镜像,允许您指定镜像到不同后端的请求百分比。例如,以下 HTTPRoute 配置将 42% 的请求镜像到 color-mirror 后端

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: color-mirror-route
  namespace: faces
spec:
  parentRefs:
  - name: mirror-gateway
  hostnames:
  - mirror.example
  rules:
  - backendRefs:
    - name: color
      port: 80
    filters:
    - type: RequestMirror
      requestMirror:
        backendRef:
          name: color-mirror
          port: 80
        percent: 42   # This value must be an integer.

还有一个 fraction 节,可以用来代替 percent,以便更精确地控制镜像的流量数量,例如

    ...
    filters:
    - type: RequestMirror
      requestMirror:
        backendRef:
          name: color-mirror
          port: 80
        fraction:
          numerator: 1
          denominator: 10000

此配置将 10,000 个请求中的 1 个镜像到 color-mirror 后端,这可能与非常高的请求率有关。有关更多详细信息,请参阅 GEP-1731

其他后端 TLS 配置

此版本包括与 Gateway 和工作负载(后端)之间的通信相关的 TLS 配置的三项添加

  1. Gateway 上的新 backendTLS 字段

    这个新字段允许您指定 Gateway 在连接到后端时应使用的客户端证书。

  2. BackendTLSPolicy 上的新 subjectAltNames 字段

    以前,hostname 字段用于配置 Gateway 应发送到后端的 SNI 证书应提供的身份。当指定新的 subjectAltNames 字段时,任何匹配至少一个指定 SAN 的证书都将被视为有效。这对于 SPIFFE 尤其重要,其中基于 URI 的 SAN 可能不是有效的 SNI。

  3. BackendTLSPolicy 上的新 options 字段

    与 Gateway 监听器上的 TLS 选项字段类似,我们认为相同的概念对于后端 TLS 的 TLS 特定配置也具有广泛的用途。

有关更多信息,请查看 GEP-3135

更多更改

有关此版本中包含的更改的完整列表,请参阅 v1.2.0 发布说明

项目更新

除了技术方面,v1.2 版本还标志着 Gateway API 项目本身生命周期中的几个里程碑。

发布流程改进

Gateway API 从未打算成为一个静态 API,随着越来越多的项目将其用作构建的基础组件,我们清楚地意识到我们需要为 Gateway API 发布带来更多的可预测性。为此,我们很高兴 - 也有些紧张!- 地宣布我们已经正式确定了一个新的发布流程

  • 范围界定(4-6周):维护者和社区确定我们希望包含在发布版本中的功能集。这里的重点是将功能移出实验频道——理想情况下,这包括将它们移至标准频道,但也可能意味着删除它们。

  • GEP 迭代和审查(5-7周):贡献者为被接受进入发布版本的功能编写或更新网关增强提案(GEP),重点是就该功能的设计和毕业标准达成共识。

  • API 改进和文档(3-5周):贡献者在网关 API 控制器中实现这些功能,并编写必要的文档。

  • SIG 网络审查和发布候选版本(2-4周):维护者获得所需的上游审查,构建发布候选版本,并发布新版本。

网关 API 1.2.0 是使用新流程的第一个版本,虽然新事物总会有一些粗糙的地方,但我们相信它进展顺利。我们已经完成了网关 API 1.3 的范围界定阶段,预计将在 2025 年 1 月底左右发布。

gwctl 移出

gwctl CLI 工具已移至其自身的存储库:https://github.com/kubernetes-sigs/gwctlgwctl 已被证明是网关 API 社区的宝贵工具;我们相信,将其移至其自身的存储库将使其更易于维护和开发。和往常一样,我们欢迎贡献;虽然仍处于实验阶段,但 gwctl 已经帮助简化了网关 API 的使用——尤其是对于该项目的新手!

维护者变更

为了完善我们对项目本身的更改,我们很高兴地宣布 Mattia Lavacca 加入了网关 API 维护者的行列!我们也很遗憾地宣布 Keith Mattix 已卸任 GAMMA 负责人——令人高兴的是,Mike Morris 已重返该职位。我们感谢 Keith 所做的一切,并很高兴 Mattia 和 Mike 的加入。

尝试一下

与其他 Kubernetes API 不同,您无需升级到最新版本的 Kubernetes 即可获得最新版本的网关 API。只要您运行的是 Kubernetes 1.26 或更高版本,您就可以开始使用此版本的网关 API。

要试用该 API,请按照我们的入门指南进行操作。在撰写本文时,已有五个实现符合网关 API v1.2 标准。按字母顺序排列

参与其中

有很多机会参与并帮助定义 Kubernetes 路由 API 的未来,无论是在入口还是服务网格方面。

维护者要感谢所有为网关 API 做出贡献的人,无论是提交到存储库的提交、讨论、想法还是总体支持。如果没有这个敬业且活跃的社区的支持,我们绝不可能走到今天。