Docker 的简单使用&LVSNAT&LVSDR 的实现

[toc]html

1、Docker 的简单使用

集群环境搭建

在本实验环境中咱们没有办法为你们提供多台服务器来模拟集群环境,由此咱们 docker 工具来建立多个 container 来模拟集群所须要的多台服务器。前端

docker 能够简单的理解为很是轻量级的虚拟机工具,而 container 则理解为建立的虚拟机。nginx

集群系统中,服务器资源能够简单分为两种角色:web

  • 一种是 Load Balancer,即负载均衡调度器,位于集群系统的前端,对后端服务器实现负载均衡做用,对外 IP 地址也称为 VIP(虚拟 IP 地址)。
  • 另外一种就是后端服务器群,处理由 Load Balancer 发来的请求。

整个集群系统结构:算法

  • 宿主机环境(默认桌面环境):装有 ipvsadm(LVS 的 IP 负载由 IPVS 内核模块完成,ipvsadm 是为 IPVS 编制规则的工具),充当负载均衡调度器
  • 宿主机浏览器:经过宿主机中的浏览器来充当客户端
  • RealServer1 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员
  • RealServer2 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员

咱们将经过这样的一些步骤来完成这次的实验:docker

  • 本地安装 ipvsadm 工具,加载 IPVS 模块
  • 经过 docker 建立两个 container 来模拟服务器池中的成员
  • 配置两台 RealServer 的环境:
  • [ ] 安装 vim 与 nginx 工具
  • [ ] 修改默认的 nginx 展现页面
  • 配置负载均衡调度机器:
  • [ ] 修改内核转发参数 配置 ipvsadm 规则
  • 测试实验效果

LVS 成功测试:咱们可以经过 VIP 访问咱们的 Nginx 站点,通过屡次的刷新咱们可以访问另外一个站点的内容(以显示的内容以做区分,由于负载并不高,因此须要不少次刷新,点击地址栏,按住 F5 不放)ubuntu

2、LVS/NAT 的实现

1 安装 ipvsadm 工具

首先为了可以使用 IPVS 内核模块,咱们将在宿主机中安装 ipvsadm,并尝试可否使用:vim

# 更新源 
sudo apt-get update

# 安装 ipvsadm 工具
sudo apt-get install ipvsadm

# 尝试使用 ipvsadm
sudo ipvsadm -L

mark

2 建立服务器池成员

使用 docker 建立所需 container,使用如下命令建立:后端

docker run --privileged --name=RealServer1 -tdi ubuntu
docker run --privileged --name=RealServer2 -tdi ubuntu

命令讲解:浏览器

docker run:建立 docker 容器

name 参数:给容器命名,方便区分

tid 参数:分配 tty,可以与之交互

ubuntu:指定容器镜像,这里使用 ubuntu 镜像

mark

建立命令执行完成后,目前有两个 container:

RealServer1:IP 地址为 192.168.0.2。下文简称 RIP1
RealServer2:IP 地址为 192.168.0.3。下文简称 RIP2

mark

能够经过 ifconfig 命令查看各自的 IP 地址,此处的地址是由于按顺序,且按默认配置建立所致使

3 配置两台RealServer的环境

RealServer 部署 Nginx 来提供 Web 服务,RealServer1 和 RealServer2 操做步骤相同,此处以 RealServer1 为示例:

首先登陆 RealServer1:

# 经过 attach 命令登陆 RealServer1
docker attach RealServer1

安装相关工具

apt-get update
apt-get install vim -y 
apt-get install nginx -y
service nginx start

mark

mark

按 i 键插入,按 esc 再输入 :wq 保存退出。

注意若完成了 RealServer1 的配置以后,若是咱们不想打开新的终端,能够经过 ctrl+p+q 的组合快捷键脱离当前机器的登陆,切勿使用 exit 的方式退出 container,这样的方式关闭服务器的。 脱离以后便会返回到 shiyanlou 的 zsh 交互,能够经过 docker attach RealServer2 的命令来登陆另外一台机器,而后作相似的操做(同上的软件安装操做以及 nginx 启动操做) 接下来就修改 nginx 页面,以下所示:

#在 RealServer2 container 环境
vi /usr/share/nginx/html/index.html

mark

完成两台服务器的配置以后,咱们经过 service nginx start 启动服务器中 nginx 服务。

至此咱们完成两台 Web 服务器的配置,咱们能够打开宿主机 firefox 浏览器,地址栏分别输入两个 IP 地址,来检验咱们的配置成功:

mark mark

4 配置负载均衡调度器

1.为避免影响实验结果,关闭宿主机环境的 nginx 服务:

sudo service nginx stop

LoadBalancer 的对外 IP 地址为 VIP,即 VIP 地址为 120.26.15.9 (注意,你的 VIP 地址可能和个人不同,根据本身实际状况来)。对内 IP 称为 RIP,此时 RIP 为 192.168.0.1。

mark

2.开启 LoadBalancer 的内核路由转发:

echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward

查看当前机器内核路由转发开启状况:

cat /proc/sys/net/ipv4/ip_forward

获得的值为 1,说明此机器已开启内核路由转发。进行下一步。 mark

3.使用 ipvsadm 添加 ipvs 规则。定义集群服务:

sudo ipvsadm -A -t 120.26.15.9:80 -s rr         #定义集群服务
sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.2 -m #添加 RealServer1
sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.3 -m #添加 RealServer2
sudo ipvsadm -l                 #查看 ipvs 定义的规则

上面命中 ipvsadm 参数讲解:

# 添加集群服务
-A:添加一个新的集群服务
-t: 使用 TCP 协议
-s: 指定负载均衡调度算法
rr:轮询算法(LVS 实现了 8 种调度算法)
120.26.15.9:80 定义集群服务的 IP 地址(VIP) 和端口

# 添加 Real Server 规则
-a:添加一个新的 RealServer 规则
-t:tcp 协议
-r:指定 RealServer IP 地址
-m:定义为 NAT 
上面命令添加了两个服务器 RealServer1 和 RealServer2

mark

4 测试配置

分别登入两台宿主机,讲nginx服务分别打开 mark

打开浏览器,输入 VIP 地址:120.26.15.9: mark

由于访问压力比较小,调度算法不会请求切换服务器,能够按住 F5 快速屡次刷新查看页面变化效果 以上便实现了 LVS 的 NAT 负载均衡系统。 mark

3、LVS/DR 的搭建

与 NAT 方式相同,咱们将经过 docker 来模拟咱们的集群环境。

集群系统中,服务器资源能够简单分为两种角色:

  • 一种是 Load Balancer,即负载均衡调度器,位于集群系统的前端,对后端服务器实现负载均衡做用,对外 IP 地址也称为 VIP(虚拟 IP 地址)。
  • 另外一种就是后端服务器群,处理由 Load Balancer 发来的请求。

整个集群系统结构:

  • 宿主机环境(默认桌面环境):充当客户端访问 web 服务
  • LoadBalancer1 的 container:装有 ipvsadm,充当负载均衡调度器
  • RealServer1 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员
  • RealServer2 的 container:部署 Nginx web 服务器,提供 Web 访问服务,充当服务器池中的一员

咱们将经过这样的一些步骤来完成这次的实验:

本地安装 ipvsadm 工具,加载 IPVS 模块

如果咱们沿用 NAT 的实验环境,咱们须要作环境的清理:

1.首先清除 ipvsadm 的规则:

sudo ipvsadm -C

2.删除以前所建立的 container,虽然都是提供 Web 服务,可是在 DR 模式中须要修改内核参数与建立网卡别名,须要超级权限,因此不能沿用以前的 container:

# 关闭全部的 container
docker stop `docker ps -aq`
# 删除全部的 container
docker rm `docker ps -aq`

mark

3.安装 ipvsadm 工具

由于在 NAT 实验中咱们已安装因此可跳过该步骤,如果新启动的环境请参考 NAT 中的步骤,此处提示务必在宿主机环境中执行 ipvsadm -L 的验证步骤,如果不执行该步骤,在 LoadBalancer 的 container 中咱们将没法加载 IPVS 的内核模块。

经过 docker 建立三个 container 来模拟服务器池中的成员

