Rainbond 作为一款云原生应用管理平台,天生带有引导南北向网络流量的分布式网关 rbd-gateway。rbd-gateway 组件,实际上是好雨科技团队开发的一种 Ingress Controller 实现。那么作为集群中部署的服务的网络流量出入口,如何为它设置反向代理呢?这篇文章会做出详细的解读。

实际场景

Rainbond 在企业内部一般会扮演云原生应用管理平台的角色,通过一站式开箱即用的使用体验,可以大幅度降低企业运维人员的管理成本。在网关策略方面,免去了运维人员配置相对复杂的 Service 、Ingress 资源配置文件的麻烦,在图形化界面下, 即可实现 L4 或 L7 的网关策略配置。

Rainbond 的网关组件 rbd-gateway 天生支持分布式部署。这就意味着,我们可以在外部流量和 Rainbond 网关集群之间设立负载均衡,来进行流量的分发,使网关具备容错能力的同时,成倍提升其抗并发的能力。

这种负载均衡可以是物理的,也可以是软件定义的,当然也可以是云服务商提供的。今天重点探讨如何使用 Nginx 实现的全局负载均衡器实现对网关的负载。

负载均衡与VIP的对比

当企业没有负载均衡时,也可以直接将 Rainbond 的网关直接暴露给外部访问流量,在这种情况下,我们一般会为集群部署 VIP 虚拟IP,这个 IP 地址可以在多个网关节点之间漂移,当网关节点发生故障时提供高可用特性。通过将域名解析指向 VIP,网关节点集群拥有了一个统一的访问入口。但是相对于负载均衡而言,VIP 方案还是有些劣势的。

  • VIP 方案不提供高并发:由于VIP同时只会绑定在一个网关节点上,所以同一时刻,只会有一个网关节点接受流量。负载均衡方案可以将流量分发到每一个网关节点,故而提供了高并发能力。
  • VIP 方案相当于将网关直接暴露向公网,这在安全方面有一定的隐患。负载均衡同时也是一种反向代理,可以将网关节点保护在其身后。

我们可以得出结论:当企业内部存在负载均衡设施的时候,就不再需要为网关节点集群设置 VIP 。

Nginx 负载均衡特性

Nginx 提供了强大的流量转发能力。作为负载均衡时,Nginx 提供的稳定性和性能表现都堪称惊艳,甚至不逊色硬件负载均衡。这些特性,使它成为了大部分企业在软件定义负载均衡领域的第一选择。它可以同时提供 L4 、L7 层负载均衡能力,支持 SSL 证书、多种负载均衡算法等高级特性。

L4负载均衡

L4 负载均衡策略,其目的是在 Nginx 负载均衡的配置中,实现负载均衡的端口,到后端所有网关节点的指定端口的流量转发。一般用于最终业务并非使用 Http 协议工作的场景。比如 Mysql 业务对外暴露 3306 端口的场景。

Rainbond网关配置

在 Rainbond 一侧,需要在网关策略中,为 Mysql 一键开启如下的设置:

对上述配置作出如下解释:

- 端口号: 3306                # Mysql 业务监听的端口
- 端口协议: mysql # 业务端口协议,可选值包括 TCP、UDP、HTTP、MYSQL、Grpc,此处 MYSQL 可以理解为 TCP中的一种
- 对外服务: 开启 # 用户通过开启此开关来将 Mysql 的 3306 端口对外暴露服务
- 访问策略: 0.0.0.0:10001 # 网关的代理策略,这里意味着将 Mysql 的 3306 端口,通过所有网关节点的 10001 端口对外代理

负载均衡配置

在负载均衡一侧,则需要添加一段 Nginx 配置,将所有网关的 10001 端口,通过四层代理,对外暴露。

Nginx 的配置文件,需要在最顶层创建一个 stream{} 块。这一句翻译自 Nginx 官方文档,实际操作时,其意义是不要将 stream 放入到 http 块中去。

继续在 stream{} 块中分别创建 upstream{}server{} 块。

stream {
upstream lbserver {
server 192.168.0.1:10001;
server 192.168.0.2:10001;
server 192.168.0.3:10001;
} server {
listen 10001;
proxy_pass lbserver;
proxy_connect_timeout 1s;
proxy_timeout 3s;
}
}

重新加载配置文件之后,就可以通过 Nginx 对外IP地址的 10001 端口,访问到 Mysql 业务的 3306 端口了。

L7负载均衡

L7负载均衡,一般用于 Http 业务的处理。当我们希望通过一个域名,可以访问到部署在 Rainbond 上的 Http 业务时,这种用法就会派上用场。接下来聊一聊如何在负载均衡上,处理 Http 请求。

