PanMichael
作者PanMichael·2019-11-12 16:29
软件架构设计师·兴业数金

OpenShift Router配置重新加载机制

字数 3243阅读 4545评论 0赞 2

OpenShift的Router是几乎所有南北流量的入口,对它的运行机制的了解非常重要,尤其是Router的配置更新加载机制。在服务请求出现异常情况下,我们能够快速分析出问题的原因,及时修复,保证应用的连续性。本章主要介绍OpenShift Router的配置加载机制。

OpenShift路由默认是基于Haproxy实现的。当Pod有更新或者证书更新等情况时会重新加载Haproxy的配置,来保证集群的路由信息是最新的。重载配置是否会对当前在线业务产生影响,这是系统管理员担心的问题。

一、 Haproxy配置重载的过程

Haproxy在重新加载配置过程分两步。

  1. 生成最新的配置
  2. 重启Haproxy进程

Haproxy生成最新的配置

OpenShift上以下三种资源的改变会触发Haproxy配置的更新

  1. Routes改变
  2. Pod IP/Endpoint 改变
  3. 证书改变

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路由器优化方法

  1. 更新到3.9以上版本,支持无缝重载
  2. 使用路由分片方式,减少每个路由的策略,从而达到加快加载的目的
  3. 增大环境变量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进程一段时间。因为它要等待正在连接中的请求关闭,所以旧的进程将会挂起一段时间。这些请求只通过以下两种方式关闭:

  1. 客户端关闭
  2. 连接超时

OpenShift默认的连接超时时间为1h,可以通过降低环境变量ROUTER_DEFAULT_TUNNEL_TIMEOUT的值来减少Haproxy进程挂起时间,同时通过降低ROUTER_BACKEND_CHECK_INTERVAL环境变量,能够调整后序健康检查的时间。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广