docker run --privileged --name=LoadBalancer -tid ubuntu
docker run --privileged --name=RealServer1 -tid ubuntu
docker run --privileged --name=RealServer2 -tid ubuntu

mark

配置两台 RealServer 的环境:

  • 安装 vim 与 nginx 工具
  • 修改默认的 nginx 展现页面
  • nginx服务启动

首先登陆 RealServer1:

# 经过 attach 命令登陆 RealServer1
docker attach RealServer1

安装相关工具

apt-get update
apt-get install vim -y 
apt-get install nginx -y
vi /usr/share/nginx/html/index.html
service nginx start
  • ctrl+p+q 切换到RealServer2

mark

mark

修改内核参数,抑制 arp

1.修改内核参数

以 RealServer1 为例,登陆 container:

执行下列命令:

# 设置只回答目标IP地址是来访网络接口本地地址的ARP查询请求 
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

# 为了保险本身能够查看一下是否成功修改
cat /proc/sys/net/ipv4/conf/lo/arp_ignore

# 设置对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送.
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

# 使得上面的配置当即生效
sysctl -p

mark

mark

ARP 的内核参数: arp_ignore 部分参数:定义了本机响应 ARP 请求的级别

0表示目标 IP 是本机的,则响应 ARP 请求。默认为 0

1若是接收 ARP 请求的网卡 IP 和目标 IP 相同,则响应 ARP 请求

arp_announce 参数:定义了发送 ARP 请求时,源 IP 应该填什么。

0 表示使用任一网络接口上配置的本地 IP 地址,一般就是待发送的 IP 数据包的源 IP 地址 。默认为 0

1 尽可能避免使用不属于该网络接口(即发送数据包的网络接口)子网的本地地址做为 ARP 请求的源 IP 地址。大体的意思是若是主机包含多个子网,而 IP 数据包的源 IP 地址属于其中一个子网,虽然该 IP 地址不属于本网口的子网,可是也能够做为ARP 请求数据包的发送方 IP。

2 表示忽略 IP 数据包的源 IP 地址,老是选择网络接口所配置的最合适的 IP 地址做为 ARP 请求数据包的源 IP 地址(通常适用于一个网口配置了多个 IP 地址)

建立网卡别名与添加路由

只有目的 IP 是本机器中的一员时才会作相应的处理,因此须要添加网卡别名:

# 配置虚拟IP
ifconfig lo:0 192.168.0.10 broadcast 192.168.0.10 netmask 255.255.255.255 up

# 添加路由,由于本就是相同的网段因此能够不添加该路由
route add -host 192.168.0.10 dev lo:0

service networking restart

配置一台 LoadBalancer 环境:

  • 安装 ipvsadm (注意主机,也就是原来的界面也必须按照了ipvsadm)
  • 配置网卡别名
  • 配置 ipvsadm 规则

mark mark mark

建立 eth0 的别名并绑定 VIP 地址,做为集群同时使用:

ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0 up

查看网卡信息:ifconfig

mark

在 LoadBalancer 中添加 IPVS 规则:

ipvsadm -A -t 192.168.0.10:80 -s rr         # 定义集群服务
ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.3 -g # 添加 RealServer1
ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.4 -g # 添加 RealServer2
ipvsadm -l                  # 查看 ipvs 定义的规则

ipvsadm 命令参数讲解:

# 添加集群服务
-A:添加一个新的集群服务
-t: 使用 TCP 协议
-s: 指定负载均衡调度算法
rr:轮询算法(LVS 实现了 8 种调度算法)
192.168.0.10:80 定义集群服务的 IP 地址(VIP) 和端口

# 添加 Real Server 规则
-a:添加一个新的 RealServer 规则
-t:tcp 协议
-r:指定 RealServer IP 地址
-g:定义为 DR 模式
上面命令添加了两个集群服务器 RealServer1 和 RealServer2

mark

测试实验效果

LVS 成功测试:咱们可以经过 VIP 访问咱们的 Nginx 站点,通过屡次的刷新咱们可以访问另外一个站点的内容(以显示的内容以做区分,由于负载并不高,因此须要不少次刷新,点击地址栏,按住 F5 不放)

mark

查看 ipvsadm 中的统计数据。

相关文章
相关标签/搜索