OpenShift的Router是几乎所有南北流量的入口,对它的运行机制的了解非常重要,尤其是Router的配置更新加载机制。在服务请求出现异常情况下,我们能够快速分析出问题的原因,及时修复,保证应用的连续性。本章主要介绍OpenShift Router的配置加载机制。
OpenShift路由默认是基于Haproxy实现的。当Pod有更新或者证书更新等情况时会重新加载Haproxy的配置,来保证集群的路由信息是最新的。重载配置是否会对当前在线业务产生影响,这是系统管理员担心的问题。
一、 Haproxy配置重载的过程
Haproxy在重新加载配置过程分两步。
- 生成最新的配置
- 重启Haproxy进程
Haproxy生成最新的配置
OpenShift上以下三种资源的改变会触发Haproxy配置的更新
- Routes改变
- Pod IP/Endpoint 改变
- 证书改变
OpenShift Route有一个配置模板文件,最终的配置会根据这个模板文件来创建。该模板文件,默认路径为/var/lib/haproxy/conf/haproxy-config.template
,也可以通过环境变量TEMPLATE_FILE来指定。
$ oc exec router-3-r2scd cat haproxy-config.template | head -n5
{{/*
haproxy-config.cfg: contains the main config with helper backends that are used to terminate
encryption before finally sending to a host_be which is the backend that is the final
backend for a route and contains all the endpoints for the service
*/}}
...
Haproxy配置的加载过程
OpenShift Router Pod中运行着两个进程
$ oc exec router-3-r2scd -n default -- ps -ef
UID PID PPID C STIME TTY TIME CMD
1000000+ 1 0 0 Nov07 ? 00:00:08 /usr/bin/openshift-router
1000000+ 5076 1 0 Nov07 ? 00:00:02 /usr/sbin/haproxy -f /var/lib/haproxy/conf/haproxy.config -p /var/lib/haproxy/run/haproxy.pid -x /var/lib/haproxy/run/haproxy.sock -sf 5061
...
其中Haproxy进程的父进程是openshift-router,它管理着haproxy进程。openshift-router将通过Master API查询Route、EndPoint及证书的状态,生成最新的Haproxy配置,并执行重新加载操作。在每次重新加载后,haproxy 进程将会被终止并重新启动,haproxy的进程ID将会变化。
$ oc exec router-3-r2scd -n default -- ps -ef
UID PID PPID C STIME TTY TIME CMD
1000000+ 1 0 0 Nov07 ? 00:00:08 /usr/bin/openshift-router
1000000+ 5208 1 0 Nov07 ? 00:00:02 /usr/sbin/haproxy -f /var/lib/haproxy/conf/haproxy.config -p /var/lib/haproxy/run/haproxy.pid -x /var/lib/haproxy/run/haproxy.sock -sf 5148 5193
...
二、 openshift-router环境变量
openshift-router接受很多环境变量,来控制haproxy的配置,以及haproxy的重载过程。
RELOAD_SCRIPT
重载haproxy的脚本,默认地址为/var/lib/haproxy/reload-haproxy
。一般不作更改。openshift-router进程将会隔一定的时间周期去运行该脚本,其中时间周期通过环境变量RELOAD_INTERVAL来设置,默认是5s。
RELOAD_INTERVAL
设置openshift-router进程执行RELOAD_SCRIPT的时间周期,默认为5s。将它调大可以减少openshift-router重载haproxy的次数。
三、 加快Haproxy的重载速度
对Haproxy来说,快速完成配置的加载非常重要。这样客户端就不会达到其SYN重试限制,从而导致连接失败。
OpenShift路由器优化方法
- 更新到3.9以上版本,支持无缝重载
- 使用路由分片方式,减少每个路由的策略,从而达到加快加载的目的
- 增大环境变量
RELOAD_INTERVAL
值,减少周期性Reload调用
检查重载速度
通过检查HAProxy的重载速度,可以帮助我们确认连接问题是否是由于重新加载引起的。prometheus中会保存haproxy的加载时间信息到监控项template_router_reload_seconds
中。
sh-4.2$ curl -s http://admin:aAIKAyrX1s@localhost:1936/metrics | grep template_router_reload_seconds
# HELP template_router_reload_seconds Measures the time spent reloading the router in seconds.
# TYPE template_router_reload_seconds summary
template_router_reload_seconds{quantile="0.5"} NaN
template_router_reload_seconds{quantile="0.9"} NaN
template_router_reload_seconds{quantile="0.99"} NaN
template_router_reload_seconds_sum 7.299802469000001
template_router_reload_seconds_count 140
看到重新加载总数为140,重新加载总和约为7.3秒。平均装载时间为7.3 / 140 = 0.05秒,相当快!
自动关闭Router重载后保留的旧Haproxy进程
OpenShift 3.9以上版本的Router在重载Haproxy后,会保留旧的Haproxy进程一段时间。因为它要等待正在连接中的请求关闭,所以旧的进程将会挂起一段时间。这些请求只通过以下两种方式关闭:
- 客户端关闭
- 连接超时
OpenShift默认的连接超时时间为1h,可以通过降低环境变量ROUTER_DEFAULT_TUNNEL_TIMEOUT的值来减少Haproxy进程挂起时间,同时通过降低ROUTER_BACKEND_CHECK_INTERVAL环境变量,能够调整后序健康检查的时间。
网友评论