从零开始搭建 LVS 高可用集群 (单机)

从零开始搭建 LVS 高可用集群 (单机)

背景

从零开始搭建 LVS 高性能集群 (DR模式)
从零开始搭建 Keepalaived+Lvs 高可用集群 (Aliyun部署)

经过前面2篇关于lvs集群部署文章,相信跟着部署文档,实际部署过集群的大家对lvs服务有了深刻的了解。问题是:“无法在 Aliyun 上部署keepalived + lvs 高可用集群, 那我前面学的知识点就没用了?” 。其实 lvs 在 kubernetes 集群中的使用也比较广泛。k8s 资源 service 实际上就是实现了一个 lvs 路由配置。

现在的构想就是: 我不想在单个ECS实例上部署 Kubernetes 单节点,又想实现 lvs 部署 Nginx 高可用集群?

这篇文章就是关于如何在单个ESC实例上部署 Nginx 高可用集群。

架构

架构

lvs-nginx

本设计方案采用一台阿里云服务器搭建使用容器运行的Nginx集群,并通过LVS(Linux Virtual Server)的NAT模式实现负载均衡和高可用性。LVS作为负载均衡器运行在网络层,将进入的请求分发到后端的Nginx容器实例。

流程

  1. 准备一台阿里云ECS服务器,安装必要的操作系统和软件环境,如Docker。
  2. 配置Docker环境,创建Nginx镜像,并上传到阿里云容器镜像服务。
  3. 在ECS服务器上安装并配置LVS,设置NAT模式。
  4. 启动Nginx容器实例,确保它们可以正常运行并提供服务。
  5. 在LVS中配置虚拟IP(VIP)和后端容器的IP地址及端口映射。
  6. 配置网络规则,确保流量可以正确路由到LVS监听的VIP。
  7. 测试负载均衡和高可用性,确保系统在高负载下正常工作。

各服务功能

  • LVS:作为负载均衡器,负责接收外部请求并分发到后端的Nginx容器。
  • Docker:提供容器化环境,运行Nginx服务。
  • Nginx:作为Web服务器,处理来自LVS的请求并提供内容服务。

部署

环境配置

  1. Aliyun 控制台开通 弹性EIP
  2. ECS 实例添加 弹性网卡, 并与 EIP 绑定

绑定结果

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.68.106  netmask 255.255.240.0  broadcast 172.19.79.255
        inet6 fe80::216:3eff:fe04:9758  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:04:97:58  txqueuelen 1000  (Ethernet)
        RX packets 435005  bytes 89706618 (89.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 403875  bytes 265589398 (265.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.68.108  netmask 255.255.240.0  broadcast 172.19.79.255
        inet6 fe80::216:3eff:fe27:98cd  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:27:98:cd  txqueuelen 1000  (Ethernet)
        RX packets 144077  bytes 10924805 (10.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 83727  bytes 4877299 (4.8 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

部署

  1. 在阿里云控制台创建ECS实例,选择合适的配置以满足性能需求。
  2. 连接到ECS实例,安装Docker及其他依赖。
  3. 创建Nginx Dockerfile,构建镜像,并推送到容器镜像服务。
  4. 编写Docker Compose文件定义Nginx服务,使用Docker Compose启动Nginx容器。
  5. 安装LVS软件包,并配置NAT模式,设置VIP和后端Nginx容器的端口转发规则。
  6. 配置iptables规则,实现网络地址转换。
  7. 进行压力测试和故障转移测试,确保系统稳定性和可靠性。

nginx部署

docker-compose.yaml

version: "3"
services:
   nginx-8080:
     container_name: nginx-8080
     image: nginx:1.23.0-alpine
     ports:
       - 8080:80
     volumes:
       - ./logs-8080:/var/log/nginx
     restart: always

   nginx-8081:
     container_name: nginx-8081
     image: nginx:1.23.0-alpine
     ports:
       - 8081:80
     volumes:
       - ./logs-8081:/var/log/nginx
     restart: always

   nginx-8082:
     container_name: nginx-8082
     image: nginx:1.23.0-alpine
     ports:
       - 8082:80
     volumes:
       - ./logs-8082:/var/log/nginx
     restart: always

lvs部署

director.sh

#!/bin/bash

iptables -t nat -F
# VIP=139.224.136.161
VIP=172.19.68.108 # 弹性EIP

DIP=172.19.68.106 # ECS 内网IP
RIP1=172.19.68.106

# director服务器上开启路由转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward

# 关闭 icmp 的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

# director设置 ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t $VIP:8080 -s rr
$IPVSADM -a -t $VIP:8080 -r $RIP1:8080 -m # nat
$IPVSADM -a -t $VIP:8080 -r $RIP1:8081 -m
$IPVSADM -a -t $VIP:8080 -r $RIP1:8082 -m


echo "start director nat mode"

测试

  1. lvs 链路规则
root@iZuf64d3yu2ti34bwqerlqZ:/home# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.19.68.108:8080 rr
  -> 172.19.68.106:8080           Masq    1      0          0         
  -> 172.19.68.106:8081           Masq    1      0          0         
  -> 172.19.68.106:8082           Masq    1      0          0
  1. Nginx 集群服务
root@iZuf64d3yu2ti34bwqerlqZ:/home/wcq/lvs/nginx# docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
nginx-8080          "/docker-entrypoint.…"   nginx-8080          running             0.0.0.0:8080->80/tcp, :::8080->80/tcp
nginx-8081          "/docker-entrypoint.…"   nginx-8081          running             0.0.0.0:8081->80/tcp, :::8081->80/tcp
nginx-8082          "/docker-entrypoint.…"   nginx-8082          running             0.0.0.0:8082->80/tcp, :::8082->80/tcp 
  1. Nginx 服务访问 EIP:8080负载均衡。

nginx-lvs

  1. lvs 转发记录
root@iZuf64d3yu2ti34bwqerlqZ:/home/w# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.19.68.108:8080 rr
  -> 172.19.68.106:8080           Masq    1      0          1         # 请求转发的次数
  -> 172.19.68.106:8081           Masq    1      0          1         
  -> 172.19.68.106:8082           Masq    1      0          2 

优劣势

  • 优势

    • 高可用性:LVS和Nginx容器的结合提供了高可用的Web服务。
    • 易于扩展:通过增加更多的Nginx容器实例来扩展服务能力。
    • 资源隔离:容器化确保了服务之间的资源隔离和安全性。
    • 快速部署:Docker容器可以快速部署和启动。
  • 劣势

    • 单点故障:如果ECS实例出现问题,整个集群将受到影响。
    • 资源限制:容器数量和性能受限于ECS实例的资源。
    • 网络复杂性:配置LVS和iptables可能相对复杂。
  • 性能监控:使用阿里云监控服务或其他第三方工具监控系统性能。

  • 日志管理:集中管理Nginx容器的日志,便于问题排查和分析。

通过这种设计,可以构建一个在阿里云上运行的高可用和负载均衡的Nginx集群。利用容器化和LVS的组合,实现了易于扩展和管理的Web服务架构。

ISSUE

  1. 单个ESC实例上,是否可以使用 DR 或 TUN 模式?
    同一台ESC实例中,运行3个Nginx服务,通过同一个端口访问,DR 与 TUN 模式都不支持端口转发。

  2. Nginx本身就支持负载均衡,采用LVS作为Nginx 集群负载均衡的意义?
    这篇文章只是一个引子,Nginx服务可以替换成其他服务。使用 lvs的高性能,替换 Nginx 做负载均衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值