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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

[toc]

一、Docker 的简单使用

集群环境搭建

在本实验环境中我们没有办法为大家提供多台服务器来模拟集群环境,由此我们 docker 工具来创建多个 container 来模拟集群所需要的多台服务器。

docker 可以简单的理解为非常轻量级的虚拟机工具,而 container 则理解为创建的虚拟机。

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

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

整个集群系统结构:

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

我们将通过这样的一些步骤来完成此次的实验:

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

LVS 成功测试:我们能够通过 VIP 访问我们的 Nginx 站点,经过多次的刷新我们能够访问另一个站点的内容(以显示的内容以作区分,因为负载并不高,所以需要很多次刷新,点击地址栏,按住 F5 不放)

二、LVS/NAT 的实现

1 安装 ipvsadm 工具

首先为了能够使用 IPVS 内核模块,我们将在宿主机中安装 ipvsadm,并尝试能否使用:

# 更新源 
sudo apt-get update

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

# 尝试使用 ipvsadm
sudo ipvsadm -L

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 镜像

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

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

可以通过 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

按 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

完成两台服务器的配置之后,我们通过 service nginx start 启动服务器中 nginx 服务。

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

4 配置负载均衡调度器

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

sudo service nginx stop

LoadBalancer 的对外 IP 地址为 VIP,即 VIP 地址为 120.26.15.9 (注意,你的 VIP 地址可能和我的不一样,根据自己实际情况来)。对内 IP 称为 RIP,此时 RIP 为 192.168.0.1。

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

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

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

cat /proc/sys/net/ipv4/ip_forward

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

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

4 测试配置

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

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

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

三、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`

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

配置两台 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

修改内核参数,抑制 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

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 规则

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

ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0 up

查看网卡信息:ifconfig

在 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

测试实验效果

LVS 成功测试:我们能够通过 VIP 访问我们的 Nginx 站点,经过多次的刷新我们能够访问另一个站点的内容(以显示的内容以作区分,因为负载并不高,所以需要很多次刷新,点击地址栏,按住 F5 不放)

查看 ipvsadm 中的统计数据。

转载于:https://my.oschina.net/u/3960917/blog/2996338

你可能感兴趣的:(Docker 的简单使用&LVSNAT&LVSDR 的实现)