2.13. 使用 OpenShift Container Platform 网络的网关 API


OpenShift Container Platform 提供了将网关 API 与 Ingress Operator 搭配使用配置网络流量的额外方法。

重要

网关 API 不支持用户定义的网络 (UDN)。

2.13.1. Gateway API 概述

网关 API 是一种开源、社区管理的 Kubernetes 网络机制。它侧重于集群的传输层、L4 和应用程序层 L7 中的路由。各种供应商提供许多网关 API 实施

该项目通过使用具有广泛社区支持的可移植 API 来提供标准化生态系统。通过将网关 API 功能集成到 Ingress Operator 中,它实现了与现有社区和上游开发工作一致的网络解决方案。

gateway API 扩展 Ingress Operator 的功能,以处理更精细的集群流量和路由配置。使用这些功能,您可以创建网关 API 自定义资源定义 (CRD) 的实例。对于 OpenShift Container Platform 集群,Ingress Operator 会创建以下资源:

网关
这个资源描述了如何将流量转换为集群中的服务。例如,一个特定的负载均衡器配置。
GatewayClass
此资源定义一组共享通用配置和行为的 Gateway 对象。例如,可以创建两个单独的 GatewayClass 对象来区分用于公共或私有应用程序的 Gateway 资源。
HTTPRoute
此资源指定从网关到服务的 HTTP 请求的路由行为,对于多路 HTTP 或已终止的 HTTPS 连接特别有用。
GRPCRoute
此资源指定 gRPC 请求的路由行为。
ReferenceGrant
此资源启用跨命名空间引用。例如,它允许路由将流量转发到位于不同命名空间中的后端。

在 OpenShift Container Platform 中,网关 API 的实现基于 gateway.networking.k8s.io/v1,且此版本中的所有字段都被支持。

2.13.1.1. 网关 API 的优点

网关 API 提供以下优点:

  • 可移植性:虽然 OpenShift Container Platform 使用 HAProxy 提高 Ingress 性能,但 Gateway API 不依赖于特定于供应商的注解来提供某些行为。要获得与 HAProxy 相同的性能,Gateway 对象需要水平扩展,或者需要垂直扩展其关联的节点。
  • 关注点:网关 API 对资源使用基于角色的方法,更必要地适合大型机构如何构建职责和团队。平台工程师可能专注于 GatewayClass 资源,集群管理员可能专注于配置 Gateway 资源,应用程序开发人员可能会专注于使用 HTTPRoute 资源路由其服务。
  • 可扩展性:额外的功能是作为标准化 CRD 开发的。

2.13.1.2. 网关 API 的限制

网关 API 有以下限制:

  • 版本不兼容:网关 API 生态系统快速变化,一些实现无法用于其他的实现,因为它们的功能集基于不同的网关 API 版本。
  • 资源开销:虽然更灵活,当网关 API 需要使用多种资源类型来实现结果。对于较小的应用程序,传统 Ingress 的简洁性可能更适合。

2.13.2. OpenShift Container Platform 的网关 API 实现

Ingress Operator 管理网关 API CRD 的生命周期,以便其他厂商实现使用 OpenShift Container Platform 集群中定义的 CRD。

在某些情况下,网关 API 提供一个或多个供应商实现并不支持的字段,但该实现与其余字段在架构中兼容。这些"dead fields"可能会导致 Ingress 工作负载中断、不正确的置备应用程序和服务以及与安全相关的问题。由于 OpenShift Container Platform 使用特定版本的 Gateway API CRD,因此任何使用网关 API 的第三方实现都必须符合 OpenShift Container Platform 的实现,以确保所有字段都能正常工作。

在 OpenShift Container Platform 4.19 集群中创建的任何 CRD 都是兼容版本,并由 Ingress Operator 维护。如果 CRD 已存在但没有由 Ingress Operator 管理,Ingress Operator 会检查这些配置是否与 OpenShift Container Platform 支持的网关 API 版本兼容,并创建一个您需要确认 CRD 的 admin-gate。

重要

如果您要从包含 Gateway API CRD 的以前的 OpenShift Container Platform 版本更新集群,请更改这些资源,以便它们与 OpenShift Container Platform 支持的版本完全匹配。否则,您无法更新集群,因为这些 CRD 不是由 OpenShift Container Platform 管理,并可能包含红帽不支持的功能。

2.13.3. Ingress Operator 的 Gateway API 入门

当您在第一步中创建 GatewayClass 时,它会配置网关 API 以便在集群中使用。

