OpenShif Route路由实现机制探究(1)
在前面一篇译文《蓝绿、A/B和金丝雀部署 —— 《DevOps with OpenShif》第3章 节选》中,利用OpenShift Route路由配置实现了蓝绿、A/B部署,在整个过程完成后通过界面或命令行可以看到有3个Route路由配置。
一直想了解OpenShif是如何实现服务路由,以及如何在创建/更新路由规则后动态更新配置动态生效,所以打算粗略翻翻OpenShif的源码,探究其Route路由实现机制。所谓“好奇害死猫”,不知道能否坚持做下来。 才学浅薄,一点点来吧……
先来瞧瞧OpenShift安装完毕后,默认的Router路由器是哪一个,上面这些Route路由规则配置转换成路由器的配置又是个什么样子。
(本系列博客使用minishift单机环境完成)
默认Router路由器使用的是哪一个?
让我们通过查看OpenShift Router对应Pod所使用的Docker镜像名称来初步判断其使用的是什么软件。
先look下Router Pod的名称,下面的命令在所有namespace命名空间以router关键字搜索对象:
$ oc get pods --all-namespaces | grep router
default router-1-xhc4f 1/1 Running 2 12d
看到有一个名称为router-1-xhc4f
的Pod,位于default
命名空间,应该对应的就是默认Router。
再让我们从正向路径来确认,按照OpenShift文档说明,查看默认Router的信息:
$ oc adm router --dry-run -o yaml --service-account=router
命令输出内容中有关于DeploymentConfig的配置,可以确定默认Router部署配置的名称是router
:
- apiVersion: v1
kind: DeploymentConfig
metadata:
creationTimestamp: null
labels:
router: router
name: router
template:
...
spec:
containers:
...
image: openshift/origin-haproxy-router:v3.9.0
...
...
再以router
为名称,查看DeploymentConfig配置内容,关注其对应的Deployment名称:
$ oc describe dc router -n default
Deployment #1 (latest):
Name: router-1
...
默认Router的Deployment名称是router-1
, 与上面查到Pod名称router-1-xhc4f
前缀相符,以OpenShift对象命名规则(也是Kubernetes命名规则),可以确定此Pod就是默认Router运行时。
确定Pod名称后,我们再来查下Pod对应的Docker镜像名称是什么:
$ oc get pods router-1-xhc4f -n default -o yaml | grep image
image: openshift/origin-haproxy-router:v3.9.0
镜像名称与上面DepoymentConfig配置内容中image
配置项一致,都是openshift/origin-haproxy-router:v3.9.0
从默认Router镜像名称上,得出其使用的是Haproxy负载均衡软件。
其实这么做有脱裤子放屁之嫌,默认Router是使用Haproxy的事实,在OpenShift文档中都有提及,比如:
获取Router配置文件
确认了默认Router的Pod名称,那就连接进去蹓跶蹓跶。
连接进入容器
$ oc -n default exec -ti router-1-xhc4f bash
上面的命令指定在命名空间default
中Podrouter-1-xhc4f
容器上执行bash
进入Shell,并以-ti
声明终端交互方式。
Router运行环境目录结构
连接进入Router Pod容器后,使用命令tree
查看Haproxy工作目录结构:
[inside pod]$ tree
.
├── bin
├── conf
│ ├── cert_config.map
│ ├── default_pub_keys.pem
│ ├── error-page-503.http
│ ├── haproxy.config
│ ├── haproxy-config.template
│ ├── os_edge_http_be.map
│ ├── os_http_be.map
│ ├── os_reencrypt.map
│ ├── os_route_http_expose.map
│ ├── os_route_http_redirect.map
│ ├── os_sni_passthrough.map
│ ├── os_tcp_be.map
│ └── os_wildcard_domain.map
├── Dockerfile
├── log
├── reload-haproxy
├── router
│ ├── cacerts
│ ├── certs
│ └── routes.json
└── run
├── haproxy.pid
└── haproxy.sock
从目录中的配置文件名称中,可再次确认OpenShift默认Router采用的是Haproxy。
让我们来看看它的配置文件,是如何实现前一篇译文《