为什么要自定义Router

  • Openshift的Router节点其实就是一个Haproxy容器应用,这个已经不是什么秘密了。我们平常使用时,不需要关心Haproxy的配置,因为它的默认配置完全满足绝大多数情况的需求。
  • 但是它的默认配置并没有把最大的性能发挥出来,这时就需要我们对Haproxy的配置进行自定义了。
  • 如果你需要实现一些新的功能,比如说将Mysql通过Router对外提供服务等

怎样自定义Router

  • Router Pod根据haproxy-config模板创建haproxy.conf配置文件,默认文件为/var/lib/haproxy/conf/haproxy-config.template
  • Router Haproxy镜像启动时会根据环境变量TEMPLATE_FILE来选择最终使用的模板文件
  • 向Router Pod中放入自定义的模板文件,并将它的路径传给环境变量TEMPLATE_FILE
  • 模板文件中的相关函数
函数 说明
processEndpointsForAlias(alias ServiceAliasConfig, svc ServiceUnit, action string) []Endpoint 返回所有可用的endpoints,如果action为shuffle,那返回结果会打乱顺序
env(variable, default …string) string 获取环境变量,如果没有环境变量,使用第二个参数的值,如果第二个参数没设置,返回空字符串
matchPattern(pattern, s string) bool 第一个参数是正则表达式,第二个参数为校验字符串,如果第二个参数满足正则规则,则返回True,否则返回False
isInteger(s string) bool 检查字符串是否为数字格式
firstMatch(s string, allowedValues …string) bool 将一个字符串在允许的字符串列表中从左到右匹配,返回最新匹配的字符串
matchValues(s string, allowedValues …string) bool 如果字符串与给定的一组字符串中的字符串有匹配,则返回True,否则返回False
generateRouteRegexp(hostname, path string, wildcard bool) string 生成一个 与主机名和路径匹配的正则表达式
genCertificateHostName(hostname string, wildcard bool) string 为匹配证书生成主机名
isTrue(s string) bool 如果给定的字符串中有’true’则返回True,否则False

自定义Router配置实战

  1. 导出Router默认的模板文件

    1
    $ oc rsh router-1-pod -n default cat haproxy-config.template > haproxy-config.template
  2. 更改haproxy-config.template,添加nbthread支持 3.10以上版本已添加了该变量

    1
    2
    3
    4
    5
    ...
    global
    nbthread {{env "ROUTER_NBTHREAD" "1"}}
    cpu-map auto:1/1-{{env "ROUTER_NBTHREAD" "1"}} 1-{{env "ROUTER_NBTHREAD" "1"}}
    ...

    环境变量,3.11版本主要更新以下两个
    ROUTER_THREADS
    ROUTER_MAX_CONNECTIONS 默认值是20000

  3. 创建ConfigMap

    1
    $ oc create configmap customrouter --from-file=haproxy-config.template
  4. 挂载ConfigMap,设置环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #### *3.9* 版本
    $ oc volumes dc/router --add --overwrite \
    --name=config-volume \
    --mount-path=/var/lib/haproxy/conf/custom \
    --source='{"configMap": { "name": "customrouter"}}'
    $ oc set env dc/router \
    TEMPLATE_FILE=/var/lib/haproxy/conf/custom/haproxy-config.template

    #### *3.11* 版本
    $ oc set volumes dc/router --add --overwrite \
    --name=config-volume \
    --mount-path=/var/lib/haproxy/conf/custom \
    --source='{"configMap": { "name": "customrouter"}}'
    $ oc set env dc/router \
    TEMPLATE_FILE=/var/lib/haproxy/conf/custom/haproxy-config.template
  5. 等待Router自动重启,使用新的配置模板

    1
    $ oc rsh router-2-pod -n default cat haproxy.conf

测试结果

通过设置环境变量ROUTER_NBTHREAD的值,使用Jmeter对应用进行压力测试

ROUTER_NBTHREAD Avg(ms) Min(ms) Max(ms) Error TPS(/s)
1 194 0 8383 0 18322
2 133 0 15602 0 31160
4 127 0 7553 0 47049
8 138 0 14259 0 41995
16 163 0 10069 1(0%) 23979
从中可以看出,不同的nbthread对Router容量的影响非常大,当nbthread=4时,容量达到默认的nbthread=1的2倍。

参考文章:
Openshift 自定义Router的haproxy配置
Openshift 容器平台负载测试
Haproxy多线程
Haproxy性能优化