流程

  1. 创建 GatewayClass 对象:

    1. 创建一个 YAML 文件 openshift-default.yaml,其中包含以下信息:

      GatewayClass CR 示例

      apiVersion: gateway.networking.k8s.io/v1
      kind: GatewayClass
      metadata:
        name: openshift-default
      spec:
        controllerName: openshift.io/gateway-controller/v1 
      1
      Copy to Clipboard Toggle word wrap

      1 1
      控制器名称。
      重要

      控制器名称必须与 Ingress Operator 显示完全相同,才能管理它。如果将此字段设置为任何其他对象,Ingress Operator 会忽略 GatewayClass 对象和所有关联的 GatewayGRPCRouteHTTPRoute 对象。控制器名称与 OpenShift Container Platform 中的网关 API 实施关联,openshift.io/gateway-controller/v1 是允许的唯一控制器名称。

    2. 运行以下命令来创建 GatewayClass 资源:

      $ oc create -f openshift-default.yaml
      Copy to Clipboard Toggle word wrap

      输出示例

      gatewayclass.gateway.networking.k8s.io/openshift-default created
      Copy to Clipboard Toggle word wrap

      在创建 GatewayClass 资源期间,Ingress Operator 会在 openshift-ingress 命名空间中安装一个轻量级版本的 Red Hat OpenShift Service Mesh、Istio 自定义资源和新部署。

    3. 可选:验证新部署 istiod-openshift-gateway 是否已就绪并可用:

      $ oc get deployment -n openshift-ingress
      Copy to Clipboard Toggle word wrap

      输出示例

      NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
      istiod-openshift-gateway   1/1     1            1           55s
      router-default             2/2     2            2           6h4m
      Copy to Clipboard Toggle word wrap

  2. 运行以下命令来创建 secret:

    $ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令,获取 Ingress Operator 的域:

    $ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
    Copy to Clipboard Toggle word wrap
  4. 创建 Gateway 对象 :

    1. 创建一个 YAML 文件 example-gateway.yaml,其中包含以下信息:

      Gateway CR 示例

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: example-gateway
        namespace: openshift-ingress 
      1
      
      spec:
        gatewayClassName: openshift-default 
      2
      
        listeners:
        - name: https 
      3
      
          hostname: "*.gwapi.${DOMAIN}" 
      4
      
          port: 443
          protocol: HTTPS
          tls:
            mode: Terminate
            certificateRefs:
            - name: gwapi-wildcard 
      5
      
          allowedRoutes:
            namespaces:
              from: All
      Copy to Clipboard Toggle word wrap

      1
      Gateway 对象必须在 openshift-ingress 命名空间中创建。
      2
      Gateway 对象必须引用之前创建的 GatewayClass 对象的名称。
      3
      HTTPS 侦听与集群域子域匹配的 HTTPS 请求。您可以使用此监听程序,通过网关 API HTTPRoute 资源为应用程序配置入口。
      4
      主机名必须是 Ingress Operator 域的子域。如果使用域,则监听器会尝试提供该域中的所有流量。
      5
      之前创建的 secret 的名称。
    2. 运行以下命令来应用资源:

      $ oc apply -f example-gateway.yaml
      Copy to Clipboard Toggle word wrap
    3. 可选:当您创建 Gateway 对象时,Red Hat OpenShift Service Mesh 会自动置备具有相同名称的部署和服务。运行以下命令验证:

      • 要验证部署,请运行以下命令:

        $ oc get deployment -n openshift-ingress example-gateway-openshift-default
        Copy to Clipboard Toggle word wrap

        输出示例

        NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
        example-gateway-openshift-default    1/1     1            1           25s
        Copy to Clipboard Toggle word wrap

      • 要验证该服务,请运行以下命令:

        $ oc get service -n openshift-ingress example-gateway-openshift-default
        Copy to Clipboard Toggle word wrap

        输出示例

        NAME                                TYPE           CLUSTER-IP   EXTERNAL-IP         PORT(S)      AGE
        example-gateway-openshift-default   LoadBalancer   10.1.2.3     <external_ipname>   <port_info>  47s
        Copy to Clipboard Toggle word wrap

    4. 可选:Ingress Operator 使用监听程序的主机名自动创建 DNSRecord CR,并添加标签 gateway.networking.k8s.io/gateway-name=example-gateway。运行以下命令,验证 DNS 记录的状态:

      $ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
      Copy to Clipboard Toggle word wrap

      输出示例

      kind: DNSRecord
        ...
      status:
        ...
        zones:
        - conditions:
          - message: The DNS provider succeeded in ensuring the record
            reason: ProviderSuccess
            status: "True"
            type: Published
          dnsZone:
            tags:
              ...
        - conditions:
          - message: The DNS provider succeeded in ensuring the record
            reason: ProviderSuccess
            status: "True"
            type: Published
          dnsZone:
            id: ...
      Copy to Clipboard Toggle word wrap

  5. 创建一个 HTTPRoute 资源,将请求定向到您已创建了 example-app/example-app 的应用程序:

    1. 创建一个 YAML 文件 example-route.yaml,其中包含以下信息:

      HTTPRoute CR 示例

      apiVersion: gateway.networking.k8s.io/v1
      kind: HTTPRoute
      metadata:
        name: example-route
        namespace: example-app-ns 
      1
      
      spec:
        parentRefs: 
      2
      
        - name: example-gateway
          namespace: openshift-ingress
        hostnames: ["example.gwapi.${DOMAIN}"] 
      3
      
        rules:
        - backendRefs: 
      4
      
          - name: example-app 
      5
      
            port: 8443
      Copy to Clipboard Toggle word wrap

      1
      部署应用程序的命名空间。
      2
      此字段必须指向您之前配置的 Gateway 对象。
      3
      主机名必须与 Gateway 对象中指定的主机名匹配。在这种情况下,监听程序使用通配符主机名。
      4
      此字段指定指向您的服务的后端引用。
      5
      应用程序的 Service 的名称。
    2. 运行以下命令来应用资源:

      $ oc apply -f example-route.yaml
      Copy to Clipboard Toggle word wrap

      输出示例

      httproute.gateway.networking.k8s.io/example-route created
      Copy to Clipboard Toggle word wrap

