Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Ingress 的继任者 —— Gateway API?

Ingress 的继任者 —— Gateway API?

作者头像
崔秀龙
发布于 2021-07-19 02:23:24
发布于 2021-07-19 02:23:24
2.1K00
代码可运行
举报
文章被收录于专栏:伪架构师伪架构师
运行总次数:0
代码可运行

Kubernetes 集群边缘对外提供网络服务的时候,通常需要借助 Ingress 对象,这个对象提供了暴露 Service 所必须的核心要素,例如基于主机名的路由、对 URL 路径的适配以及 TLS 配置等。但是在实际开放服务的时候,往往会有更多的具体需求,这时 Ingress 对象所提供的核心功能就有些力不从心了,各种 Ingress 控制器往往会使用 metadata.annotations 中的特定注解,来完成对 Ingress 特定行为的控制,完成各自的个性化功能,例如认证、路径变更、黑白名单等,这就让 Ingress 对象变成了一个奇怪的东西:结构化的核心结构,和非结构化的标注结合起来形成各种 Ingress 方言,并且后期还出现了 Traefik Middleware 这样的 CRD 配置,这给 Ingress 功能的集中管理造成了一个较大的困扰;另外 Ingress 中可以随意定制主机名、路径以及后端服务,也给共享集群的用户造成了一定的安全隐患。包括 Cotour、Traefik 在内的 Ingress 控制器后期都提供了各自的基于 CRD 的功能表达,客观上也让 Ingress 世界更为分裂。 例如要移除路径前缀,Nginx Ingress 控制器需要使用 nginx.ingress.kubernetes.io/rewrite-target 注解,而 Traefik 1.7 中则需要使用 traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip 注解。

SIG-Network 基于实际现状和需求,提出了全新的 Gateway API 来作为 Ingress 的继任者,总体来说,相对于 Ingress,Gateway API 有几个显著特点:

  1. 职责分离,运维、开发等不同的角色都能够在适合的边界内完成工作;
  2. 扩展核心能力,并使用更结构化的方式进行表达;
  3. 易于扩展:Gateway API 为各种不同实现的控制器提供了一致的扩展方法。

目前该 API 还处于 Alpha 阶段,也仅有少量控制器提供了早期支持。下面做一些陈述和试验,来看看 Gateway API 有什么不一样。

概念层次

Ingress 中包含了 IngressClass/Ingress 两层概念,而 Gateway API 包含了三层概念:GatewayClass、Gateway 和 Route,其中的 Route 实际是包含了 HTTPRoute、TCPRoute、TLSRoute 和 UDPRoute 在内的一组对象。

GatewayClass

它是一个集群范围内的资源,由云基础设施中的 Gateway API 控制器提供,其职责和原有的 Ingress Class 类似。

Gateway

Gateway 对象是命名空间范围对象,可以视作是 GatewayClass 的一个实例,它通常是由具体机群的运维人员进行维护的,在 Gateway 对象中可以指定该对象负责的主机名称范围,用标签选择器选择对应的 Service,甚至还可以指定该 Gateway 生效的命名空间。这样就给具体应用的对外开放划定了一个范围,防止应用随意占用主机名,并完善命名空间的隔离能力。

Route

前文讲到,Route 对象除了像原有的 Ingress 对象一样提供 HTTP 服务的开放能力之外,还提供了 TCP、TLS 和 UDP 的对应资源,从而缓解了 Nginx、HAProxy Ingress 控制器使用 Configmap 配置 TCP/UDP 的窘境。HTTPRoute 除了提供基础的 Ingress 对象能力之外,还提供了一些“越界”的功能,例如对流量进行复制、分流;更重要的是其中还提供了 Filter 能力,这是一个扩展点,除了自带的核心处理能力之外,底层设施还可以在这里接入自己的 CRD,对流量进行处理,从而为流量处理能力的扩展提供了一个统一入口。UDPRoute 和 TCPRoute 也提供了对流量的判别能力,但是这部分仅提供了扩展点,而没有像 HTTP 一样的成熟能力。

举个栗子

目前 GKE 提供了 Gateway API 的公共预览版可以用于测试,仅限于以下区域的 1.20 以上版本的集群:

  • us-west1
  • us-east1
  • us-central1
  • europe-west4
  • europe-west3
  • europe-west2
  • europe-west1
  • asia-southeast1

不同区域的集群缺省开关可能不一致,注意需要在控制台的网络页面启用 HTTP 负载均衡功能,或者在命令行中的 --addons 参数值里加入 HttpLoadBalancing

