Openshift Nginx Router替换默认Haprox
2019-01-31 本文已影响180人
潘晓华Michael
openshift-nginx
Nginx Plus版本的Dashboard
什么是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比较
Nginx官方比较表格如何替换Openshift默认Router
卸载当前Router
- 用system:admin登录集群
$ oc login -u system:admin
- 选择default项目
$ oc project default
- 备份现有的Router
$ oc get -o yaml service/router dc/router clusterrolebinding/router-router-role serviceaccount/router > default-router-backup.yaml
- 删除当前Router
$ oc delete -f default-router-backup.yaml
安装Nginx-Router
使用镜像xhuaustc/nginx-openshift-router:1.15
部署nginx router
$ oc adm router router --images=xhuaustc/nginx-openshift-router:1.15 --type='' --selector='node-role.kubernetes.io/infra=true'
添加Stub Status页面的查看权限
在Router Pod所部署的结点开通1936端口的访问权限
$ sudo iptables -I OS_FIREWALL_ALLOW -p tcp -m tcp --dport 1936 -j ACCEPT
在浏览器下查看以下链接$ROUTER_IP:1936/stub_status
添加Prometheus监控支持
- 运行如下命令,添加nginx exporter
$ 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想着的标注
$ oc annotate service router --overwrite prometheus.io/port=9113 prometheus.io/scrape=true
此时openshift集群中的prometheus就可以发现nginx exporter的数据
卸载Nginx Router
和卸载之前默认的Router一样,只需要将对应的Object删除即可
$ 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节点系统配置
net.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
测试工具: ab
测试命令行:ab [-k] -c 4000 -n 1000000 http://xx.com/index.html
with -k | Type | 页面大小 | RPS |
---|---|---|---|
Y | Svc | 4KB | 55050 |
Y | Router | 4KB | 17862 |
N | Svc | 4KB | 14866 |
N | Router | 4KB | 18171 |
Y | Svc | 500B | 72613 |
Y | Router | 500B | 17813 |
N | Svc | 500B | 14224 |
N | Router | 500B | 18527 |
补充说明
目前测试结果与Openshift默认的Haproxy Router结果差不多,后序与Nginx工程师一起完善优化后,再作更新。
说实话,对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