1. 程式人生 > >3-6-LVS實現企業負載均衡高級應用配置實戰

3-6-LVS實現企業負載均衡高級應用配置實戰

cas ipvsadm 配置ssl 列表 修改權限 ping不通 必須 tar 私鑰

回顧:
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循環仍然可以看到是綁定在一臺主機上的,因為使用了持久鏈接。

3-6-LVS實現企業負載均衡高級應用配置實戰