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 以便在集群中使用。
流程
创建
GatewayClass
对象:创建一个 YAML 文件
openshift-default.yaml
,其中包含以下信息:GatewayClass
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要控制器名称必须与 Ingress Operator 显示完全相同,才能管理它。如果将此字段设置为任何其他对象,Ingress Operator 会忽略
GatewayClass
对象和所有关联的Gateway
、GRPCRoute
和HTTPRoute
对象。控制器名称与 OpenShift Container Platform 中的网关 API 实施关联,openshift.io/gateway-controller/v1
是允许的唯一控制器名称。运行以下命令来创建
GatewayClass
资源:oc create -f openshift-default.yaml
$ oc create -f openshift-default.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
gatewayclass.gateway.networking.k8s.io/openshift-default created
gatewayclass.gateway.networking.k8s.io/openshift-default created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在创建
GatewayClass
资源期间,Ingress Operator 会在openshift-ingress
命名空间中安装一个轻量级版本的 Red Hat OpenShift Service Mesh、Istio 自定义资源和新部署。可选:验证新部署
istiod-openshift-gateway
是否已就绪并可用:oc get deployment -n openshift-ingress
$ oc get deployment -n openshift-ingress
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
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 Copied! Toggle word wrap Toggle overflow
运行以下命令来创建 secret:
oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
$ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,获取 Ingress Operator 的域:
DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
$ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
Gateway
对象 :创建一个 YAML 文件
example-gateway.yaml
,其中包含以下信息:Gateway
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用资源:
oc apply -f example-gateway.yaml
$ oc apply -f example-gateway.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:当您创建
Gateway
对象时,Red Hat OpenShift Service Mesh 会自动置备具有相同名称的部署和服务。运行以下命令验证:要验证部署,请运行以下命令:
oc get deployment -n openshift-ingress example-gateway-openshift-default
$ oc get deployment -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证该服务,请运行以下命令:
oc get service -n openshift-ingress example-gateway-openshift-default
$ oc get service -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
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 Copied! Toggle word wrap Toggle overflow
可选: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
$ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建一个
HTTPRoute
资源,将请求定向到您已创建了example-app/example-app
的应用程序:创建一个 YAML 文件
example-route.yaml
,其中包含以下信息:HTTPRoute
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用资源:
oc apply -f example-route.yaml
$ oc apply -f example-route.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
httproute.gateway.networking.k8s.io/example-route created
httproute.gateway.networking.k8s.io/example-route created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令验证
Gateway
对象是否已部署,并具有条件Programmed
:oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
$ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
gateway.gateway.networking.k8s.io/example-gateway condition met
gateway.gateway.networking.k8s.io/example-gateway condition met
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 向配置的
HTTPRoute
对象主机名发送请求:curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
$ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.13.4. 网关 API 部署拓扑 复制链接链接已复制到粘贴板!
网关 API 设计为使用两个拓扑,即共享网关或专用网关。每个拓扑都有自己的优点和不同的安全影响。
- 专用网关
-
路由和任何负载均衡器或代理都从同一命名空间提供。
Gateway
对象将路由限制到特定的应用程序命名空间。这是在 OpenShift Container Platform 中部署网关 API 资源时的默认拓扑。 - 共享网关
-
路由由多个命名空间提供,或使用多个主机名提供。
Gateway
对象过滤器允许使用spec.listeners.allowedRoutes.namespaces
字段从应用程序命名空间中路由。
2.13.4.1. 专用网关示例 复制链接链接已复制到粘贴板!
以下示例显示了专用 Gateway
资源,fin-gateway
:
专用 Gateway
资源示例
- 1
- 在不使用
spec.listeners[].allowedRoutes
的情况下创建一个Gateway
资源,则会隐式设置namespaces.from
字段,使其具有值Same
。
以下示例显示了关联的 HTTPRoute
资源 sales-db
,它附加到专用 Gateway
对象:
HTTPRoute
资源示例
HTTPRoute
资源必须具有 Gateway
对象的名称,作为其 parentRefs
字段的值,才能附加到网关。隐式来说,路由被假定为与 Gateway
对象位于同一个命名空间中。