验证

  1. 运行以下命令验证 Gateway 对象是否已部署,并具有条件 Programmed

    $ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
    Copy to Clipboard Toggle word wrap

    输出示例

    gateway.gateway.networking.k8s.io/example-gateway condition met
    Copy to Clipboard Toggle word wrap

  2. 向配置的 HTTPRoute 对象主机名发送请求:

    $ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
    Copy to Clipboard Toggle word wrap

2.13.4. 网关 API 部署拓扑

网关 API 设计为使用两个拓扑,即共享网关或专用网关。每个拓扑都有自己的优点和不同的安全影响。

专用网关
路由和任何负载均衡器或代理都从同一命名空间提供。Gateway 对象将路由限制到特定的应用程序命名空间。这是在 OpenShift Container Platform 中部署网关 API 资源时的默认拓扑。
共享网关
路由由多个命名空间提供,或使用多个主机名提供。Gateway 对象过滤器允许使用 spec.listeners.allowedRoutes.namespaces 字段从应用程序命名空间中路由。

2.13.4.1. 专用网关示例

以下示例显示了专用 Gateway 资源,fin-gateway

专用 Gateway 资源示例

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: fin-gateway
  namespace: openshift-ingress
spec:
  listeners: 
1

  - name: http
    protocol: HTTP
    port: 8080
    hostname: "example.com"
Copy to Clipboard Toggle word wrap

1
在不使用 spec.listeners[].allowedRoutes 的情况下创建一个 Gateway 资源,则会隐式设置 namespaces.from 字段,使其具有值 Same

以下示例显示了关联的 HTTPRoute 资源 sales-db,它附加到专用 Gateway 对象:

HTTPRoute 资源示例

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: sales-db
  namespace: openshift-ingress
spec:
  parentRefs:
  - name: fin-gateway
  hostnames:
  - sales-db.example.com
  rules:
    - backendRefs:
        - name: sales-db
        ¦ port: 8080
Copy to Clipboard Toggle word wrap

HTTPRoute 资源必须具有 Gateway 对象的名称,作为其 parentRefs 字段的值,才能附加到网关。隐式来说,路由被假定为与 Gateway 对象位于同一个命名空间中。

2.13.4.2. 共享网关示例

以下示例显示了一个 Gateway 资源 devops-gateway,它有一个 spec.listeners.allowedRoutes.namespaces 标签选择器,以匹配包含 shared-gateway-access: "true" 的任何命名空间:

共享 Gateway 资源示例

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: devops-gateway
  namespace: openshift-ingress
listeners:
  - name: https
    protocol: HTTPS
    hostname: "example.com"
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
        ¦ matchLabels:
        ¦   shared-gateway-access: "true"
Copy to Clipboard Toggle word wrap

以下示例显示了 devops-gateway 资源允许的命名空间:

Namespace 资源示例

apiVersion: v1
kind: Namespace
metadata:
  name: dev
  labels:
    shared-gateway-access: "true"
---
apiVersion: v1
kind: Namespace
metadata:
  name: ops
  labels:
    shared-gateway-access: "true"
Copy to Clipboard Toggle word wrap

在本例中,两个 HTTPRoute 资源 dev-portalops-home 都位于不同的命名空间中,但附加到共享网关:

apiVersion: v1
kind: HTTPRoute
metadata:
  name: dev-portal
  namespace: dev
spec:
  parentRefs:
  - name: devops-gateway
    namespace: openshift-ingress
  rules:
  - backendRefs:
    - name: dev-portal
      port: 8080
---
apiVersion: v1
kind: HTTPRoute
metadata:
  name: ops-home
  namespace: ops
spec:
  parentRefs:
  - name: devops-gateway
    namespace: openshift-ingress
  rules:
  - backendRefs:
    - name: ops-home
      port: 8080
Copy to Clipboard Toggle word wrap

使用共享网关拓扑时,路由必须指定它要附加到的 Gateway 对象的命名空间。可以在命名空间之间部署和共享多个 Gateway 对象。当有多个共享网关时,此拓扑概念类似于 Ingress Controller 分片。

其他资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat