Router vs Route详解 route和router的区别是什么

一、OpenShift 为什么需要 Router 和 Route?
顾名思义,Router 是路由器,Route 是路由器中配置的路由 。OpenShift 中的这两个概念是为了解决从集群外部(就是从除了集群节点以外的其它地方)访问服务的需求 。不晓得为什么OpenShift 要将Kubernetes 中的 Ingress 改为 Router,我倒是觉得 Ingress 名字更贴切 。
从外部通过 router 和从内部通过 servide 访问 pod 中的应用两个过程的简单的示意图如下:

Router vs Route详解 route和router的区别是什么


上图中,某个应用的三个pod 分别位于 node1,node2 和 node3 上 。OpenShift 中有三层IP地址概念:
  • pod 自己的 IP 地址,可以类比为 OpenStack 中虚拟机的固定IP 。它只有在集群内才有意义 。
  • service 的 IP 地址 。Service 通常有 ClusterIP,这也是一种集群内部的IP 地址 。
  • 应用的外部 IP 地址,可以类比为OpenStack 中的浮动IP,或者IDC IP(和浮动IP 之间是NAT 映射关系) 。

因此,要从集群外部访问 pod 中的应用,无非两种方式:
  • 一种是利用一个代理(proxy),把外部 IP 地址转化为后端的 Pod IP 地址 。这就是 OpenShift router/route 的思路 。OpenShift 中的 router 服务,是一个运行在特定节点(通常是基础架构节点)上的集群基础服务,由集群管理员负责创建和管理 。它可以有多个副本(pod) 。router 中可有多个 route,每个 route 能通过外部HTTP 请求的域名找出其后端的 pod 列表,并进行网络包的转发 。也就是将pod 中的应用暴露到外网域名,使得用户可以外面通过域名访问到应用 。这实际上是一种七层负载均衡器 。OpenShift 默认采用 HAProxy 来实现,当然也支持其它实现,比如 F5.
  • 另一种是将服务直接暴露到集群外 。这种方式具体会在『服务 Service』那一篇文章中详细解释 。

二、OpenShift 如何利用 HAProxy 实现 router 和 route?
2.1 Router 部署
使用 ansible 采用默认配置部署 OpenShift 集群时,在集群 Infra 节点上,会以 Host networking 方式运行一个 HAProxy 的 pod,它会在所有网卡的 80 和 443 端口上进行监听 。
[root@infra-node3 cloud-user]# netstat -lntp | grep haproxytcp 0 0 127.0.0.1:10443 0.0.0.0:* LISTEN 583/haproxy tcp 0 0 127.0.0.1:10444 0.0.0.0:* LISTEN 583/haproxy tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 583/haproxy tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 583/haproxy
其中,172.0.0.1 上的 10443 和 10444 是HAproxy 自己使用的 。下文会有解释 。
因此,在每个 infra 节点上,只能有一个 HAProxy pod,因为这些端口只能被占用一次 。如果调度器找不到满足要求的节点,则router 服务的调度就会失败:
0/7 nodes are available: 2 node(s) didn't have free ports for the requested pod ports, 5 node(s) didn't match node selector
OpenShift HAProxy Router 支持两种部署方式:
  • 一种是常见的单Router 服务部署,它有一个或多个实例(pod),分布在多个节点上,负责整个集群上部署的服务的对外访问 。
  • 另一种是分片(sharding)部署 。此时,会有多个 Router 服务,每个Router 服务负责指定的若干project,两者之间采用标签(label)进行映射 。这是为了解决单个 Router 的性能不够问题而提出的解决方案 。

OpenShift 提供了 oc adm router 命令来创建 router 服务 。
创建router:
[root@master1 cloud-user]# oc adm router router2 --replicas=1 --service-account=routerinfo: password for stats user admin has been set to J3YyPjlbqf--> Creating router router2 ... warning: serviceaccounts "router" already exists clusterrolebinding.authorization.openshift.io "router-router2-role" created deploymentconfig.apps.openshift.io "router2" created service "router2" created--> Success

推荐阅读