Openshift-Nginx-Router替换默认Haproxy-Router
什么是Router
- Router在Openshift集群的一个不可非常重要的组件,它作为外部请求访问集群内部资源的入口,为Openshift上的应用提供边缘负载均衡。
- Router可以为应用提供HTTP和websocket流量的负载均衡,同时支持HTTPS连接。Openshift上有一个特殊的资源叫Route,通过它可以方便地配置Router。
- Openshift集群默认使用Haproxy应用作为Router的实现,它通过容器的形式运行在相应的Node上,同时Router Pod网络使用的宿主机的网络,即
hostNetwork=true
。 - 除了Haproxy,我们还可以使用Nginx来实现Router,这也是本文的重点。
- 不管是Haproxy还是Nginx方案都是使用了软件负载均衡器,还可以使用F5等硬件负载均衡器来替换Router,达到性能的提升。
Nginx Router与默认Router比较
如何替换Openshift默认Router
卸载当前Router
- 用system:admin登录集群
1
$ oc login -u system:admin
- 选择default项目
1
$ oc project default
- 备份现有的Router
1
$ oc get -o yaml service/router dc/router clusterrolebinding/router-router-role serviceaccount/router > default-router-backup.yaml
- 删除当前Router
1
$ oc delete -f default-router-backup.yaml
安装Nginx-Router
使用镜像xhuaustc/nginx-openshift-router:1.15
部署nginx router
1 | $ oc adm router router --images=xhuaustc/nginx-openshift-router:1.15 --type='' --selector='node-role.kubernetes.io/infra=true' |
添加Stub Status页面的查看权限
在Router Pod所部署的结点开通1936端口的访问权限
1 | $ sudo iptables -I OS_FIREWALL_ALLOW -p tcp -m tcp --dport 1936 -j ACCEPT |
在浏览器下查看以下链接$ROUTER_IP:1936/stub_status
添加Prometheus监控支持
- 运行如下命令,添加nginx exporter
1
2
3
4
5
6
7
8
9
10
11
12
13
14$ oc patch dc/router -p 'spec:
template:
spec:
containers:
- image: nginx/nginx-prometheus-exporter:0.1.0
name: nginx-prometheus-exporter
ports:
- name: prometheus
containerPort: 9113
args:
- -web.listen-address
- :9113
- -nginx.scrape-uri
- http://127.0.0.1:1936/stub_status' - 在router service添加exporter想着的标注此时openshift集群中的prometheus就可以发现nginx exporter的数据
1
$ oc annotate service router --overwrite prometheus.io/port=9113 prometheus.io/scrape=true
卸载Nginx Router
和卸载之前默认的Router一样,只需要将对应的Object删除即可
1 | $ oc delete service/router dc/router clusterrolebinding/router-router-role serviceaccount/router |
Nginx Router性能测试
测试环境:
- Openshift 3.11 网络插件为ovs-subnet
- openshift集群物理环境配置为:3 master + 2 Router Node + 2 Computer Node。每台物理机的配置都是cpu 48核/内存 384G 网卡为10Gbps
- 访问方式,在ab测试机器上,直接在/etc/hosts中绑定 应用域名 与 Router1的IP
- 应用为一个Nginx页面,页面大小为3.2KB,Pod数为10
- Router节点系统配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 36768
net.core.somaxconn = 36768
net.core.wmem_default = 8588608
net.core.rmem_default = 8588608
net.core.rmem_max = 16877216
net.core.wmem_max = 16877216
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3376800
net.ipv4.ip_local_port_range = 1024 65535 - Router环境变量配置
- WORKER_RLIMIT_NOFILE: 65535
- KEEPALIVE_REQUESTS: 10000000
- WORKER_PROCESSES: 8
- WORKER_CPU_AFFINITY: 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001
- ROUTER_MAX_CONNECTIONS: 80000
- Route配置Annotations
nginx.router.openshift.io/keepalive: 300
测试工具: wrk
测试命令行:wrk -t 40 -c 5000 -d 30s http://xx.com/index.html
Router类型 | Type | 页面大小 | RPS | 超时数量 |
---|
- |Svc | 4KB | 58901| 3062/2364808
F5 | Router| 4KB | 29848 | 15854/898446
Haproxy | Router| 4KB | 32313| 3702/972665
Nginx | Router| 4KB | 33943| 3535/1021704 - |Svc | 500B | 222033 | 42/6683188
F5 | Router| 500B | 115435| 10829/3473097
Haproxy | Router| 500B | 48245| 7484/1452092
Nginx| Router| 500B | 166592| 2479/5014470
测试结果说明
- F5所在的测试环境与Haproxy/Nginx Router的环境有些不一样,F5在使用千M网连接着集群,F5作部分参考
- SVC实际为iptables作负载均衡,所以理论上性能是最好的,测试结果也验证了这一点
- 对于4KB的页面,Haproxy/Nginx结果相关不大
- 对于500B的页面,Nginx的性能明显高于其它测试环境
- 就性能而言,Nginx相对于默认的Router确实有提高
后序还会对配置做进一步完善优化,到时对测试数据再作更新。
说实话,对Nginx Router还是很期待的。
参考文献
OpenShift Ecosystem: Implementing the NGINX Proxy Model on Red Hat OpenShift
Introducing NGINX and NGINX Plus Routers for OpenShift Container Platform 3.10
NGINX Plus Router for OpenShift
nginxinc/nginx-openshift-router
nginx-openshift-router/docs/nginx-oss-router-install.md
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Michael Blog!
评论