一个关于K8S的故事
为什么要自定义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配置实战
导出Router默认的模板文件
$ oc rsh router-1-pod -n default cat haproxy-config.template > haproxy-config.template
更改haproxy-config.template,添加nbthread支持
3.10以上版本已添加了该变量
... global nbthread {{env "ROUTER_NBTHREAD" "1"}} cpu-map auto:1/1-{{env "ROUTER_NBTHREAD" "1"}} 1-{{env "ROUTER_NBTHREAD" "1"}} ...
创建ConfigMap
$ oc create configmap customrouter --from-file=haproxy-config.template
挂载ConfigMap,设置环境变量
#### *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
等待Router自动重启,使用新的配置模板
$ 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倍。
作者:潘晓华Michael
链接:https://www.jianshu.com/p/add9e0d2ed31