openshift-nginx

什么是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的原理图

Nginx Router与默认Router比较

Nginx官方比较表格

如何替换Openshift默认Router

卸载当前Router

  1. 用system:admin登录集群
    1
    $ oc login -u system:admin
  2. 选择default项目
    1
    $ oc project default
  3. 备份现有的Router
    1
    $ oc get -o yaml service/router dc/router clusterrolebinding/router-router-role serviceaccount/router > default-router-backup.yaml
  4. 删除当前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监控支持

  1. 运行如下命令,添加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'
  2. 在router service添加exporter想着的标注
    1
    $ oc annotate service router --overwrite prometheus.io/port=9113 prometheus.io/scrape=true
    此时openshift集群中的prometheus就可以发现nginx exporter的数据

卸载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
    18
    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

测试工具: 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

Nginx Plus版本的Dashboard

测试结果说明

  • 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