docker及lvs负载
Posted woaiyitiaochai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker及lvs负载相关的知识,希望对你有一定的参考价值。
1、分别使用lxc容器和docker容器搭建nginx服务,能够正常访问到容器内的web服务
下载docker-ceyum仓库至 /etc/yum.repos.d/目录中,使用yum安装docker-ce
使用阿里镜像仓库地址:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce
使用阿里的容器镜像加速服务(需要登录阿里云)
创建/etc/docker/daemon.json配置文件填入以下代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF‘
{
"registry-mirrors": ["https://xoqam0c8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload #重新加载配置文件
sudo systemctl restart docker #重启服务
docker version # 查看版本
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.1
API version: 1.40 (minimum version 1.12)
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:19:36 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
docker pull nginx:stable-alpine #从dockerhub中拉取镜像至本地
docker image ls #查看本地镜像
[root@centos7 yum.repos.d]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx stable-alpine 8587e8f26fc1 6 days ago 21.2MB
docker image inspect nginx:stable-alpine #查看镜像的详细信息,以xml格式
docker run --name nginx nginx:stable-alpine 创建并启动拖下来的镜像
[root@centos7 ~]# docker container exec nginx1 ifconfig #连接至容器并且查看ip地址
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:85 errors:0 dropped:0 overruns:0 frame:0
TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6892 (6.7 KiB) TX bytes:4326 (4.2 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
docker container exec -it nginx1 /bin/sh 连接至容器可以查看容器内部运行方式
docker stop nginx1 #停止容器
docker run --name web -it --rm nginx:stable-alpine # --rm可以指定退出容器时就删除容器 ,-it指定交互式接口运行方式,这里指运行在前台,-d可以指定运行在后台,无法与rm同时使用,
docker container logs name 查看容器中进程的日志
docker search #搜索镜像
docker pull 拖去镜像
docker images 显示镜像列表
docker create 创建容器
docker start 启动容器
docker run 创建并启动容器
docker container commit b1 registry/name:version 制作镜像
docker push 推送镜像
2、简述docker网络模型,并实现桥接模式下不同宿主机之间的docker网络互通
docker提供四种可用网络
1,桥网络 默认docker0 的nat桥,可以自行定义
2,共享桥网络(联盟式),共享名称空间的IPC,NET,UTS。隔离文件系统,用户,以及进程,容器可用通信接口通信,也可以使用同一个主机名对外提供服务
docker run --name box -it --rm --network bridge busybox 开启一个容器指定桥网络
docker run --name boxv1-it --rm --network container:box busybox #新起一台容器 指定加入box网络,即是共享式网络
3,共享宿主机网络,容器直接使用宿主机网络,进程监听在宿主机的网卡某端口
docker run --name box -it --rm --network host busybox 指定网络连接使用宿主机的网络,
显示网卡信息都为宿主机的网络
4,none网络,空网络无网卡
[root@centos7 ~]# docker run --name box -it --rm --network none busybox 指定--network none 为none 进入交互式接口容器,网络为空网络
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
docker run --name nginx -p 80:80 nginx:stable-alpine #使用-p选项将容器内80端口绑定至宿主机80端口中,实现dnat转发功能转发至容器内nginx服务
在192.168.196启动的容器中访问195主机80端口
docker run --name nginx -p 192.168.1.195::80 nginx:stable-alpine 也可将宿主机的ip随机端口绑定至容器内80端口
[root@centos7 ~]# docker container port nginx 查看容器内映射端口
80/tcp -> 192.168.1.195:32768
docker run --name nginx -p 80 -p 443 nginx:stable-alpine #-p选项也可指定多端口监听
[root@centos7 ~]# docker container port nginx
443/tcp -> 0.0.0.0:32778
80/tcp -> 0.0.0.0:32779
[root@centos7 ~]#
[root@centos7 yum.repos.d]# docker network create --subnet 10.10.0.0/24 mybr0 创建一个网络 并指定子网地址(默认为桥接网络)
aa20a2b9f3ba96a80812e0141de2db8fd22c44b8e767a13b75c4b40f9f10c1b6
[root@centos7 yum.repos.d]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3328bee523d5 bridge bridge local
377db5bdc7d8 host host local
aa20a2b9f3ba mybr0 bridge local
3d855d221162 none null local
[root@centos7 yum.repos.d]# docker run --name nginx --network mybr0 nginx:stable-alpine
加入网络之后docker默认会创建iptables规则
[root@centos7 ~]# docker network connect bridge nginx ##将nginx容器加入bridge网络
[root@centos7 ~]# docker container exec nginx ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:0A:00:02
inet addr:10.10.0.2 Bcast:10.10.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2430 (2.3 KiB) TX bytes:0 (0.0 B)
eth1 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
docker run --name box -it --rm -v mydata busybox /bin/sh # -v选项指定在容器创建一个目录mydata此目录会关联至宿主机一个目录
docker container inspect box 查看关联的目录
进入 /var/lib/docker/volumes/var/lib/docker/volumes/8b79efb35c2ab0231d12795200625843a8d3ae00f7d7a24da896f77667c60382/_data 创建文件则会被关联至容器中mydata目录中,即使容器被删除宿主机的文件也不会删除
docker run --name box1 -it --rm -v /data/volumes/v1:/mydata busybox #将容器与宿主机指定的目录中建立关联关系,
docker run --name box2 -it --rm --volumes-from box1 busybox /bin/sh #可直接复制另一个容器的卷,可共享同一个存储卷
/ # ls
bin dev etc home mydata proc root sys tmp usr var
/ # ls /mydata/
hello.txt
使用docker file制作镜像
mkdir workship #在宿主机创建一个目录,在此目录中创建dockerfile文件(文件名必须为Dockerfile)
[root@centos7 ~]# vim workship/Dockerfile
FROM busybox:latest # 指定初始镜像在此镜像中修改容器的配置或者安装软件
LABEL zuozhe="stephenzhong" mail="stephenzhong@mail.com" #指定此描述
COPY index.html /data/web/html/ # 从宿主机复制index.html文件到 /data/web/html容器的目录中入目标文件不存在则会自动创建此目录
docker image build /root/workship -t myimg:v0.1 #利用dockerfile构建新镜像 -t指定名称标签需要使用dockerfile 构建镜像,需要创建一个目录,存放Dockerfile这个文件,且复制时以dockerfile文件的父目录为起始点。
docker file 的常见命令
ADD:可从互联网上下载包,并且复制到指定目录。如果是本地tar格式文件则会被复制到指定目录并且被展开
WORKDIR : 指定容器内工作目录,可出现多次,生效范围为workdir 到下个workdir命令之间
VOLUME:在镜像中创建一个挂载点目录,但仍然需要启动容器时指定-v 来绑定需要的自己指定某个路径来关联,否则则默认为关联至/var/lib/docker/image的目录中关联
EXPOSE 用于为容器打开指定要监听的端口以实现与外部通信 EXPOSE 1111 /tcp|udp 即可,需要在启动容器时加上-P选项,且只能以动态方式暴露端口
ENV:用于为镜像定义所需要的环境变量,并可被dockerfile 文件中位于其后的其他指令 ENV,ADD,COPY等 ENV key=value
ARG:可以替换dockerfile中定义的env变量参数 ,在docker build 可直接在命令行中传值使用 --build-arg "参数"
RUN:在构建镜像的时候可以执行shell命令
CMD:在构建好的镜像中,在开启容器之前使用的命令设定默认需要运行的cmd,只有最有一个cmd生效
ENTRYPOINT:与CMD相似,如果与CMD混用,则ENTRYPOINT指定的程序,CMD指定的则为ENTRYPOINT command 的参数
3、制作一个docker镜像,实现sshd服务、nginx服务的正常使用
docker run -it --name=c1 centos /bin/bash #以交互式方式进入centos的镜像源
yum install openssh-server #在容器中安装ssh服务
ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key #生成秘钥对容器中进行
ssh-keygen -#宿主机生成秘钥,并且将公钥拷贝至容器中/root/.ssh/authorized_keys文件中
echo "root:123456"|chpasswd #在容器中生成root口令
/usr/sbin/sshd -D #以后台方式运行sshd服务
docker commit c1 ssh:centos #将安装好的软件制作成镜像ssh:centos
ssh连接至容器,并且安装nginx服务
docker run -p 22022:22 -d ssh:centos /usr/sbin/sshd -D #启动制作好的镜像,并且默认运行的/bin/bash替换成/usr/sbin/sshd服务。并且将22端口暴露至宿主机22022端口
ssh 127.0.0.1 -p 22022 #远程连接至容器
yum install nginx #
echo "daemon off;" >> /etc/nginx/nginx.conf #以前台方式运行nginx
cat >> /root/bin/run.sh <<EOF
#!/bin/bash
/usr/sbin/sshd && /usr/sbin/nginx
EOF
docker commit 228e3e67e9d2 nginx:centos #将制作好的镜像保存至nginx:centos镜像
docker run --name nginx1 -p22022:22 -p 8080:80 -d nginx:centos /root/bin/run.sh #启动新建的容器。并且将端口暴露至宿主机端口
使用dockerfile文件建立
vim /root/Dockerfile
FROM ssh:centos ##FROM 从sshd:centos镜像基础上面创建
RUN yum install nginx -y ##RUN 运行shell命令
ADD run.sh /root/bin/ ##ADD 相当于cp的动能将run.sh放置在目标目录/root/bin下但run.sh脚本必须在dockerfile文件的父目录中,
WORKDIR /root/bin/ ##WORKDIR 这个相当于cd命令
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf && chmod 755 /usr/local/sbin/run.sh ##修改配置文件以非守护进程启动修改脚本权限
EXPOSE 80 开放80 22 端口
EXPOSE 22
CMD ["/usr/local/sbin/run.sh"] ##CMD是要运行的命令,一个Dockerfile里面只能有一个CMD,如果有好几个,那么只会运行最后一个 如果以中括号括起来则表示不以shell -c方式运行而独立运行
docker . build -t webdockerfile:centos #基于dockerfile文件构建镜像
docker run -d -p 12345:22 -p 9527:80 webdockerfile:centos /usr/local/sbin/run.sh ##启动镜像
docker image save imagename -o name.tar#将制作好的镜像变成打包文件
docker image load imagename.tar
4、简述lvs-nat、lvs-dr、lvs-tun、lvs-fullnat优点及使用场景
lvs :linux virtual server 在内核中实现调度。
ipvs。内核中实现调度功能的框架模块 ipvsadmin属于ipvs的管理端,负责生产规则发送给内核ipvs处理
ipvs调度算法:静态算法以及动态算法
静态算法:仅根据算法本身和请求报文特征进行调度
rr算法:round-robin 轮询算法,调度器将请求按照顺序发往real server
wrr算法:weighted rr 加权轮询算法,将服务器加权,实现能者多劳的目的,性能好的机器权重高,分配的请求就多。
sh:源地址哈希算法 将源ip地址做哈希,在对服务器数量去模,如果余出来的数字对应服务器的号码。则发往那台服务器,如果请求来自同一台ip地址,则发往同一台服务器,如果服务器有权重,则对权重取模,余几则调度到第几号服务器。
dh:目标地址哈希算法,对同一个地址的访问则由同一台服务器代理缓存。
动态算法:根据算法本身和请求报文特征,还要考虑后端real server的负载状态进行调度
lc:least connections 最少连接算法,后端服务器谁的连接最少则调度给谁
weighted lc:wlc加权最少连接。 对服务器加权。负债计算后对权重取模,权重大的负载少
LVS类型:NAT类型,DR类型,TUN类型,FULLNAT类型
NAT:基于NAT(多目标DNAT)方式调度,通过修改请求报文的目标ip和端口为调度算法挑选出的某后端的RS的real server ip和port;
调度器一块网卡面向公网接受请求,一块网卡转发请求至私网的后端服务器,且在同一网段
real 服务器网关要指向调度器的私有网卡ip
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发;
(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
(2)请求报文和响应报文都必须经由调度器转发;调度器易于成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标PORT;
(4)vs必须是Linux系统,rs可以是任意系统;
vip=调度器公网ip,dip=调度器私网ip,rip=后端服务器ip,cip=客户端ip
DR:报文首部不变,在原ip报文外封装一层以太网帧守护(源MAC,目标MAC)完成调度,有调度算法挑选出的后端服务器ip的mac地址;所以必须在同一个以太网中。
Direct Routing,直接路由;
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
Director和各RS都得配置使用VIP;
(1) 确保前端路由器将目标IP为VIP的请求报文发往Director:
(a) 在前端网关做静态绑定;
(b) 在RS上使用arptables;
(c) 在RS上修改内核参数以限制arp通告及应答级别;
arp_announce
arp_ignore
(2) RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;
(3) RS跟Director要在同一个物理网络;
(4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
(5) 不支持端口映射;
TUN:在源ip报文之外再封装一个新IP首部,用ip报文发另外一个ip报文。新报文中源ip为调度器ip目标ip则为real ip。可以实现异地调度
lvs-tun:
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP);
(1) DIP, VIP, RIP都应该是公网地址;
(2) RS的网关不能,也不可能指向DIP;
(3) 请求报文要经由Director,但响应不能经由Director;
(4) 不支持端口映射;
(5) RS的OS得支持隧道功能;
FULLNAT:通过修改请求报文的源ip(客户ip到调度ip)和目标ip(调度ip和real ip)完成调度
通过同时修改请求报文的源IP地址和目标IP地址进行转发;
CIP <--> DIP
VIP <--> RIP
(1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
(2) RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client;
(3) 请求和响应报文都经由Director;
(4) 支持端口映射;
注意:此类型默认不支持;
5、实现LVS-DT模型的集群,并采用加权轮询的算法
实现nat模型
安装ip_vs的前端管理工具 ipvsadm
yum install ipvsadm
##################################################################
ipvsadm命令:
核心功能:
集群服务管理:增、删、改;
集群服务的RS管理:增、删、改;
查看:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
管理集群服务:增、改、删;
增、改:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
删:
ipvsadm -D -t|u|f service-address
service-address:
-t|u|f:
-t: TCP协议的端口,VIP:TCP_PORT
-u: UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,是一个数字;
[-s scheduler]:指定集群的调度算法,默认为wlc;
管理集群上的RS:增、改、删;
增、改:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
删:
ipvsadm -d -t|u|f service-address -r server-address
server-address:
rip[:port]
选项:
lvs类型:
-g: gateway, dr类型
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重;
清空定义的所有内容:
ipvsadm -C
查看:
ipvsadm -L|l [options]
--numeric, -n:numeric output of addresses and ports
--exact:expand numbers (display exact values)
--connection, -c:output of current IPVS connections
--stats:output of statistics information
--rate :output of rate information
保存和重载:
ipvsadm -S = ipvsadm-save
ipvsadm -R = ipvsadm-restore
#########################################################################
使用docker容器做后端real server 用宿主机当调度器实现nat
docker image pull busybox #使用busybox镜像,内置有http进程
docker run --name rs1 -it --network bridge -v /vols/rs1:/data/web/html busybox #启动容器绑定挂载卷,如果路径不存在则会自动创建
echo hello world rs1 > /vols/rs1/index.html #创建测试页面
httpd -h /data/web/html/ # 在容器内启动httpd服务。
docker run --name rs2 -it --network bridge -v /vols/rs2/:/data/web/html busybox #启动第二个容器,并且创建测试页面
echo hello world rs2 > /vols/rs1/index.html #创建测试页面
httpd -h /data/web/html/ #在容器中启动httpd服务
默认开启docker之后在iptables规则中禁止转发,为了避免转发至后端服务器失败,需要设置一下docker.server文件加入ExecStart=/usr/sbin/iptables -P FORWARD ACCEPT 一行表示启动docker时开启FORWARD转发功能
iptables -P FORWARD ACCEPT #手动启动一下转发
ipvsadm -A -t 192.168.1.196:80 -s wrr #定义集群服务。-t表示tcp。将自己的ip作为对外提供服务。-s指定算法
[root@centos7 ~]# ipvsadm -L -n #查看集群服务
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.196:80 wrr
ipvsadm -a -t 192.168.1.196:80 -r 172.17.0.2:80 -m -w 1 #向集群192.168.1.196服务中添加后端第一台real server 172.17.0.2并且指定端口,-m表示nat类型-g表示dr-i表示tun隧道,-w指定权重为1
ipvsadm -a -t 192.168.1.196:80 -r 172.17.0.3:80 -m -w 1
如访问不了需要打开核心转发echo 1 > /proc/sys/net/ipv4/ip_forward
dr类型
使用两台虚拟机real server 地址为192.168.1.0与调度器在同以网段
yum install httpd -y
echo hello world rs1/2 >> /var/www/html/index.html
systemctl restart htt
fconfig ens32:0 172.17.0.10 netmask 255.255.255.255 broadcast 172.17.0.10 up #在调度器上配置一个供客户端访问的vip地址,设置广播地址为本机
#!/bin/bash 写脚本配置网卡信息及arp的报文的回应参数
vip=172.17.0.70
mask=255.255.255.255
interface="lo:0"
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
systemctl stop firewalld
ifconfig $interface $vip netmask $mask $vip up
route add -host $vip dev lo:0
;;
stop)
ifconfig $interface down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "arg error"
;;
esac
[root@centos7 ~]# ipvsadm -A -t 172.17.0.10:80 -s wrr #在调度机器上设置集群
[root@centos7 ~]# ipvsadm -a -t 172.17.0.10:80 -r 192.168.1.196 -g -w 2 #将后端机器加入集群
[root@centos7 ~]# ipvsadm -a -t 172.17.0.10:80 -r 192.168.1.197 -g -w 1
[root@centos7 ~]# ipvsadm -Ln
搭建完成
ipvsadm -E -t 172.17.0.10:80 -s sh 修改集群算法为长连接算法sh
6、利用LVS-FW方式实现LVS的affinity应用
防火墙标记:可将后端提供的服务打一个标签,按标签来调度请求。
在两台real server中 定义一个虚拟主机
vim /etc/httpd/conf.d/myhost.conf
Listen 8080
<VirtualHost *:80>
ServerName 192.168.1.196
DocumentRoot "/var/www/html"
<Directory "/var/www1/html">
Options none
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:8080>
ServerName 192.168.1.196
DocumentRoot "/var/www2/html"
Options none
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
mkdir -pv /www{1,2}/html #创建网页文件目录
echo hello worl 80 > /www1/html/index.html
echo hello worl 8080 > /www2/html/index.html
scp /etc/httpd/conf.d/myhost.conf 192.168.1.197:/httpd/conf.d/myhost.conf #拷贝至另一台real server 中修改配置文件虚拟主机地址为192.168.1.197
iptables -t -mangle -A PREROUTING -d 172.17.0.10 -p tcp -m multiport --dports 80,8080 -j MARK 7 #将请求至调度器的80,8080端口标记为7号标签
ipvsadm -A -f 7 -s wrr #添加标记7为集群地址
ipvsadm -a -f 7 -r 192.168.1.196 -g -w 1 #将后端地址添加至7号标签地址
ipvsadm -a -f 7 -r 192.168.1.197 -g -w 1
搭建完成
redis统一访问
yum install redis
vim /etc/redis.conf
bind 0.0.0.0 #修改redis的配置文件修改ip地址监听所有端口
ipvsadm -A -t 172.17.0.10:0 -s wrr -p 定义0号端口。客户端访问80或者6379或者其他端口则会被调度到后端对应提供端口的服务
ipvsadm -a -t 172.18.0.70:0 -r 192.168.1.196 -g -w 1
ipvsadm -a -t 172.18.0.70:0 -r 192.168.1.197 -g -w 1
定义两组集群,一组访问80以及8080使用长连接连接web服务
一组集群定义固定访问redis
ipvsadm -E -f 7 -s wrr -p 1200 定义防火墙标记,持久连接1200秒
ipvsadm -a -f 7 -r 192.168.1.196 -g -w 1 将real server 加入标签7
ipvsadm -a -f 7 -r 192.168.1.197 -g -w 1
ipvsadm -A -t 172.17.0.10:6379 -s wrr 另一组集群访问6379则会使用短连接访问redis
ipvsadm -a -t 172.168.0.10:6379 -r 192.168.1.196 -g -w 1
ipvsadm -a -t 172.168.0.10:6379 -r 192.168.1.197 -g -w 1
以上是关于docker及lvs负载的主要内容,如果未能解决你的问题,请参考以下文章
HAProxy基于KeepAlived实现Web高可用及动静分离
Docker环境下的前后端分离项目部署与运维项目简介及环境要求
微信群分享预告Kubernetes结合LVS实现高可用负载均衡与集群外服务访问
微信群分享预告Kubernetes结合LVS实现高可用负载均衡与集群外服务访问