本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

介绍 ingress2gateway;简化到 Gateway API 的升级

今天,我们发布了 ingress2gateway,这是一款可以帮助你从 Ingress 迁移到 Gateway API 的工具。Gateway API 距离正式发布(GA)只有几周时间了,如果你还没有升级,现在是时候考虑了!

背景

在不断发展的 Kubernetes 世界中,网络扮演着至关重要的角色。随着越来越多的应用程序部署在 Kubernetes 集群中,如何有效地将这些服务暴露给客户端成为一个关键问题。如果你一直在使用 Kubernetes,你可能对 Ingress API 很熟悉,它一直是管理对服务的外部访问的首选解决方案。

Ingress API 提供了一种将外部流量路由到集群内应用程序的方法,使其成为许多 Kubernetes 用户不可或缺的工具。然而,Ingress 也有其局限性,随着应用程序变得越来越复杂,以及对 Kubernetes 集群的需求增加,这些局限性可能会成为瓶颈。

其中一些限制是

  • 通用功能不足 - 通过尝试为各种 HTTP 代理建立一个通用的功能集,Ingress 只能支持基本的 HTTP 路由,这迫使现代代理的更多功能,如流量分割和头部匹配,都必须通过特定于提供商且不可移植的注解来实现。
  • 权限模型不完善 - Ingress 规约将基础设施和应用程序的配置都放在一个对象中。使用 Ingress 时,集群操作员和应用程序开发人员在同一个 Ingress 对象上操作,而没有意识到彼此的角色。这导致了基于角色的访问控制不足,并且很容易出现配置错误。
  • 协议多样性不足 - Ingress 主要关注 HTTP(S) 路由,不为 TCP、UDP 和 gRPC 等其他协议提供原生支持。这一限制使其不太适合处理非 HTTP 工作负载。

Gateway API

为了克服这些问题,Gateway API 旨在提供一种更灵活、可扩展且功能强大的方式来管理服务的流量。

Gateway API 距离正式发布(GA)只有几周时间。它为入口流量控制提供了一个标准的 Kubernetes API。它提供了扩展的功能、改进的定制化和更大的灵活性。通过专注于模块化和富有表现力的 API 资源,Gateway API 使得描述更广泛的路由配置和模型成为可能。

从 Ingress API 向 Gateway API 的过渡,是由 Gateway API 提供的优势和高级功能所驱动的,其基础建立在四个核心原则之上:面向角色、可移植性、表现力和可扩展性。

面向角色的方法

Gateway API 采用了一种面向角色的方法,这与组织内参与配置 Kubernetes 服务网络的传统角色相一致。这种方法使基础设施工程师、集群操作员和应用程序开发人员能够共同处理 Gateway API 的不同方面。

例如,基础设施工程师在部署 GatewayClass 中扮演着关键角色。GatewayClass 是集群范围的资源,作为模板明确定义了从它们派生的 Gateway 的行为,为稳健的服务网络奠定了基础。

随后,集群操作员利用这些 GatewayClass 来部署网关。在 Kubernetes 的 Gateway API 中,Gateway 定义了外部流量如何被引导到集群内的 Service,本质上是连接非 Kubernetes 源和 Kubernetes 感知目标。它代表了与 GatewayClass 规范一致的负载均衡器配置请求。Gateway 规约可能不是详尽无遗的,因为一些细节可以由 GatewayClass 控制器提供,从而确保可移植性。此外,一个 Gateway 可以链接到多个路由引用,以将特定的流量子集引导到指定的服务。

最后,应用程序开发人员配置路由资源(如 HTTPRoutes),以管理配置(例如超时、请求匹配/过滤)和服务组合(例如到后端的路径路由)。路由资源定义了将请求从 Gateway 映射到 Kubernetes Service 的协议特定规则。HTTPRoute 用于复用 HTTP 或已终止的 HTTPS 连接。它适用于需要检查 HTTP 流并使用 HTTP 请求数据进行路由或修改的场景,例如使用 HTTP 头部进行路由,或在传输过程中修改它们。

Diagram showing the key resources that make up Gateway API and how they relate to each other. The resources shown are GatewayClass, Gateway, and HTTPRoute; the Service API is also shown

可移植性