使用如下命令部署网关资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.3.0" \
| kubectl apply -f -
customresourcedefinition.apiextensions.k8s.io/backendpolicies.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/gatewayclasses.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/gateways.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/httproutes.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/tcproutes.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/tlsroutes.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/udproutes.networking.x-k8s.io created

部署完成之后,网关控制器会被触发,创建两个 GatewayClass

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get gatewayclasses
NAME          CONTROLLER                  AGE
gke-l7-gxlb   networking.gke.io/gateway   1s
gke-l7-rilb   networking.gke.io/gateway   1s

不难发现,我们使用的是 HTTP 负载均衡,新建的 Gateway Class 也都包含 l7 字样,其实官方文档也明确说明:

注意:GKE Gateway Controller 仅支持 GatewayClass、网关和 HTTPRoute。不支持 TCPRoute、UDPRoute 和 TLSRoute。

这里初始化了两个 GatewayClass,gxlb 用于外部,rilb 用于内部,所以我们要在外网测试,就要用 gxlb 创建网关。

一个简单的工作负载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: flaskapp-v1
  name: flaskapp-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flaskapp-v1
  template:
    metadata:
      labels:
        app: flaskapp-v1
    spec:
      containers:
      - image: dustise/flaskapp:v0.2.6
        name: flaskapp
        env:
        - name: "VERSION"
          value: "v1"
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: flaskapp-v1
  name: flaskapp-v1
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: flaskapp-v1
  type: ClusterIP

创建 Gateway:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: Gateway
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
  name: gateway-gen
spec:
  gatewayClassName: gke-l7-gxlb
  listeners:
  - protocol: HTTP
    port: 80
    hostname: "*.microservice.xyz"
    routes:
      kind: HTTPRoute
      selector:
        matchLabels:
          app: flaskapp-v1
      namespaces:
        from: "All"

这个 Gateway 对象中仅定义了一个 Listener 对象,其中规定可以使用的域名*.microservice.xyzHTTPRoute,选择器要求使用这个对象的 Route 必须使用 app=flaskapp-v1 的标签,可以在所有命名空间中进行引用。创建之后查看一下状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl describe gateway gateway-gen

...
Spec:
  Gateway Class Name:  gke-l7-gxlb
  Listeners:
    Hostname:  *.microservice.xyz
    Port:      80
    Protocol:  HTTP
    Routes:
      Group:  networking.x-k8s.io
      Kind:   HTTPRoute
      Namespaces:
        From:  All
      Selector:
        Match Labels:
          App:  flaskapp-v1
Status:
  Addresses:
    Type:   IPAddress
    Value:  37.132.121.12
...

看到 Gateway 中已经得到了一个 IP 地址。接下来建立一个对应的 HTTPRoute 对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: HTTPRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
  name: flaskapp-v1
  labels:
    app: flaskapp-v1
spec:
  hostnames:
  - "v1.microservice.xyz"
  - "v1.microservice.rocks"
  rules:
  - forwardTo:
    - serviceName: flaskapp-v1
      port: 80

这个里面我们用了一个多余的域名:v1.microservice.rocks,看看运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ http http://v1.microservice.xyz/env/VERSION
HTTP/1.1 200 OK
...
Server: nginx/1.15.3
Via: 1.1 google

v1

$ http http://v1.microservice.rocks/env/VERSION
HTTP/1.1 404 Not Found
...
Via: 1.1 google

default backend - 404

这里看到,“超纲”的域名会返回 404,被缺省后端截获。如果更换一个命名空间来创建 HTTPRoute 来引用 Gateway,会发现虽然在 Gateway 中定义了 namespaces.from: "All",但是仍旧会返回 404describe httproute 一下会发现,spec.gateways.allow 缺省被设置为 SameNamespace,因此显式定义 spec.gateways.allow=All,就能正常访问了。

分流

HTTPRoute 的 spec.rules 是一个数组,实际上这是一个分流支持,例如我们如此定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  rules:
  - forwardTo:
    - serviceName: flaskapp-v1
      port: 80
  - forwardTo:
    - serviceName: flaskapp-v2
      port: 80

然后循环测试,会发现 v1v2 在一定时间内会交替出现。forwardTo 还有一个 weight 属性,这个数字决定了流量在不同转发目标之间的分配比例。

GKE 的分流好像比较弱,一百个请求测试,有时分配也并不明显。

条件分支

多个 Rule 之间还可以使用条件进行分流,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  rules:
  - forwardTo:
    - serviceName: flaskapp-v1
      port: 80
  - forwardTo:  
    - serviceName: flaskapp-v2
      port: 80
    matches:
    - headers:
        type: Exact
        values:
          version: v2

测试一下有无特定 Header 的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ http http://v1.microservice.xyz/env/VERSION version:v2
...
v2

$ http http://v1.microservice.xyz/env/VERSION
...
v1

其他

在直接的 forwardTo 之外,Gateway API 还可以通过 Filter 的方式支持扩展能力,这个能够在转发之前进行流量处理的功能分为三种层级:

  • Core:所有实现者都必须实现该能力,例如 RequestHeaderModifier
  • Extended:建议实现这个层级的能力,例如 RequestMirror
  • Custom:实现者可以在这个层级实现各种扩展能力,如果多个厂商都实现了该功能,则可能升级到 Extended 或者 Core。

GKE 的公共 Gateway 并不支持流量复制,现阶段也不提供 TCP/UDP 的支持,可能需要靠其它控制器来实现。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 伪架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
kubernetes | Gateway API 简介及部署
Gateway API(之前叫 Service API)是由 SIG-NETWORK 社区管理的开源项目,项目地址:https://gateway-api.sigs.k8s.io/。主要原因是 Ingress 资源对象不能很好的满足网络需求,很多场景下 Ingress 控制器都需要通过定义 annotations 或者 crd 来进行功能扩展,这对于使用标准和支持是非常不利的,新推出的 Gateway API 旨在通过可扩展的面向角色的接口来增强服务网络。
Amadeus
2023/04/27
1.5K0
kubernetes | Gateway API 简介及部署
K8S 暴露服务的新方法 Gateway API 详解,它有什么优势?
前段时间,Kubernetes SIG-Network[1] 发布了备受期待的 Gateway API 0.5.0 版。主要组件的 Api 正在升级到 beta (v1beta1),这意味着我们很快就会看到更多使用这些原语的项目。
我的小碗汤
2023/03/19
2.9K0
K8S 暴露服务的新方法 Gateway API 详解,它有什么优势?
Istio 使用 Gateway API 实现流量管理
Gateway API 是由 SIG-NETWORK 社区管理的开源项目,项目地址:https://gateway-api.sigs.k8s.io/。主要原因是 Ingress 资源对象不能很好的满足网络需求,很多场景下 Ingress 控制器都需要通过定义 annotations 或者 crd 来进行功能扩展,这对于使用标准和支持是非常不利的,新推出的 Gateway API 旨在通过可扩展的面向角色的接口来增强服务网络。
我是阳明
2023/12/26
7130
Istio 使用 Gateway API 实现流量管理
Kubernetes Gateway API
初始的 Kubernetes 内部服务向外暴露,使用的是自身的 LoadBlancer 和 NodePort 类型的Service,在集群规模逐渐扩大的时候,这种 Service 管理的方式满足不了我们的需求,比如 NodePort 需要大量的端口难以维护,多了一层NAT,请求量大会对性能有影响;LoadBlancer 需要每个 Service 都有一个外部负载均衡器。接着 Kubernetes 提供了一个内置的资源对象 Ingress API 来暴露 HTTP 服务给外部用户,它的创建是为了标准化的将 Kubernetes 中的服务流量暴露给外部,Ingress API 通过引入路由功能,克服了默认服务类型 NodePort 和 LoadBalancer 的限制。在创建 Ingress 资源的时候通过 IngressClass 指定该网关使用的控制器,主要是靠 Ingress 控制器不断监听 Kubernetes API Server 中 IngressClass 以及 Ingress 资源的的变动,配置或更新入口网关和路由规则。IngressClass实现了网关与后台的解耦,但也有着很多的局限性。Ingress 配置过于简单,只支持 http 和 https 协议的服务路由和负载均衡,缺乏对其他协议和定制化需求的支持,而且 http 路由只支持 host 和 path 的匹配,对于高级路由只能通过注解来实现,当然这取决于 Ingress 控制器的实现方式,不同的 Ingress 控制器使用不同的注解,来扩展功能,使用注解对于 Ingress 的可用性大打折扣;路由无法共享一个命名空间的网关,不够灵活;网关的创建和管理的权限没有划分界限,开发需要配置路由以及网关。当然也有很多第三方的网关组件,例如 istio 和 apisix 等,提供了丰富的流量管理功能,如负载均衡、动态路由、动态 upstream、A/B测试、金丝雀发布、限速、熔断、防御恶意攻击、认证、监控指标、服务可观测性、服务治理等,还可以处理南北流量以及服务之间的东西向流量。对外提供路由功能,对内提供流量筛选,已经很好的满足了当下网络环境的所有需求。但对于小集群来说,这两个网关的部署成本有点高;而且太多类型的网关,不同的配置项、独立的开发接口、接口的兼容性、学习成本、使用成本、维护成本以及迁移成本都很高。急需一种兼容所有厂商 API 的接口网关。所以应运而生,Kubernetes 推出了 Gateway API。Gateway API 是 Kubernetes 1.19 版本引入的一种新的 API 规范,会成为 Ingress 的下一代替代方案。它有着 Ingress 的所有功能,且提供更丰富的功能,它支持更多的路由类型选择,除了 http路由外,还支持 tcp 以及 grpc 路由类型;它通过角色划分将各层规则配置关注点分离,实现规则配置上的解耦;并提供跨 namespace 的路由与网关支持使其更适应多云环境等。与 Ingress Api 工作类似的,Gateway Controller 会持续监视 Kubernetes API Server 中的 GatewayClass 和 Gateway 对象的变动,根据集群运维的配置来创建或更新其对应的网关和路由。API 网关、入口控制器和服务网格的核心都是一种代理,目的在于内外部服务通信。更多的功能并不等于更好的工具,尤其是在 Kubernetes 中,工具的复杂性可能是一个杀手。
政采云前端团队
2023/09/01
8280
Kubernetes Gateway API
Kubernetes 集群部署 Ingress Traefik
Traefik 是一个开源的可以使服务发布变得轻松有趣的边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理。
高楼Zee
2021/12/15
2K0
Kubernetes 集群部署 Ingress Traefik
Ingress实战
Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。
py3study
2020/03/25
1.3K0
Ingress实战
通过Gateway API不断演变的Kubernetes网络
作者: Mark Church(谷歌)、Harry Bagdi(Kong)、Daneyon Hanson(Red Hat)、Nick Young(VMware)、Manuel Zapf(Traefik Labs)
CNCF
2021/05/07
1K0
通过Gateway API不断演变的Kubernetes网络
Kubernetes集群监控-安装部署Prometheus Operator
Prometheus Operator:为监控 Kubernetes 资源和 Prometheus 实例的管理提供了简单的定义,简化在 Kubernetes 上部署、管理和运行 Prometheus 和 Alertmanager 集群。
王先森sec
2023/12/26
1.7K0
Kubernetes集群监控-安装部署Prometheus Operator
超越 Gateway API:深入探索 Envoy Gateway 的扩展功能
作为 Envoy 社区推出的 Ingress Gateway 实现,Envoy Gateway² 全面支持了 Kubernetes Gateway API³ 的所有能力。除此之外,基于 Gateway API 创新的扩展机制,Envoy Gateway 还提供了丰富的流量管理、安全性、自定义扩展等 Gateway API 中并不包含的增强功能。本文将介绍 Envoy Gateway 的 Gateway API 扩展功能,并深入探讨这些功能的应用场景。
Se7en258
2025/05/20
670
超越 Gateway API:深入探索 Envoy Gateway 的扩展功能
了解下 Kuberentes Gateway API
在 Kubernetes 集群边缘对外提供网络服务的时候,通常需要借助 Ingress 对象,这个对象提供了暴露 Service 所必须的核心要素,例如基于主机名的路由、对 URL 路径的适配以及 TLS 配置等。但是在实际开放服务的时候,往往会有更多的具体需求,这时 Ingress 对象所提供的核心功能就有些力不从心了,各种 Ingress 控制器往往会使用 metadata.annotations 中的特定注解,来完成对 Ingress 特定行为的控制,完成各自的个性化功能,例如认证、路径变更、黑白名单等,这就让 Ingress 对象变成了一个奇怪的东西:结构化的核心结构,和非结构化的标注结合起来形成各种 Ingress 方言,并且后期还出现了 Traefik Middleware 这样的 CRD 配置,这给 Ingress 功能的集中管理造成了一个较大的困扰;另外 Ingress 中可以随意定制主机名、路径以及后端服务,也给共享集群的用户造成了一定的安全隐患。包括 Contour、Traefik 在内的 Ingress 控制器后期都提供了各自的基于 CRD 的功能表达,客观上也让 Ingress 世界更为分裂。
张善友
2022/09/23
3360
超越 Gateway API:深入探索 Envoy Gateway 的扩展功能(未完成)
Envoy Gateway 作为 Envoy 的 Ingress Gateway 实现,全面支持了 Gateway API 的所有能力。除此之外,基于 Gateway API 的扩展机制,Envoy Gateway 还提供了丰富的流量管理、安全性、自定义扩展等 Gateway API 中不包含的增强功能。本文将介绍 Envoy Gateway 的 Gateway API 扩展功能,并深入探讨这些功能的应用场景。
赵化冰
2024/09/02
2110
Kubernetes Gateway API 深入解读和落地指南
Kubernetes Gateway API 是 Kubernetes 1.18 版本引入的一种新的 API 规范,是 Kubernetes 官方正在开发的新的 API,Ingress 是 Kubernetes 已有的 API。Gateway API 会成为 Ingress 的下一代替代方案。Gateway API 提供更丰富的功能,支持 TCP、UDP、TLS 等,不仅仅是 HTTP。Ingress 主要面向 HTTP 流量。 Gateway API 具有更强的扩展性,通过 CRD 可以轻易新增特定的 Gateway 类型,比如 AWS Gateway 等。Ingress 的扩展相对较难。Gateway API 支持更细粒度的流量路由规则,可以精确到服务级别。Ingress 的最小路由单元是路径。
Rainbond开源
2023/05/06
1.6K0
Kubernetes 1.20.5 安装traefik在腾讯云下的实践
背景 CVM CDN https://cloud.tencent.com/act?from=10680 https://cloud.tencent.com/act/season?from=14065
对你无可奈何
2021/03/26
2.5K0
【每日一个云原生小技巧 #38】Kubernetes Gateway
Kubernetes Gateway API 是一组 API 类型,用于提供动态基础设施配置和高级流量路由功能。这些 API 面向角色、协议感知,并可扩展,适用于多种组织角色,如基础设施提供商、集群操作员和应用程序开发者。它们通过定制资源定义,并受到多种实现的支持。
郭旭东
2023/12/06
2230
【每日一个云原生小技巧 #38】Kubernetes Gateway
在 TKE 使用 EnvoyGateway 流量网关
陈鹏,腾讯云容器服务产品架构师,拥有丰富的云原生技术实践经验,同时也是 Kubernetes、Istio 等云原生项目 Contributor,《Kubernetes 实践指南》等电子书作者。
腾讯云原生
2025/02/27
1700
在 TKE 使用 EnvoyGateway 流量网关
Kubernetes Service APIs 介绍
Kubernetes 服务 APIs(Service APIs)是由 SIG-NETWORK 社区管理的开源项目,项目地址:https://github.com/kubernetes-sigs/service-apis。该项目的目标是在 Kubernetes 生态系统中发展服务网络 API,服务 API 提供了暴露 Kubernetes 应用的接口-- Services、Ingress 等。
我是阳明
2021/01/04
1.2K0
Kubernetes Service APIs 介绍
traefik系列之二 | 路由(ingressRoute)
基于 centos7.9,docker-ce-20.10.18,kubelet-1.22.3-0, traefik-2.9.10
Amadeus
2023/04/27
2.5K0
traefik系列之二 | 路由(ingressRoute)
应该切换到Kubernetes Gateway吗?
距离 Kubernetes Gateway API 发布v1.0版本已经过去一个月了,这标志着其一些关键 API 的毕业到普遍可用的状态。
云云众生s
2024/03/28
1470
应该切换到Kubernetes Gateway吗?
Consul API Gateway 0.4 已正式发布,包括这些新功能
Consul API Gateway 0.4 引入了对新 beta 版 Kubernetes Gateway API 和 HTTP 路径重写的支持。
我的小碗汤
2023/03/19
5860
Consul API Gateway 0.4 已正式发布,包括这些新功能
在 Traefik 中使用 Kubernetes Gateway API
Gateway API(之前叫 Service API)是由 SIG-NETWORK 社区管理的开源项目,项目地址:https://gateway-api.sigs.k8s.io/。主要原因是 Ingress 资源对象不能很好的满足网络需求,很多场景下 Ingress 控制器都需要通过定义 annotations 或者 crd 来进行功能扩展,这对于使用标准和支持是非常不利的,新推出的 Gateway API 旨在通过可扩展的面向角色的接口来增强服务网络。
我是阳明
2022/02/11
1.5K0
在 Traefik 中使用 Kubernetes Gateway API
相关推荐
kubernetes | Gateway API 简介及部署
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验