回顾:
lvs:四层交换或四层路由器;
lvs-type:
nat/dr/tun(ipip)/fullnat
nat/fullnat:请求和响应都经由director;
nat:仅修改请求报文的目标IP和端口
fullnat:修改请求报文的源和目标IP,目标端口(源端口最好不改)
dr/tun:仅请求报文经由director
dr:dip所属的网络接口与各RS的RIP所属的网络接口要在同一个物理网络;
tun:从新封装,跨路由
lvs-scheduler:
静态算法:仅根据算法进行调度,适用于短连接
rr/wrr/sh/dh
动态算法:根据算法和后端服务器负载进行调度
lc/wlc/sed/nq,lblc/lblcr一般适用于正向代理的使用场景
nat:多目标的Dnat,最容易实现html
注意:若是每一个RS上安装了web服务和telnet服务,能够基于web来调度,也能够基于telnet来调度,能够分开进行调度
有时候监听的端口不一样不表明是不一样的服务,例如80,443一个是http,一个是https,这是同一种服务
有时候访问的url必须使用https服务,(会话绑定会怎样?)有时候nginx还能够改写http请求为https,意味着客户端要从新发起请求了,还有可能若是作了会话黏性,http一台主机,https一台主机,普通页面能够访问http,登录页面要访问https,这时候就会访问不到资源linux
把多个服务端口绑定为一个服务,基于防火墙标记来定义,让lvs识别为同一种服务,
也就是说基于iptables规则先把流量归为一类(打标记),而后根据防火墙标记来进行调度
在prerouting上作统一标记,input上根据标记来调度,哪一个标记调度到哪里nginx
接下来演示将多个服务统一调度:
视频中机器重启了,配置就丢了,rs先配置vip地址,而后设置内核参数,测试vip,ping不通而后directory配置vip,就能ping通web
视频中机器重启了,配置丢了
directory:192.16.0.6
ifconfig eno16777736:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---配置vip
ifconfig---查看ip配置好没有
这时能够ping通,由于ping的是directory算法
RS1:172.16.0.7
bash -x setparam.sh start
ifconifg
scp setparam.sh 172.16.0.8:/root/
而后ping vip172.16.0.99不通,由于directory尚未配置,上边的directory vip配置vim
systemctl start httpd.service后端
RS2:172.16.0.8
bash -x setparam.sh start
ifconifg缓存
systemctl start httpd.servicebash
这里使用sh模型来演示,之前讲过不一样服务怎么调度,这里就不演示了
http可使用httpd服务,可是https须要配置证书的,两台机器可使用相同的证书,私钥也是同一个,https很贵又很慢,意味着每次会话请求要使用更多的资源,为了加速,使用会话缓存。
ssl服务创建后,在服务端会有缓存机制,默认会话缓存5分钟,有两种逻辑,一、每个worker进程有本身的私有缓存(有问题,被调度后会话到另外一个server上了),二、多个worker可使用共享缓存
使用同一个证书就能够缓存了,可是会出现1的问题,因此只能会话绑定,可是又违反负载均衡规则,因此,
能够这么作,用户请求到达调度器是ssl会话,调度器和server之间就不是ssl了,不过这是lvs作不到的,lvs只能让rs都配置证书,nginx可让nginx本身安装证书,rs不须要,nginx前还可使用lvs进行四层调度。灵活运用!!!服务器
把lvs:director看成调度器和CA
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)---建立私钥
req -new -x509 -key private/cakey.pem -out cacert.pem -days 365---生成自签证书,会要求输入证书的内容,时间是1年
Country Name:CN
State or Province Name:Beijing
Locality Name:Beijing
Organization Name:MageEdu
Organizational Unit Name:devops
Common Name:ca.ilinux.io
touch index.txt
echo 01 > serial
本机或者后端RS均可以生成私钥和证书请求,只要复制给其余主机就能够,视频中仍然是在本机设置
openssl genrsa -out httpd.key 2048---生成私钥
chmod 600 httpd.key---修改权限
openssl req -new -key httpd.key -out httpd.csr---会要求输入证书的内容
Country Name:CN
State or Province Name:Beijing
Locality Name:Beijing
Organization Name:MageEdu
Organizational Unit Name:devops
Common Name:www.ilinux.io---必定是解析成vip地址时的域名
openssl ca -in httpd.csr -out httpd.crt -days 365
把crt和key证书和私钥复制给rs
scp -p httpd.crt httpd.key 172.16.0.7:/etc/httpd/conf.d/
scp -p httpd.crt httpd.key 172.16.0.8:/etc/httpd/conf.d/
RS1:
172.16.0.7---就能够配置ssl了
yum -y install mod_ssl---安装模块
vim /etc/httpd/conf.d/ssl.conf---作以下修改:
DocumentRoot “/var/www/html”---把注释去掉
ServerName www.ilinux.io---修改成本身的主机名
SSLCertificateFile /etc/httpd/conf.d/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/httpd.key
httpd -t检查下语法
systemctl restart httpd.service
ss -tnl---能够看到80、443就能够
scp ssl.conf 172.16.0.8:/etc/httpd/conf.d/
而后172.16.0.8就能够直接重启服务了
systemctl restart httpd.service
ss -tnl---能够看到80、443就能够
CURL能够指明使用哪一个协议使用哪一个证书来访问,若是要验证客户端发过来的证书,要指明本身的ca证书,
curl --cacert /etc/pki/CA/cacert.pem https://172.16.0.7---这里会有问题,没有作域名
vim /etc/hosts---添加下面一行
172.16.0.7 www.ilinux.io
证实能够访问了,就须要把两个服务打包成一个了
在172.16.0.6上作
iptables -F---先清空全部的规则
iptables -t mangle -vnL---查看现有的规则
iptables -t mangle -A PREROUTING -d 172.16.0.99 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 3
iptables -t mangle -vnL---查看现有的规则
ipvsadm -A -f 3 -s sh---f表示防火墙标记为3的流量,sh是调度方法
ipvsadm -a -f 3 -r 172.16.0.7 -g---r是realserver的意思
ipvsadm -a -f 3 -r 172.16.0.8 -g---r是realserver的意思
ipvsadm -ln---查看ipvs的规则列表
而后在一个客户端:这是测试客户端
vim /etc/hosts---添加下列一行
172.16.0.99 www.ilinux.io
curl http://www.ilinux.io/test1.html
屡次请求能够看到始终访问的是rs1,由于使用的sh算法
在172.16.0.6上
scp /etc/pki/CA/cacert.pem 172.16.0.67:/root/---放到客户端上
客户端上再次请求
curl --cacert /root/cacert.pem https://www.ilinux.io/test1.html
屡次访问能够看到,仍然是绑定在rs1上,由于是用了sh算法
172.16.0.6上
ipvsadm -E -f 3 -s rr---更换调度方法为rr轮询
ipvsadm-save > /etc/sysconfig/ipvsadm
iptables-save > /etc/sysconfig/iptables
在客户端上
for i in {1..10}; do curl http://www.ilinux.io/test1.html;curl --cacert /root/cacert.pem https://www.ilinux.io/test1.html;done
这是一个循环,能够看到是轮询调度的
注意:sh算法是根据源地址和hash来进行绑定,可是绑定多长时间呢?不知道
视频中的课件:
FWM:FireWall Mark
netfilter:
target:MARK,This target is used to set the Netfilter mark value assoclated with the packet.
--set-mark value
借助于防火墙标记来分类报文,然后基于标记定义集群服务;可将多个不一样的应用使用同一个集群服务进行调度;
打标记方法(在Director主机): #iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 基于标记定义集群服务: #ipvsadm -A -f NUMBER[options] lvs persistence:持久链接---脱离于算法,不管用什么算法都是持久的 持久链接模板:实现不管使用任何调度算法,在一段时间内,可以实现未来自同一个地址的请求始终发往同一个RS; ipvsadm -A|E -t|u|f service-address [-s scheduler][-p [timeout]] port Affinity: 每端口持久:每一个端口对应定义为一个集群服务,每集群服务单独调度; 每防火墙标记持久:基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity; 每客户端持久:基于0端口定义集群服务,即将客户端对应全部应用的请求通通调度至后端主机,必须定义为持久模式; 保存及重载规则: 保存:建议保存至/etc/sysconfig/ipvsadm ipvsadm-save > /PATH/TO/IPVASDM_FILE ipvsadm -S > /PATH/TO/IPVSADM_FILE systemctl stop ipvsadm.service 重载: ipvsadm-restore < /PATH/FROM/IPVSADM_FILE ipvsadm -R > /PATH/FROM/IPVSADM_FILE systemctl restart ipvsadm.service 考虑: (1)Director不可用,整个系统将不可用;SPoF 解决方案:高可用 keepalived heartbeat/corosync (2)某RS不可用时,Director依然会调度请求至此RS; 解决方案:对各RS的健康状态作检查,失败时禁用,成功时启用; keepalived heartbeat/corosync,idirectord
注意:ipvsadm -A -t 172.16.0.99:0 -s rr -p---不加-p选项会报错,必须加,0表示通配,全部的服务都做为一个集群服务ipvsadm -a -t 172.16.0.99:0 -r 172.16.0.7 -gipvsadm -a -t 172.16.0.99:0 -r 172.16.0.8 -gipvsadm -ln而后客户端继续使用for循环仍然能够看到是绑定在一台主机上的,由于使用了持久连接。