Gateway API v1.2:WebSockets、超时、重试等
Kubernetes SIG Network 很高兴地宣布 Gateway API v1.2 正式发布!该版本的 API 于 10 月 3 日发布,我们很高兴地报告,现在我们已经有许多符合规范的实现供大家试用。
Gateway API v1.2 为 Standard channel(Gateway API 的 GA 发布渠道)带来了许多新功能,引入了一些新的实验性功能,并开启了我们新的发布流程——但它也带来了两个你需要注意的重大变更。
重大变更
移除 GRPCRoute 和 ReferenceGrant 的 v1alpha2 版本
既然 GRPCRoute 和 ReferenceGrant 的 v1 版本已经毕业到 Standard 级别,旧的 v1alpha2 版本已从 Standard 和 Experimental 渠道中移除,以减轻 Gateway API 社区因永久支持旧版本而产生的维护负担。
在升级到 Gateway API v1.2 之前,你需要确认所有 Gateway API 的实现都已升级,以支持这些资源的 v1 API 版本,而不是 v1alpha2 API 版本。请注意,即使你一直在 YAML 清单中使用 v1,控制器可能仍在使用 v1alpha2,这会导致它在升级过程中失败。此外,Kubernetes 本身会尽力阻止你移除它认为你正在使用的 CRD 版本:请查阅发布说明以获取有关安全升级所需操作的更多信息。
.status.supportedFeatures 变更(实验性)
一个较小的重大变更:Gateway 中的 .status.supportedFeatures 现在是一个对象列表,而不是字符串列表。这些对象有一个名为 name 的字段,因此从字符串转换过来很简单,但迁移到对象为未来提供了更大的灵活性。这个字段尚未出现在 Standard 渠道中。
毕业到 Standard 渠道的功能
Gateway API 1.2.0 将四个功能毕业到 Standard 渠道,这意味着它们现在可以被视为正式可用。被纳入 Standard 发布渠道表明了对 API 接口的高度信心,并提供了向后兼容性的保证。当然,与任何其他 Kubernetes API 一样,Standard 渠道的功能可以随着时间的推移,通过向后兼容的增加而继续演进,我们当然期望未来对这些新功能进行进一步的完善和改进。有关这一切如何运作的更多信息,请参阅 Gateway API 版本控制策略。
HTTPRoute 超时
GEP-1742 在 HTTPRoute 中引入了 timeouts 字段,允许为 HTTP 流量配置基本超时。这是在处理 HTTP 流量时实现适当弹性的一个简单但重要的功能,现在它已成为 Standard 功能。
例如,此 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 集群中运行的实现通常会创建 Service 和 Deployment,而基于云的实现可能会创建云负载均衡器资源。在许多情况下,能够将标签或注解传播到这些生成的资源会很有帮助。
在 v1.2.0 中,Gateway 的 infrastructure 字段移至 Standard 渠道,允许你为 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
kubernetes.io/ws- 如 RFC6445 中所述的明文 WebSocket
kubernetes.io/wss- 如 RFC6445 中所述的 TLS WebSocket
在 Gateway API 1.2.0 中,对 appProtocol 的支持现已成为 Standard 功能。例如,给定以下 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 将自动升级连接以使用 WebSocket,而不是假定连接是纯 HTTP。
更多信息,请查阅 GEP-1911。
Experimental 渠道新增功能
为 *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-rule 或 edge-rule,而不必通过索引来引用它们。更多信息,请参见 GEP-995。
HTTPRoute 重试支持
Gateway API 1.2.0 引入了对 HTTPRoute 计次重试的实验性支持。例如,以下 HTTPRoute 配置对到 /face 路径的请求重试最多 3 次,每次重试之间有 500 毫秒的延迟
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 配置相关的补充
Gateway 上新增
backendTLS字段这个新字段允许你指定 Gateway 连接到后端时应使用的客户端证书。
BackendTLSPolicy 上新增
subjectAltNames字段以前,
hostname字段用于配置 Gateway 应发送给后端的 SNI 以及 证书应提供的身份。当指定新的subjectAltNames字段时,任何匹配至少一个指定 SANs 的证书都将被视为有效。这对于 SPIFFE 尤其关键,因为基于 URI 的 SANs 可能不是有效的 SNI。BackendTLSPolicy 上新增
options字段与 Gateway Listener 上的 TLS 选项字段类似,我们相信同样的概念将广泛适用于后端的 TLS 特定配置。
更多信息,请查阅 GEP-3135。
更多变更
有关此版本中包含的变更的完整列表,请参阅 v1.2.0 发布说明。
项目更新
除了技术层面,v1.2 版本也标志着 Gateway API 项目本身发展过程中的几个里程碑。
发布流程改进
Gateway API 从未打算成为一个静态 API,随着越来越多的项目将其用作构建基础,我们显然需要为 Gateway API 的发布带来更多的可预测性。为此,我们很高兴——也有些紧张!——地宣布,我们已经正式确定了一个新的发布流程
范围确定(4-6 周):维护者和社区确定我们希望在版本中包含的功能集。这里的一个特别重点是将功能从 Experimental 渠道中“移出”——理想情况下是将其移至 Standard,但也可能意味着移除它们。
GEP 迭代与审查(5-7 周):贡献者为被接纳到版本中的功能编写或更新 Gateway 增强提案(GEP),重点是围绕功能的设计和毕业标准达成共识。
API 完善与文档编写(3-5 周):贡献者在 Gateway API 控制器中实现功能并编写必要的文档。
SIG Network 审查与发布候选版本(2-4 周):维护者获得所需的上游审查,构建发布候选版本,并发布新版本。
Gateway API 1.2.0 是第一个使用新流程的发布版本,尽管任何新事物都有其常见的粗糙之处,但我们相信它进行得很顺利。我们已经完成了 Gateway API 1.3 的范围确定阶段,预计发布时间在 2025 年 1 月底左右。
gwctl 移出
gwctl CLI 工具已移至其自己的仓库:https://github.com/kubernetes-sigs/gwctl。gwctl 已被证明是 Gateway API 社区的一个宝贵工具;我们相信,将其移至自己的仓库将使其更易于维护和开发。一如既往,我们欢迎贡献;虽然仍处于实验阶段,但 gwctl 已经帮助使与 Gateway API 的协作变得更容易一些——特别是对于项目的新手来说!
维护者变更
作为对项目本身变更的补充,我们很高兴地宣布 Mattia Lavacca 已加入 Gateway API 维护者行列!我们也很遗憾地宣布 Keith Mattix 已卸任 GAMMA 负责人——令人高兴的是,Mike Morris 已重返该职位。我们感谢 Keith 所做的一切,并对 Mattia 和 Mike 的加入感到兴奋。
立即试用
与其他 Kubernetes API 不同,你无需升级到最新版本的 Kubernetes 即可获得最新版本的 Gateway API。只要你运行的是 Kubernetes 1.26 或更高版本,你就能使用此版本的 Gateway API。
要试用该 API,请遵循我们的入门指南。截至本文撰写时,已有五个实现符合 Gateway API v1.2 的规范。按字母顺序排列
- Cilium v1.17.0-pre.1,Experimental 渠道
- Envoy Gateway v1.2.0-rc.1,Experimental 渠道
- Istio v1.24.0-alpha.0,Experimental 渠道
- Kong v3.2.0-244-gea4944bb0,Experimental 渠道
- Traefik v3.2,Experimental 渠道
参与其中
有很多机会可以参与进来,帮助定义 Kubernetes 路由 API 在入口和服务网格方面的未来。
- 查看用户指南,了解可以解决哪些用例。
- 试用现有的 Gateway 控制器之一。
- 或者加入我们的社区,帮助我们共同构建 Gateway API 的未来!
维护者们要感谢为 Gateway API 做出贡献的每一个人,无论是以仓库提交、讨论、想法还是普遍支持的形式。没有这个敬业且活跃的社区的支持,我们永远不可能走到今天这一步。