docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache

1.需求分析

网站建设是企业、组织、个人宣传和分享交流的重要的平台,尤其是在如今的信息化时代下,所有行业都在互联网的影响下实现数字化、在线化。在网站的建设中,网站的部署和发布是非常重要的一环,尤其是企业网站,随着企业的影响力和业务规模的扩大,企业的服务器需要承载的访问量和负载也日益增多,这就对企业提供网络服务提出了新的标准。因此,为使得企业网络可以承载更多的访问量和业务需求,我们就需要搭建web集群,实现企业集群负载均衡和高可用。

1.1功能需求

1.1.1网站搭建

网站开发测试完成后,需要正式发布上线,此时,我们需要配置web服务器,提供网络服务。当访问量较少时,我们可以部署单台节点的服务器站点,同时对服务器配置定期备份任务以及定期维护。

1.1.2负载均衡

当访问量越来越多时,单台节点的服务器无法承受超负载的HTTP(s)请求时,此时为满足外部的访问量,同时为了方便管理、提高扩展性和安全性以及减少企业开支,通常就需要采用增加服务器部署站点配置负载均衡集群的方法,来提高企业网站的网络服务能力。

1.1.3高可用

当负载均衡的服务器节点越来越多时,网站规模也越来越大,负载均衡分发器承担的网络流量最大,其在整个集群中的重要性也就不言而喻,一旦节点出现故障甚至宕机,整个集群将无法对外提供服务。因此,除了负载均衡之外,我们同时会部署负载均衡的高可用,即负载均衡器的主备部署。

1.2性能和安全性需求

对物理服务器硬件的需求以及web站点服务器的需求需要根据实际情况分析,在这里我采用的是实验环境,故该部分不做过多解释。

2.系统设计

2.1系统结构图表

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第1张图片

系统地址以及软件分布表

容器(Container) 操作系统(OS) IP地址 安装软件
宿主机(docker) CentOS7.6.1810 172.18.74.188 Docker+LVS
lvs-k CentOS7.6.1810 172.17.0.8 LVS+keepalived
lvs-k1 CentOS7.6.1810 172.17.0.7 LVS+keepalived
nginx CentOS7.6.1810 172.17.0.5 nginx
nginx1 CentOS7.6.1810 172.17.0.4 nginx
web CentOS7.6.1810 172.17.0.2 apache+php
web1 CentOS7.6.1810 172.17.0.3 apache+php
VIP 172.17.0.9

OS内核版本信息
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第2张图片

2.2 Docker构建集群

2.2.1 Docker概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

2.2.2 docker特点

Docker的特点 develop, deploy, and run
Docker是开发人员和系统管理员 使用容器开发,部署和运行应用程序的平台。使用Linux容器部署应用程序称为容器化。容器不是新的,但它们用于轻松部署应用程序。
容器化越来越受欢迎,因为容器是:
灵活:即使是最复杂的应用也可以集装箱化。
轻量级:容器利用并共享主机内核。
可互换:您可以即时部署更新和升级。
便携式:您可以在本地构建,部署到云,并在任何地方运行。
可扩展:您可以增加并自动分发容器副本。
可堆叠:您可以垂直和即时堆叠服务。

2.2.3为什么要使用 Docker?

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

对比传统虚拟机总结
特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

根据我的实验情况来看,使用docker这项新技术可以使我更加快捷方便的搭建网络集群,(虽然在掌握docker这门新技术花了几天时间),而且用docker模拟可以使网络的效果更加直观。将来用于实际部署应用时也会非常的便捷,这得益于它的便携式和灵活性以及强大的移植功能。

2.2 docker架构

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第3张图片

2.2.4 Docker核心概念

在这里我只简单介绍两个概念。
1)Images 镜像,os组合
基本操作如下:

$ docker images  #列出本地主机上的镜像
$ docker run -t -i ubuntu:15.10 /bin/bash 
$ docker pull ubuntu:13.10
$  docker search httpd
$ docker run httpd
$ docker tag 860c279d2fec runoob/centos:dev
$ docker build -t runoob/centos:6.7 .

2)Containers 容器
我自己的理解是镜像的进程态,container与vm的区别如下

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第4张图片
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第5张图片

2.2.5 docker 网络