实际上,Rainbond 的网关节点也是一种负载均衡,网关节点负载均衡是为了将流量分发到运行于 Rainbond 集群中的业务实例上去。根据网关所使用的负载均衡策略,我们可以在使用 L7负载均衡的情况下,继续细分两种场景:

  • 网关使用 L4 负载均衡
  • 网关使用 L7 负载均衡

而这两种场景下,我们都希望通过一个解析到 Nginx 负载均衡对外 IP 地址的域名,访问到部署于 Rainbond 集群中的 web 服务。假定这个域名是 index.guox.grapps.cn .

网关使用 L4 负载均衡

网关使用 L4 负载均衡时,Rainbond 一侧的配置是不需要进行调整的。接下来的用例,我使用一个工作于 80 端口的 web 服务作为示例。依然在 tcp 协议下,开启访问策略。

此时,web 服务的 80 端口会通过网关的 10002 端口暴露出来。

而在 Nginx 负载均衡一侧,则需要基于域名配置一个虚拟服务器(Virtual Servers)。并将所有的网关节点的 10002 端口作为这一虚拟服务器的上游。

Nginx 的配置文件,在 http{} 块中进行配置,分别创建 server{}upstream{}

upstream lbserver {
server 192.168.0.1:10002;
server 192.168.0.2:10002;
server 192.168.0.3:10002;
} server {
listen 80;
server_name index.guox.grapps.cn; location / {
proxy_pass http://lbserver;
}
}

重新加载配置文件后,访问 http://index.guox.grapps.cn/ 就可以访问到 web 服务的主页。

网关使用 L7 负载均衡

网关使用 L7 负载均衡时,我们需要为 web 服务的 80 端口绑定目标域名,在端口协议为 http 时,点击添加域名即可添加目标域名。

即使这个域名并没有直接解析到 Rainbond 的网关上,我们依然需要绑定这个域名。因为 Rainbond 网关在 7 层工作时,需要通过域名来决定将流量转发到哪个服务实例上去。

那么如何将这个域名信息传递到 Rainbond 网关上去呢?答案是 proxy_set_header HOST $host 。 Nginx 负载均衡在接受到带有指定域名的请求时,可以将域名信息编辑到 header 信息中向后方的 Rainbond 网关传递。

Nginx 的配置文件需要添加这一配置。

upstream lbserver {
server 192.168.0.1:80;
server 192.168.0.2:80;
server 192.168.0.3:80;
} server {
listen 80;
server_name index.guox.grapps.cn; location / {
proxy_pass http://lbserver;
proxy_set_header HOST $host # 将域名信息保存在 HOST 传递给下一层代理
}
}

优劣对比

L7 作为更高级的协议,提供了端口复用、TLS加密以及基于HTTP协议实现的各种高级功能。L4 是更通用的协议,所有基于 TCP/IP 协议栈实现的业务都可以使用。对于最外层的 Nginx 负载均衡而言,无论是 L4 还是 L7 都有各自合适的使用场景,所以并没有优劣之分。用户根据自己的需要被访问的业务类型判断:Http 业务使用 L7,其余情况使用 L4 。

但是,在最外层的 Nginx 使用 L7 负载均衡时,对于 Rainbond 网关使用哪一层的负载均衡策略是有区别的。在这里我推荐网关使用 L4 负载均衡。因为在实现同样效果的前提下,L4 比 L7 的开销更小。

一点扩展

当为一个基于 http 协议工作的端口开启对外服务的时候,Rainbond 会默认生成一个可以被直接访问的域名,比如下图中的 http://80.gr6538fd.0c9yg42x.695d35.grapps.cn/ 。但是我们今天并没有探讨直接通过网关分配域名的访问方式,关于这个自动生成域名的实现机制,感兴趣的同学请关注 详解 Rainbond Ingress 泛解析域名机制

在 Rainbond 网关策略管理中,对同一个端口,是可以同时绑定多个访问策略的。下图中既有基于域名的 L7 访问策略,也有基于 IP 端口转发的 L4 访问策略。


Rainbond是一个开源的云原生应用管理平台,使用简单,不需要懂容器和Kubernetes,支持管理多个Kubernetes集群,提供企业级应用的全生命周期管理,功能包括应用开发环境、应用市场、微服务架构、应用持续交付、应用运维、应用级多云管理等。

为 Rainbond Ingress Controller 设置负载均衡的更多相关文章

  1. k8s中的ingress使用上层负载均衡进行设置访问

    注意:这种情况下需要有个前提条件,也就是ingress-nginx-controller安装后的service是NodePort或者hostNetwork模式,而不能是ClusterIP,因为负载均衡 ...

  2. Nginx 设置负载均衡

    1. 在nginx配置文件目录下另外单独创建一个文件用于管理负载均衡配置,这里起名为 fzjh.conf vim /etc/nginx/fzjh.conf #在文件下添加以下内容 upstream m ...

  3. nginx设置负载均衡

    ...... why负载均衡,随着企业业务增长和海量请求,给服务端造成海量并发,导致响应不及时需扩容后端服务,前端需要负载均衡,均摊请求,让服务端吞吐请求的能力提升 单点服务方式,一个点挂掉整个服务就 ...

  4. 使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡

    运行和管理跨机器集群的大规模的容器微服务应用是一个极具挑战的任务.Kubernetes 提供了一个强大的容器编排解决方案,从而帮助我们迎接这个挑战.它包含了一些重要特性,比如容错,自动伸缩,滚动升级, ...

  5. Nginx负载均衡和反向代理设置

    Nginx负载均衡: 格式: upstream 别名 {    #别名一般要有意义,能看出是做什么的 server ip:端口;    #要实现负载的服务器的ip.端口号}  例: upstream ...

  6. Nginx负载均衡和Keepalived的安装设置

    一.Nginx设置负载均衡 (1)upstream的配置 http { upstream backend { #这里设置后台分发的服务器族群,有多少个可以添加,同时设置查询策略 server 192. ...

  7. 实操教程丨如何在K8S集群中部署Traefik Ingress Controller

    注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...

  8. 用apache和tomcat搭建集群,实现负载均衡

    型的企业应用每天都需要承受巨大的访问量,在着巨大访问量的背后有数台服务器支撑着,如果一台服务器崩溃了,那么其他服务器可以使企业应用继续运行,用户对服务器的运作是透明化的,如何实现这种透明化呢?由如下问 ...

  9. springcloud(十三):Ribbon客户端负载均衡实例

    一.采用默认的负载均衡策略:RoundRobinRule 轮询策略 1.修改提供者原的控制类 在之前的eureka-client-provider项目的CenterController.java中加入 ...

随机推荐

  1. 解决boa网页操作出现502 Bad Gateway The CGI was not CGI/1.1 compliant的一种可能

    最近在把一套网页操作的接口从原来Android5.0上移植到Android7.0上. 客户端连接验证的时候主页显示异常 502 Bad Gateway The CGI was not CGI/1.1 ...

  2. Luogu P3758 [TJOI2017]可乐 | 矩阵乘法

    题目链接 让我们先来思考一个问题,在一张包含$n$个点的图上,如何求走两步后从任意一点$i$到任意一点$j$的方案数. 我们用$F_p(i,j)$来表示走$p$步后从$i$到$j$的方案数,如果存储原 ...

  3. hdu 3635 Dragon Balls(并查集)

    题意: N个城市,每个城市有一个龙珠. 两个操作: 1.T A B:A城市的所有龙珠转移到B城市. 2.Q A:输出第A颗龙珠所在的城市,这个城市里所有的龙珠个数,第A颗龙珠总共到目前为止被转移了多少 ...

  4. shell 脚本控制命令的执行顺序

    &&,||,(),{},& 五个符号的运用shell脚本执行命令的时候,有时候会依赖于前一个命令是否执行成功.而&&和||就是用来判断前一个命令执行效果的. 也 ...

  5. sed 修改替换包含关键字的整行

    查找关键字 user10 所在的行,替换整行内容为aaaaaaaaaa #sed -i "s/^.*user10.*$/aaaaaaaaaa/" useradd.txt

  6. Linux系统编程之进程控制(进程创建、终止、等待及替换)

    进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程.那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数. 1.1 fork函数的返回值 调用 ...

  7. Red Hat Enterprise Linux (RHEL) 9 更新了什么,即 Rocky Linux 9 和 AlmaLinux 9 展望

    请访问原文链接:https://sysin.org/blog/rhel-9-vision/,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页:www.sysin.or ...

  8. namespace之cgroup

    Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离.也就是说,虽然你通过Namespace把我J ...

  9. 【Java】IO流

    File类 介绍 File类的一个对象,代表一个文件或一个文件目录 File类声明在java.io包下 File类中涉及关于文件或文件目录的创建.删除.重命名.修改时间.文件大小等方法,并未涉及到写入 ...

  10. 菜鸡的Java笔记 java基础类库 BaseClassLibrary

    java基础类库 BaseClassLibrary        StringBuffer 类的特点        StringBuffer,StringBuilder,String 类之间的关系   ...