先下载centos镜像
docker pull centos
根据镜像创建容器:
docker run -it -d --name centos1 -d centos
进入容器下载常用工具 :
docker exec -it 容器id bash
yum -y install wget gcc-c++ pcre pcre-devel zlib zlib-devel opensll-devel popt-devel initscripts net-tools vim
安装好以后安装nginx
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx
安装keepalived:
yum -y install keepalived
注意:这里nginx和keepalived安装以后 执行systemctl start 是拒绝的 利用centos启动的容器是没有root权限的
退出容器 利用该容器构成新镜像:
docker commit -a ‘5e’ -m ‘centos with common tools’ centos1 centos_base
-a:作者信息
-m:镜像信息
centos1:容器名字
centos_base:自定义生成的镜像名字
上面的centos1容器可以删除掉:
docker rm 容器id
利用刚刚构建的新镜像创建新容器:
docker run -it --name centos_temp -d --privileged centos_base /usr/sbin/init
–privileged:给予容器root权限
/usr/sbin/init:配合privileged使用
进入容器:
docker exec -it 容器id bash
现在可systemctl 启动nginx和keepalived:
systemct start nginx
systemctl enable nginx
访问nginx资源是否能访问到:
curl http://容器的ip
现在可编辑keepalived的配置文件 修改前可先cp一份:
vim /etc/keepalived/keepalived.conf
内容:
! Configuration File for keepalived
global_defs {
router_id LVS_01
}vrrp_script chk_nginx {
script “/etc/keepalived/nginx_check.sh”
interval 2
weight -20
}vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 121
mcast_src_ip 172.17.0.6
priority 100
nopreempt #非抢占式的keepalived
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
172.19.12.100
}
}
编辑好退出创建 上述内容的 nginx_check.sh脚本
vim /etc/keepalived/nginx_check.sh
#!/bin/bash
A=ps -C nginx -–no-header |wc -l if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ ps -C nginx --no-header |wc -l -eq 0 ];then
killall keepalived
fi
fi
给权限:
chmod +x nginx_check.sh
现在可启动keepalived:
systemct start keepalived
systemctl enable keepalived
现在可尝试访问:
curl http://keepalived定义的虚拟ip
现在有了访问虚拟ip成功地容器,那么现在利用该容器构建新镜像,再利用镜像构建keepalived的主和备两个的容器:
构建主的容器:
docker commit-a ‘cfh’-m ‘centos with keepalived nginx’ centos_temp centos_kn
-a :作者信息
-m:镜像信息
centos_temp:根据的具体容器构建的镜像
再利用刚刚创建的镜像构成keepalived的主:
docker run --privileged -tid --name centos_master --restart=always centos_kn /usr/sbin/init
–restart=always:表示docker退出后将自动重启这个容器
构建从的容器:
docker run --privileged -tid --name centos_slave --restart=always centos_kn /usr/sbin/init
现在主从容器已经构建,因为在构建镜像时候,根据构建的容器已经修改过keepalived的配置文件
所以现在主的不需要修改 现在只需要将构建的从的容器,进入从容器修改keepalived的配置文件即可:
将
router_id LVS_01 改为LVS_02
state MASTER改为BACKUP
priority 100 改为90
因为这里是从,从的priority的优先级低于master
保存退出后重启从的keepalived的服务
systemctl restart keepalived
现在容器有两个 一个是master一个是slave,都是基于centos_temp容器构建的镜像创建的容器
防止出错如果有centos_temp容器 最好将他删除
现在在宿主机访问虚拟ip
curl 172.19.12.100 可显示master主的nginx资源
将master容器停止模拟损坏 再访问虚拟机ip出现从的nginx资源即成功
限制arp响应:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_a
或者
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2
增加回环地址:
ifconfig lo:1 172.19.12.100 netmask 255.255.255.255 broadcast 172.19.12.100 up
增加路由:
route add -host 172.19.12.100 dev lo:1
#添加开启自启动 echo “route add -host 172.19.12.100 dev lo:1” >> /etc/rc.local
编辑配置文件增加:
virtual_server 172.19.12.100 80 {
delay_loop 10
lb_algo rr
lb_kind DR
protocol TCP
#sorry_server 127.0.0.1 80
real_server 172.19.12.2 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.19.12.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
安装ipvsadm:
yum -y install ipvsadm
重启主和备的keepalived 查看ipvsadm规则:
systemctl restart keepalived
ipvsadm -Ln
这里做ipvs 上面脚本内容可以注释,因为ipvs会根据nginx是否存在自动添加到ipvs集群规则,如果某台nginx服务宕机,那么就会从ipvs的规则剔除,那么访问是keepalived只会显示还存在的nginx
为什么LVS设置了轮询,浏览器测试还是不能轮询?这关系到两个地方的配置:
01./etc/keepalived/keepalived.conf的persistence_timeout会话保持时间配置,测试轮询时设置为0;
02.查看ipvsadm默认超时时间
[root@DR1 keepalived]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300
900 120 300这三个数值分别是TCP TCPFINUDP的时间.也就是说一条tcp的连接经过lvs后,lvs会把这台记录保存15分钟,就是因为这个时间过长,所以很多人都会发现做好LVS DR之后轮询现象并没有发生,实践中将此数值调整很小小,使用以下命令调整:
[root@DR1 ~]# ipvsadm --set 1 2 1
如果上述未轮询:
那么只在主master的keepalived的配置文件带有
virtual_server 172.19.12.100 80 {
delay_loop 10
lb_algo rr
lb_kind DR
protocol TCP
#sorry_server 127.0.0.1 80
real_server 172.19.12.2 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.19.12.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
从BACKUP的不带这些配置文件
只有主配置virtual_server
也会执行客户端访问轮询
但是当主的keepalived停掉,那么客户端访问资源只有访问BACKUP的资源不会再有轮询