1.桥接模式(default)
Docker容器的默认网络模式为桥接模式,如图所示:
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第6张图片
2.HOST模式
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第7张图片
3.Container模式
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第8张图片
4.None

获取独立的network namespace,但不为容器进行任何网络配置,之后用户可以自己进行配置,容器内部只能使用loopback网络设备,不会再有其他的网络资源

2.3 LVS+keepalive负载均衡原理介绍

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第9张图片

  1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
  2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
  3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
  4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

LVS可以实现负载均衡,但是不能够进行健康检查,比如一个rs出现故障,LVS 仍然会把请求转发给故障的rs服务器,这样就会导致请求的无效性。keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题,其实 keepalive 就是为 LVS 而生的。
在本次实验中,采用的是LVS的DR方式实现四层上负载均衡
重将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
2.4 Nginx负载均衡原理
Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以分发给后台服务端(backend servers, 后面简称backend)来做复杂的计算、处理和响应,并且在业务量增加的时候可以方便地扩容后台服务器。
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第10张图片
从原理上理解,lvs解决的是四层的负载均衡,nginx解决的是七层的负载均衡

3.系统实现

3.1网络环境以及服务器配置

在实际搭建的过程中,因为校园网账号只有一个,同时为实现在校园网内访问,我搭建了一个nat服务器,或者说是跳板机,来解决集群搭建中的网络问题。具体方法如下:

1.服务器配置双网卡,ip地址如下:
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第11张图片
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第12张图片
1.配置双网卡间的iptables规则,并执行连接校园网的认证脚本,测试服务器上网情况

在nat服务其中设置iptables规则
让发送至内网网卡的数据全部通过 ens160(内网网卡地址)
iptables -A FORWARD -i ens160 -j ACCEPT
修改数据报头信息 ens32(外网网卡地址)
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o ens32 -j MASQUERADE
开启Linux的路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward # 打开路由功能
cat /proc/sys/net/ipv4/ip_forward
#查看是否启用路由功能,结果为1,代表已启用,0代表未启用
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第13张图片
4.在需要联网的虚拟机上配置网关为内网网卡的地址
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第14张图片

5.配置完后重启网卡,即可访问外网systemctl restart network

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第15张图片

3.2安装Docker CE

1.清除已存在的docker环境

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

2.repository 配置yum源
新主机上首次安装Docker CE 需要设置Docker repository(存储库)
安装所需的包。yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序。

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
lvm2

使用以下命令设置稳定存储库。即使您还想从边缘或测试存储库安装构建,您始终需要稳定的存储 库。

$ sudo yum-config-manager \
 --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast

3.安装Docekr CE

$ sudo yum install docker-ce -y

4.启动Docker

$ sudo systemctl start docker

3.3容器的基本操作

1.创建并运行容器,若没有镜像将从docker hub上下载并运行
以下命令为创建一个可以运行内核服务的容器
$ docker run --privileged --name=container_name --hostname=host_name -p port:port -it -d centos:latest(image) /usr/sbin/init
2. 开启和停止容器
$ docker start/stop container_name/container_id
3.进入容器
$ docker exec -it container_name /bin/bash
4.查看docker镜像
$ docker images
5.查看docker容器
$ docker container ls
$ docker container ls -a
6.删除docker容器
$ docker stop container_name/container_id
$ docker rm container_name/container_id
7.创建自定义镜像
$docker commit -m "comment" -a "author" container_model image_name
就像这样

3.4容器准备

最终需要六个容器,如图所示:
在这里插入图片描述
其中在创建容器时,最方便的时可以根据自己自定义的image去创建容器,这大大减少了集群搭建的工作量,就像这样,搭建好一个容器环境后打包为镜像,再次创建运行新的容器,使用时只需要简单的修改以下配置即可。
在这里插入图片描述

3.4.1 web 服务器

$ yum install -y httpd php
$ systemctl start httpd
vim /var/www/html/index.html
This is web(1) master!

3.4.2 Nginx负载均衡器

$  yum install epel-release -y
$  yum install nginx -y
vim /etc/nginx/nginx.conf

在httpd中加入以下内容:

upstream myweb{
        server 172.17.0.2:80;
        server 172.17.0.3:80;
    }
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
      #proxy_set_header Host $host;
      #proxy_set_header X-Real-IP $remote_addr;
    	#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myweb;
}

$ systemctl start nginx
Nginx作为lvs的Real server节点2台配置脚本:

#vim /usr/local/sbin/lvs_dr_rs.sh

#! /bin/bash
vip=172.17.0.7
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

2节点rs 上分别执行脚本:
bash /usr/local/sbin/lvs_dr_rs.sh

3.4.3 LVS +keepalived上的配置
Lvs + keepalived的2个节点安装
$ yum install ipvsadm keepalived -y
keepalived节点配置(2节点):
主节点( MASTER )配置文件

vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.9
    }
}

virtual_server 172.17.0.9 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 172.17.0.4 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 172.17.0.5 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

从节点( BACKUP )配置文件
拷贝主节点的配置文件keepalived.conf,然后修改如下内容:

state MASTER -> state BACKUP
priority 100 -> priority 90

keepalived的2个节点执行如下命令,开启转发功能:

#echo 1 > /proc/sys/net/ipv4/ip_forward

启动keepalive
先主后从分别启动keepalive

service keepalived start

3.4.4 问题解决
3.4.4.1. Docker warning的问题解决
在这里插入图片描述
解决办法:

#vi /etc/sysctl.conf
或者
#vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
    net.ipv4.ip_forward=1
重启network服务
#systemctl restart network
查看是否修改成功
#sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了

3.4.2 keepalived服务问题

在配置启动keepalive时,启动时并没有报错,然而在测试环节却不起作用,查看keepalived的状态,可以看出keepalive一直是stopping的状态,无法正常服务。这个问题一直困扰着我,无法解决。
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第16张图片
直到看到了一篇博文
https://www.cnblogs.com/XiongMaoMengNan/p/8056211.html

先在宿主机上安装并以root来启动ipvsadm,每次要在容器中运行ipvs都需要先在宿主机上启动ipvsadm。如果直接进行2步操作将报出如下错误:

Can’t initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?

在宿主机上仍是出错,
在这里插入图片描述

3.4.4.3 解决ipvsadm启动出错的问题

解决方法见以下链接
https://blog.csdn.net/qq_37165604/article/details/79963894

$ ipvsadm --save > /etc/sysconfig/ipvsadm

此时ipvsadm启动正常
再次启动keepalived
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第17张图片

4.系统测试

4.1 web服务器测试

在这里插入图片描述

4.2 nginx负载均衡测试

在nginx 服务器上使用的是轮询,采用weight 1:1的方式,在nginx上进行访问,轮询比例1:1,结果如下图
在这里插入图片描述

在nginx1上进行的是1:2的轮询方式,在nginx1上访问结果如下
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第18张图片
4.3 高可用测试

在lvs-k(master)与lvs-k1(backup)安装和配置好keepalived后,正常访问vip时,访问结构如下

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第19张图片

模拟nginx(master)单点故障的状态,即在nginx上执行systemctl stop nginx将nginx服务器关闭,再次在客户端上访问vip结果如下:
在这里插入图片描述

从图中可以看出,当nginx服务器出现故障时,client端实际访问的是nginx1服务器。
同时可以从lvs-k服务器的keepalived的健康状态检测中看到,服务器检测到了nignx服务器的宕机情况,并将vip转移至nginx1上,如图所示:

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第20张图片

模拟lvs-k(master)宕机的情况,当master和backup正常工作时,keepalived的状态如下图:

docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第21张图片
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第22张图片
当在lvs-k上执行systemctl stop keepalived时,此时可以看到lvs-k1开始服务。
docker搭建高可用与负载均衡(一)lvs+keepalived+nginx+apache_第23张图片

5.总结
在搭建平台系统和撰写课程设计论文的过程中,发现如果能够熟练掌握其中的原理,所有的配置都十分的简单,重点是要理解各项技术和软硬件实现的原理,才能达到事半功倍的效果。首先,去查看其他博客的操作时,应该边看边思考,不要一味照搬,因为可能博主跟你要做集群的环境和配置思路上有所差异,应该学习他们的配置原理和思路,进而设计自己的系统平台架构;其次,在学习的过程中,遇到问题先根据掌握的知识进行思考,然后再进行查资料,要明白自己那块儿知识掌握了,用已知去探索未知,可以更快的掌握一门新的技术。最后,遇到问题并不可怕,只要放平心态,探索问题的本质,很快就可以将问题解决。

你可能感兴趣的:(linux)