背景

  • Openshift在集群部署时需要额外提供一个负载均衡器,该负载均衡器对master api及router haproxy中的80与443服务进行负载,实现高可用。
  • 如果在IaaS上部署Openshift集群的话,我们很自然地会使用IaaS的LB服务,直接对LB作TCP端口负载就解决问题了,既实现了需要的负载均衡,而且还有健康检查,负载高可用,非常方便。
  • 但是我们的Openshift集群并不是部署在IaaS上,而是额外部署。IaaS上的LB无法直接将集群中的服务器作为监听器的后端进行负载,这时我们就需要在Openshift集群下额外独立部署负载均衡器。考虑到保证负载均衡器的高可用性,及监控等,这会是一个比较复杂的过程。
  • 那么我们是否可以结合IaaS上的LB现有的机制,制定一套既方便部署,又高可用的方案呢?答案是肯定的。
  • 该篇就是介绍如何结合IaaS的LB与代理应用Nginx实现Openshift高可用的外部负载均衡

原理

  • 负载均衡器应用,首先大家想到的最多的两款应用是:Nginx与Haproxy,我们选用了Nginx。
  • 将IaaS的LB与Nginx结合的思路也很简单。在IaaS上部署两台主机,上面部署好代理应用,将代理的后端设置为Openshift的服务器,同时将这两台服务器作为IaaS上的LB的监听器的后台。
    IaaS LB与Nginx结合提供外部负载

部署操作

IaaS上资源准备

  1. 创建VPC IaaS

  2. 创建私网 IaaS

  3. 在私网下创建两台主机(instance1, instance2) IaaS

  4. 创建一个LB Iaas

    搭建应用与配置

  5. LB上创建三个监听器(8443/TCP, 443/TCP, 80/TCP) IaaS

  6. LB的三个监听器的后端都配置为两台Instance IaaS

  7. 在instance上安装nginx Instance

    1
    [root@i-8 root]# yum install nginx
  8. 配置nginx Instance
    openshift route服务器IP: 99.3.1.11、99.3.1.12
    openshift master服务器IP: 99.3.1.1、99.3.1.2、99.3.1.3

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    [root@i-8 conf.d]# cat /etc/nginx/nginx.conf
    ...
    events {
    worker_connections 1024;
    }
    stream{
    include /etc/nginx/conf.d/tcp.conf;
    }
    http {
    ...
    [root@i-8 conf.d]# cat /etc/nginx/conf.d/tcp.conf
    upstream nginx80{
    server 99.3.1.11:80;
    server 99.3.1.12:80;
    }
    server {
    listen 80;
    proxy_pass nginx80;
    }

    upstream nginx443{
    server 99.3.1.11:443;
    server 99.3.1.12:443;
    }
    server {
    listen 443;
    proxy_pass nginx443;
    }

    upstream nginx8443{
    server 99.3.1.1:8443;
    server 99.3.1.2:8443;
    server 99.3.1.3:8443;
    }
    server {
    listen 8443;
    proxy_pass nginx8443;
    }
  9. 启动nginx

    1
    2
    [root@i-8 root]# systemctl start nginx
    [root@i-8 root]# systemctl enable nginx

    至此一个可监控、高可用且具有弹性伸缩功能的外部负载均衡器就完成了。

演示方法

与之前访问openshift的服务一样,只是将域名解析的IP指向IaaS的LB就可以了
所有服务都能正常访问。同时对于不同的项目,可以通过创建不同的LB,来实现了负载均衡的扩容,Nginx应用也可以通过创建更多的Instance进行扩容。

补充说明

感谢有朋友提出了以下问题:
“nginx不好用,除非nginx plus,否则一个master api不可用,还是会访问到那个节点。haproxy配置也很简单,可以有健康检查,如果熟悉的话,最好使用haproxy来作为代理应用。”
朋友提出的问题确实是一个很严重的问题,我对haproxy确实不太熟悉~~。
但是朋友说的这个问题其实不必太担心,因为nginx默认的轮询方式的请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。所以nginx自己会对openshift的服务作了检查,来避免朋友提出的问题。
我也单独对nginx的这个健康检查作了验证,确实是有效的。
再次感谢提出问题的朋友,后序我也找时间使用haproxy作下测试。

Haproxy的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
global
......
maxconn 20000
nbthread 2
......
frontend f_8443 *:8443
use_backend b_8443
mode tcp

backend b_8443
mode tcp
balance roundrobin
server master1 99.3.1.1:8443
server master2 99.3.1.2:8443
server master3 99.3.1.3:8443

frontend f_443 *:443
use_backend b_443
mode tcp

backend b_443
mode tcp
balance roundrobin
server infra1 99.3.1.11:443
server infra2 99.3.1.12:443

frontend f_80 *:80
use_backend b_80
mode tcp

backend b_80
balance roundrobin
server infra1 99.3.1.11:80
server infra2 99.3.1.12:80