Gateway API 拥有超过 20 个 API 实现,其设计旨在更好地跨不同实现、集群和环境进行移植。它有助于减少 Ingress 对不可移植、特定于提供商的注解的依赖,使你的配置在多个集群中更加一致且易于管理。

Gateway API 承诺支持最新的 5 个 Kubernetes 小版本。这意味着 Gateway API 目前支持 Kubernetes 1.24+。

表现力

Gateway API 为广泛的功能提供了标准的、由 Kubernetes 支持的功能,例如基于头部的匹配、流量分割、基于权重的路由、请求镜像等。而在 Ingress 中,这些功能需要自定义的、特定于提供商的注解。

可扩展性

Gateway API 将可扩展性作为其核心特性来设计。它不是强制采用一种“一刀切”的模型,而是在 API 框架的多个层级提供了链接自定义资源的灵活性。这种分层的定制方法确保用户可以根据自己的特定需求定制配置,而不会使主要结构变得臃肿。通过这样做,Gateway API 促进了更精细、更具上下文感知的调整,从而在标准化和适应性之间实现了微调平衡。这在复杂的云原生环境中尤其有价值,因为特定的用例需要细致入微的配置。一个关键的区别是,Gateway API 拥有更广泛的基础功能集和一种标准的扩展模式,这种模式比 Ingress 上的注解更具表现力。

升级到 Gateway

从 Ingress 迁移到 Gateway API 可能看起来令人生畏,但幸运的是,Kubernetes 刚刚发布了一个简化流程的工具。ingress2gateway 通过将你现有的 Ingress 资源转换为 Gateway API 资源来协助迁移。以下是如何开始使用 Gateway API 和 ingress2gateway 的方法:

  1. 安装一个 Gateway 控制器手动安装 Gateway API CRD

  2. 安装 ingress2gateway

    如果你本地有 Go 开发环境,你可以用以下命令安装 ingress2gateway

    go install github.com/kubernetes-sigs/ingress2gateway@v0.1.0
    

    这将把 ingress2gateway 安装到 $(go env GOPATH)/bin/ingress2gateway

    或者,请参考此处的安装指南

  3. 工具安装后,你可以用它将集群中的 Ingress 资源转换为 Gateway API 资源。

    ingress2gateway print
    

    上述命令将:

    1. 加载你当前的 Kubernetes 客户端配置,包括活动的上下文、命名空间和身份验证详细信息。
    2. 在该命名空间中搜索 Ingress 和特定于提供商的资源。
    3. 将它们转换为 Gateway API 资源(目前仅支持 Gateway 和 HTTPRoute)。对于其他选项,你可以使用 -h 参数运行该工具,或参考 https://github.com/kubernetes-sigs/ingress2gateway#options
  4. 审查转换后的 Gateway API 资源,验证它们,然后将它们应用到你的集群。

  5. 向你的 Gateway 发送测试请求,检查其是否正常工作。你可以使用 kubectl get gateway <gateway-name> -n <namespace> -o jsonpath='{.status.addresses}{"\n"}' 获取网关地址。

  6. 更新你的 DNS,使其指向新的 Gateway。

  7. 一旦你确认没有更多流量通过你的 Ingress 配置,你就可以安全地删除它。

总结

实现可靠、可扩展和可伸缩的网络一直是一个具有挑战性的目标。Gateway API 旨在改进像 Ingress 这样的现有 Kubernetes 网络标准,并减少对特定实现注解和 CRD 的需求。

它是一个 Kubernetes 标准 API,在不同平台和实现之间保持一致,最重要的是,它面向未来。Gateway API 是 Ingress API 的下一代,但其范围更广,还扩展到处理服务网格和第 4 层路由。Gateway API 和 ingress2gateway 由 SIG Network 下的一个专门团队支持,他们积极地进行开发并管理生态系统。它也很可能获得更多的更新和社区支持。

未来的道路

ingress2gateway 才刚刚起步。我们计划引入更多的提供商支持,增加对更多类型的 Gateway API 路由的支持,并确保一切与 Gateway API 的持续发展顺利同步。

令人兴奋的是,Gateway API 也在取得重大进展。虽然 v1.0 即将发布,但仍有大量工作要做。此版本包含了许多新的实验性功能,还有其他功能目前正处于规划和开发的早期阶段。

如果你有兴趣参与贡献,我们非常欢迎!请查看社区页面,其中包含了 Slack 频道和社区会议的链接。我们期待你的加入!