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. 嵌入式单片机之STM32F103C8T6最小系统板电路设计参考

    STM32F103C8T6最小系统板电路设计 一.电源部分 设计了一个XH插座,以便使用3.7V锂电池供电,接入电压不允许超过6V. 二.指示灯部分 电源指示灯可以通过一个短路帽控制亮灭,以达到节电的 ...

  2. PCIE笔记--PCIe错误定义与分类

    转载地址:http://blog.chinaaet.com/justlxy/p/5100057782 前面的文章提到过,PCI总线中定义两个边带信号(PERR#和SERR#)来处理总线错误.其中PER ...

  3. 王爽汇编第五章,[bx]和loop指令

    目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ...

  4. Typora软件的使用教程

    一.Typora软件介绍 Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.即时渲染使得你写Markdown就想是写Word文档一样 ...

  5. Swoft+Docker

    Docker 以下纯属个人理解: Docker就是一种虚拟机,将环境打包成镜像,等于做了一个Linux系统裁剪. 镜像就是我们安装系统的镜像,里面包含了你的代码和环境. 容器就是一个虚拟机,你可以用一 ...

  6. 字符编码之间的转换 utf-8 , gbk等,(解决中文字符串乱码)

    目录 1.背景. 2.编码的理解 3.编码之间的相互转化 4. str类型说明 5. 可以使用的编码类型 6.参考文章 1.背景 Python中与其他程序进行交互时,如果存在字符串交互,特别是字符串中 ...

  7. IP数据报中如果不分片,分片标志值是什么?

    过了好久才解决这个简单的问题,罪过罪过- 答案:如果IP数据报不分片,分片标志DF(Don't Fragment)会被设置为1.分片标志MF(More Fragment)设置为0. 下面是详细解释: ...

  8. SpringBoot2.x异步任务EnableAsync

    1.springboot启动类里面使用@EnableAsync注解开启异步功能 @EnableAsync public class Demo001Application { public static ...

  9. Javafx-【直方图】文本频次统计工具 中文/英文单词统计

    上周倒腾了下 javafx,本来是做平时成绩系统.跟老师提了一下 javafx,他突然兴起,发了个统计中文和英文单词并以直方图显示的实验......只给两三天的期限,笑着说考验我们的潜力SOS,于是带 ...

  10. 不可忽视的Dubbo线程池

    问题描述 线上突然出现Dubbo超时调用,时间刚好为Consumer端设置的超时时间. 有好几个不同的接口都报超时了 第1次调用超时,第2次(或第3次)重试调用非常快(正常水平) Dubbo调用超时的 ...