回顾:
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,最容易实现
注意:如果每个RS上安装了web服务和telnet服务,可以基于web来调度,也可以基于telnet来调度,可以分开进行调度
有时候监听的端口不同不代表是不同的服务,例如80,443一个是http,一个是https,这是同一种服务
有时候访问的url必须使用https服务,(会话绑定会怎样?)有时候nginx还可以改写http请求为https,意味着客户端要重新发起请求了,还有可能如果做了会话黏性,http一台主机,https一台主机,普通页面可以访问http,登陆页面要访问https,这时候就会访问不到资源
把多个服务端口绑定为一个服务,基于防火墙标记来定义,让lvs识别为同一种服务,
也就是说基于iptables规则先把流量归为一类(打标记),然后根据防火墙标记来进行调度
在prerouting上做统一标记,input上根据标记来调度,哪个标记调度到哪里
接下来演示将多个服务统一调度:
视频中机器重启了,配置就丢了,rs先配置vip地址,然后设置内核参数,测试vip,ping不通然后directory配置vip,就能ping通
视频中机器重启了,配置丢了
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配置
systemctl start httpd.service
RS2:172.16.0.8
bash -x setparam.sh start
ifconifg
systemctl start httpd.service
这里使用sh模型来演示,以前讲过不同服务怎么调度,这里就不演示了
http可以使用httpd服务,但是https需要配置证书的,两台机器可以使用相同的证书,私钥也是同一个,https很贵又很慢,意味着每次会话请求要使用更多的资源,为了加速,使用会话缓存。
ssl服务建立后,在服务端会有缓存机制,默认会话缓存5分钟,有两种逻辑,1、每一个worker进程有自己的私有缓存(有问题,被调度后会话到另一个server上了),2、多个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 -g
ipvsadm -a -t 172.16.0.99:0 -r 172.16.0.8 -g
ipvsadm -ln
然后客户端继续使用for循环仍然可以看到是绑定在一台主机上的,因为使用了持久链接。
原文地址:https://blog.51cto.com/13852573/2364129