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)

 

技术图片
查看容器IP地址

 

技术图片
在外部访问容器内nginx服务

docker container exec -it nginx1 /bin/sh  连接至容器可以查看容器内部运行方式

 

技术图片
容器内进程第一个为nginx

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网络,即是共享式网络

 

技术图片
ip地址与box容器ip地址一样

 

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端口

 

技术图片
随机端口为32768

 

技术图片
 

 

技术图片
 

[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实现高可用负载均衡与集群外服务访问

Docker-----三剑客:machinecomposeswarm 及Docker集群管理

AWS EC2+Docker+JMeter构建分布式负载测试基础架构