关于 Ingress
Ingress是一项通过将公共或私人请求转发到您的应用程序来平衡集群网络流量的工作负载的服务。 您可以使用Ingress通过唯一的公共或私有域向公共网络或私有网络公开多个应用服务。
在集群中,Red Hat OpenShift Ingress 控制器是实现 HAProxy Ingress 控制器的层 7 负载均衡器。 层 4 LoadBalancer
服务公开 Ingress 控制器,以便 Ingress 控制器可以接收进入集群的外部请求。 然后,Ingress 控制器根据区分层 7 协议特征 (例如头) 将请求转发到集群中的应用程序 pod。
Ingress 的组件是什么?
在运行 Red Hat OpenShift 版本 4 的集群中,Ingress 由三个组件组成: Ingress 操作程序,Ingress 控制器和 Route 资源。
入口运算符
Red Hat OpenShift Ingress 操作程序 实现应用于集群中应用程序的所有入局流量的路由规则。
入口控制器由 Ingress 操作程序管理。 在集群创建期间,将以 <cluster_name>.<globally_unique_account_HASH>-0000.<region>.containers.appdomain.cloud
格式向集群的缺省 Ingress 子域注册缺省 Ingress 控制器。 通过创建 Route 资源向此子域注册应用程序时,Ingress 控制器将确保通过此子域向应用程序发出的请求正确代理到应用程序
pod。 要查看集群中的缺省 Ingress 控制器,请运行 oc describe ingresscontroller/default -n openshift-ingress-operator
。
如果要向其他域注册应用程序,那么可以 创建定制 Ingress 控制器,以改为实现定制域的路由规则。
Ingress 控制器
One HAProxy-based Red Hat OpenShift Ingress controller is created for each IngressController, and one Ingress controller service is created in each zone where you have worker nodes.
Ingress 操作程序使用 IngressController中指定的相同域来配置 Ingress 控制器。 入口控制器侦听通过该域的传入 HTTP、HTTPS 或TCP服务请求。 然后,Ingress 控制器的负载均衡器服务组件仅根据 Route 资源中定义并由 Ingress 控制器实现的规则将请求转发到该应用程序的 pod。
如果您具有多专区集群,那么会将一个高可用性 Ingress 控制器部署到集群,并使用多专区 VPC 负载均衡器进行配置。 每个专区需要两个工作程序节点,以便可以正确部署和更新 Ingress 控制器的两个副本。
如果手动创建 Ingress 控制器,那么 Ingress 控制器不会自动向集群中的 Ingress 子域或应用程序注册。
经典集群 :Ingress 控制器 IP 地址
要查找缺省 Ingress 控制器服务的 IP 地址,请运行 oc get svc -n openshift-ingress
并查找 EXTERNAL IP 字段。 如果您具有多专区集群,请注意,您具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为 router-default
,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如 router-dal12
之类的名称。
VPC 集群 :Ingress 控制器主机名
当您创建VPC集群时,一个公共和私人多区域VPC负载均衡器将自动在您的VPC集群外创建。 公共 VPC 负载均衡器创建主机名以注册公共 Ingress 控制器,而专用 VPC 负载均衡器创建主机名以注册专用 Ingress 控制器。 在VPC集群中,主机名分配给入口控制器,因为外部IP地址不是静态的,可能会随时间变化。 请注意,此 Ingress 控制器主机名与集群的缺省 Ingress 子域不同。
集群的入口子域会自动链接到公共入口控制器的 VPC 负载均衡器主机名。 请注意,集群的 Ingress 子域 (类似于 <cluster_name>.<hash>-0000.<region>.containers.appdomain.cloud
) 与公共 Ingress 控制器的 VPC 负载均衡器分配的主机名 (类似于 01ab23cd-<region>.lb.appdomain.cloud
)
不同。 Ingress 子域是用户通过因特网访问应用程序的公共路径,可以配置为使用 TLS 终止。 为公共 Ingress 控制器分配的主机名是 VPC 负载均衡器用于将流量转发到 Ingress 控制器服务的主机名。
您可以通过运行 oc get svc -n openshift-ingress
并查找 EXTERNAL IP 字段来查找分配给公共 Ingress 控制器的主机名以及分配给专用 Ingress 控制器的主机名。
在 VPC 基础结构仪表板中,VPC 负载均衡器仅将运行 Ingress 控制器副本 pod 的两个工作程序节点报告为正常运行状态,因为这些工作程序节点配置为 VPC 负载均衡器的侦听器。 即使只有侦听器工作程序节点报告为正常运行,侦听器的工作程序节点后端池仍由 Red Hat OpenShift on IBM Cloud 保持最新,以便集群中的所有工作程序节点仍可接收来自 VPC 负载均衡器的请求。
路由资源
要使用Route公开应用,必须为应用创建一个 Kubernetes 服务,并通过定义Route资源在Ingress控制器中注册该服务。 入口资源(Ingress resource)是一个 Red Hat OpenShift 资源,用于定义如何为应用程序分配传入请求的规则。
“路由”资源还指定了应用程序服务的路径。 您的应用服务的路径将附加到集群的入口子域中,形成一个唯一的应用 URL,例如 mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud/myapp1
。
每个项目都需要一个路线资源,用于展示您想要展示的应用。
- 如果集群中的应用程序全部位于同一项目中,那么必须创建一个 Route 资源以定义要公开的应用程序的路由规则。 请注意,如果要对同一项目中的应用程序使用不同的域,那么可以为每个域创建一个资源。
- 如果集群中的应用程序位于不同的项目中,那么必须为每个项目创建一个路由资源以定义应用程序的路由规则。
更多信息,请参阅 为单个或多个项目规划网络。
如果要为应用程序定制路由规则,可以使用 特定于路由的 HAProxy 注释 来管理应用程序的流量。 这些受支持的注释的格式为 haproxy.router.openshift.io/<annotation>
或 router.openshift.io/<annotation>
。
请注意,Red Hat OpenShift 版本 4 中的 Ingress 控制器或 Route 资源不支持 IBM Cloud Kubernetes Service 注释 (ingress.bluemix.net/<annotation>
) 和 NGINX 注释 (nginx.ingress.kubernetes.io/<annotation>
)。
我的应用程序如何通过经典仪表盘显示请求?
单专区集群
下图显示了 Ingress 如何将通信从因特网定向到经典单专区集群中的应用程序。
-
用户通过访问应用程序的 URL 向应用程序发送请求。 此 URL 是集群的入口子域,后接已公开应用的入口资源路径,例如
mycluster-<hash>-0000.us-south.containers.appdomain.cloud/myapp
。 -
DNS系统服务将 URL 中的子域解析为负载均衡器的可移植公共IP地址,该地址在您的集群中公开入口控制器。
-
根据已解析的 IP 地址,客户机将请求发送到 Ingress 控制器服务。
-
Ingress 控制器检查由 Ingress 控制器针对
myapp
路径的路由规则实施的路由规则。 如果找到匹配规则,请求将根据您在入口控制器和路由资源中定义的规则被代理到应用程序所在的容器。 数据包的源IP地址被更改为入口控制器运行的工作节点的IP地址。 如果集群中部署了多个应用程序实例,入口控制器将在应用程序容器之间均衡负载。 -
当应用程序返回响应数据包时,它使用转发请求的入口控制器所在的工作节点的IP地址。 然后,Ingress控制器将响应数据包发送给客户端。
多专区集群
下图显示了 Ingress 如何将通信从因特网定向到经典多专区集群中的应用程序。
-
用户通过访问应用程序的 URL 向应用程序发送请求。 此 URL 是集群的入口子域,后接已公开应用的入口资源路径,例如
mycluster-<hash>-0000.us-south.containers.appdomain.cloud/myapp
。 -
DNS 系统服务将路由子域解析为 MZLB 报告为正常运行的 Ingress 控制器服务的浮动公共 IP 地址。 MZLB持续检查集群中每个区域中暴露入口控制器的服务的便携式公共IP地址。 入口控制器服务以循环方式处理不同区域的需求。
-
客户机将请求发送到公开 Ingress 控制器的服务的 IP 地址。
-
Ingress 控制器检查 Ingress 控制器针对
myapp
路径实施的路由规则。 如果找到匹配规则,请求将根据您在 IngressController 中定义的规则进行代理,并将路由资源路由到部署应用程序的 pod。 数据包的源IP地址被更改为入口控制器运行的工作节点的IP地址。 如果集群中部署了多个应用实例,入口控制器服务将在所有区域的应用容器之间发送请求。 -
当应用程序返回响应数据包时,它使用转发请求的入口控制器服务所在的工作节点的IP地址。 然后,Ingress控制器将响应数据包发送给客户端。
请求如何到达VPC集群中的我的应用程序?
具有公共云服务端点的 VPC 集群
在启用公共云服务端点的情况下创建多专区 VPC 集群时,缺省情况下会创建公共 Ingress 控制器。 下图显示了 Ingress 如何将通信从因特网定向到 VPC 多专区集群中的应用程序。
-
用户通过访问应用程序的 URL 向应用程序发送请求。 此 URL 是您集群的入口子域,用于暴露应用程序,并附加入口资源路径,例如
mycluster-<hash>-0000.us-south.containers.appdomain.cloud/myapp
。 -
DNS 服务将路由子域解析为分配给 Ingress 控制器的 VPC 负载均衡器主机名。 在 VPC 集群中,外部 IP 地址是浮动的,并且保留在 VPC 分配的主机名后面。
-
VPC 负载均衡器将 VPC 主机名解析为 Ingress 控制器的区域中报告为正常运行的可用 IP 地址。 VPC 负载均衡器持续检查集群中每个专区中 Ingress 控制器的外部 IP 地址。
-
根据解析的 IP 地址,VPC 负载均衡器将请求发送到 Ingress 控制器。
-
Ingress 控制器检查 Ingress 控制器针对
myapp
路径实施的路由规则。 如果找到匹配规则,请求将根据您在 IngressController 中定义的规则进行代理,并将路由资源路由到部署应用程序的 pod。 数据包的源IP地址被更改为入口控制器运行的工作节点的IP地址。 如果集群中部署了多个应用实例,入口控制器将在所有区域之间对应用容器之间的请求进行负载均衡。 -
当应用程序返回响应数据包时,它使用转发请求的入口控制器服务所在的工作节点的IP地址。 VPC负载均衡器随后将响应数据包发送给客户端。
仅具有私有云服务端点的 VPC 集群
当您仅使用私有云服务端点创建多专区 VPC 集群时,缺省情况下会创建私有 Ingress 控制器。 只有连接到专用 VPC 网络的客户机才能访问由专用 Ingress 控制器公开的应用程序。 下图显示了Ingress如何将通信从专用网络引导至VPC多区域集群中的应用程序。
-
连接到您的专用VPC网络的客户使用您的应用程序的 URL 向您的应用程序发送请求。 此 URL 是您集群的入口子域,用于暴露应用程序,并附加入口资源路径,例如
mycluster-<hash>-0000.us-south.containers.appdomain.cloud/myapp
。 例如,您可以使用虚拟专用 Cloud VPN、IBM Cloud Transit Gateway 或 IBM Cloud Direct Link,允许来自本地网络、其他VPC或 IBM Cloud 经典基础设施的请求访问集群中运行的应用。 -
DNS 服务将路由子域解析为分配给 Ingress 控制器的服务的 VPC 负载均衡器主机名。 在 VPC 集群中,Ingress 控制器服务的专用 IP 地址是浮动的,并且保留在 VPC 分配的主机名后面。 请注意,虽然路由子域的 DNS 记录是在公共 DNS 系统中注册的,但可从 VPC 访问 DNS 解析服务器。
-
专用 VPC 负载均衡器将 VPC 主机名解析为报告为正常运行的 Ingress 控制器服务的可用专用 IP 地址。 VPC 负载均衡器会持续检查集群中每个专区中公开 Ingress 控制器的服务的 IP 地址。
-
根据解析的 IP 地址,VPC 负载均衡器将请求发送到 Ingress 控制器服务。
-
Ingress 控制器检查 Ingress 控制器针对
myapp
路径实施的路由规则。 如果找到匹配规则,请求将根据您在 IngressController 中定义的规则进行代理,并将路由资源路由到部署应用程序的 pod。 数据包的源IP地址被更改为入口控制器运行的工作节点的IP地址。 如果集群中部署了多个应用实例,入口控制器将在所有区域之间对应用容器之间的请求进行负载均衡。 -
当应用程序返回响应数据包时,它使用转发客户端请求的入口控制器所在的工作节点的IP地址。 然后,Ingress 控制器通过 VPC 负载均衡器将响应包发送到客户机。
如何定制路由?
如果要为应用程序定制路由规则,可以使用 特定于路由的 HAProxy 注释 来管理应用程序的流量。
这些受支持的注释的格式为 haproxy.router.openshift.io/<annotation>
或 router.openshift.io/<annotation>
。
IBM Cloud Kubernetes Service 注释 (ingress.bluemix.net/<annotation>
) 和 NGINX 注释 (nginx.ingress.kubernetes.io/<annotation>
) 不 受 Ingress 控制器或 Red Hat OpenShift 版本 4 中的 Route 资源支持。
要开始使用,请参阅 定制 Ingress。
如何启用 TLS 证书?
为了平衡子域中传入的 HTTPS 连接,您可以配置入口控制器,以解密网络流量并将解密后的请求转发到集群中暴露的应用程序。
配置公共入口控制器时,您可以选择应用程序的访问域。 如果使用 IBM提供的域 (例如 mycluster-<hash>-0000.us-south.containers.appdomain.cloud/myapp
),那么可以使用为 Ingress 子域创建的缺省 TLS 证书。 如果设置 CNAME 记录以将定制域映射到 IBM提供的域,那么可以为定制域提供您自己的 TLS 证书。
有关 TLS 证书的更多信息,请参阅 管理 TLS 证书和私钥。