8.實現負載均衡與外網訪問
負載均衡(Load Balancing)是將來訪的網絡流量在運行相同應用的多個服務器之間進行分發的一種核心網絡服務。它的功能由負載均衡器(load balancer)提供。負載均衡器可以是一個硬件設備,也可以由軟件實現。它充當反向代理,在多個服務器之間分發網絡或者應用流量。它常用來增加應用的訪問容量(並發用戶數)和可靠性,它也會通過降低服務器的負載來提高應用的總體性能。
下面我們選擇tenant1下的vm1和vm2兩台虛機搭建負載均衡服務
8.1搭建負載均衡服務
1)安裝haproxy
yum install -y haproxy
2)在網絡節點創建負載均衡命名空間和相應設備
ovs-vsctl -- --if-exists del-port tap04 -- add-port br-int tap04 -- set interface tap04 type=internal ovs-vsctl set Port tap04 tag=1 ip link set tap04 address fa:16:3e:f4:8f:ae ip netns add qlbaas-01 ip netns exec qlbaas-01 sysctl -w net.ipv4.conf.all.promote_secondaries=1 ip link set tap04 netns qlbaas-01 ip netns exec qlbaas-01 ip link set lo up ip netns exec qlbaas-01 ip link set tap04 up ip netns exec qlbaas-01 ip addr show tap04 permanent scope global ip netns exec qlbaas-01 ip -4 addr add 10.0.0.100/24 brd 10.0.0.255 scope global dev tap04 ip netns exec qlbaas-01 ip route list dev tap04 scope link ip netns exec qlbaas-01 route add default gw 10.0.0.1 ip netns exec qlbaas-01 arping -U -I tap04 -c 3 10.0.0.100
3)配置haproxy配置文件
mkdir -p /var/lib/neutron/lbaas/
vi haproxy.cfg編輯文件:
global daemon user haproxy group haproxy log /dev/log local0 log /dev/log local1 notice stats socket /root/sock mode 0666 level user defaults log global retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 frontend 0c32d37d-f84a-4309-9e01-72d9f0bac69e option tcplog bind 10.0.0.100:80 mode http default_backend 3b9d8ebd-9eea-4925-b14e-593a6111ff33 maxconn 100 option forwardfor backend 3b9d8ebd-9eea-4925-b14e-593a6111ff33 mode http balance roundrobin option forwardfor timeout check 5s server 1f74a288-937d-4804-9ded-472a5d1110dc 10.0.0.81:80 weight 1 check inter 5s fall 3 server 944ff4a0-4070-40e4-8189-20f385755113 10.0.0.82:80 weight 1 check inter 5s fall 3
4)在命名空間啟動haproxy服務
ip netns exec qlbaas-01 haproxy -f /root/haproxy.cfg -p /root/pid
5)在vm1和vm2虛機分別啟動http的80端口
#while true; do echo -e 'HTTP/1.0 200 OK\r\n\r\nserver_81' | sudo nc -l -p 80; done #while true; do echo -e 'HTTP/1.0 200 OK\r\n\r\nserver_82' | sudo nc -l -p 80; done
6)通過命名空間訪問http://10.0.0.100,可以返回vm1和vm2兩個虛機不同的返回結果
#ip netns exec qlbaas-01 wget http://10.0.0.100
8.2對負載均衡vip分配floating ip,外網可以訪問
1)如果沒有創建br-ex外網橋,需要創建
ovs-vsctl --timeout=10 -- --if-exists del-br br-ex ovs-vsctl --timeout=10 -- --may-exist add-br br-ex ovs-vsctl add-port br-ex eth3 ip link set dev eth3 up ip link set dev br-ex up
2)在網絡節點上創建qrouter01命名空間和qr01默認網關(10.0.0.1)
ovs-vsctl -- --if-exists del-port qr01 -- add-port br-int qr01 -- set interface qr01 type=internal ovs-vsctl --timeout=10 set Port qr01 tag=1 ip netns add qrouter01 ip netns exec qrouter01 ip link set lo up ip link set qr01 netns qrouter01 ip netns exec qrouter01 ip link set qr01 up ip netns exec qrouter01 ip -4 addr add 10.0.0.1/24 brd 10.0.0.255 scope global dev qr01
3)在外網橋br-ex上創建qg01並分配外網ip(10.255.253.10)
ovs-vsctl -- --if-exists del-port qg01 -- add-port br-ex qg01 -- set interface qg01 type=internal ip link set qg01 netns qrouter01 ip netns exec qrouter01 ip link set qg01 up ip netns exec qrouter01 ip -4 addr add 10.255.253.10/24 brd 10.255.253.255 scope global dev qg01 ip netns exec qrouter01 ip route replace default via 10.255.253.1 dev qg01 ip netns exec qrouter01 sysctl -w net.ipv4.ip_forward=1
4)下發iptables防火牆規則實現虛機內網ip與外網ip的snat與dnat映射
ip netns exec qrouter01 iptables -N neutron-filter-top ip netns exec qrouter01 iptables -A FORWARD -j neutron-filter-top ip netns exec qrouter01 iptables -A OUTPUT -j neutron-filter-top ip netns exec qrouter01 iptables -N neutron-l3-agent-local ip netns exec qrouter01 iptables -A neutron-filter-top -j neutron-l3-agent-local ip netns exec qrouter01 iptables -N neutron-l3-agent-INPUT ip netns exec qrouter01 iptables -N neutron-l3-agent-OUTPUT ip netns exec qrouter01 iptables -N neutron-l3-agent-FORWARD ip netns exec qrouter01 iptables -A INPUT -j neutron-l3-agent-INPUT ip netns exec qrouter01 iptables -A OUTPUT -j neutron-l3-agent-OUTPUT ip netns exec qrouter01 iptables -A FORWARD -j neutron-l3-agent-FORWARD ip netns exec qrouter01 iptables -t nat -N neutron-l3-agent-PREROUTING ip netns exec qrouter01 iptables -t nat -N neutron-l3-agent-OUTPUT ip netns exec qrouter01 iptables -t nat -N neutron-l3-agent-POSTROUTING ip netns exec qrouter01 iptables -t nat -A PREROUTING -j neutron-l3-agent-PREROUTING ip netns exec qrouter01 iptables -t nat -A OUTPUT -j neutron-l3-agent-OUTPUT ip netns exec qrouter01 iptables -t nat -A POSTROUTING -j neutron-l3-agent-POSTROUTING ip netns exec qrouter01 iptables -t nat -N neutron-postrouting-bottom ip netns exec qrouter01 iptables -t nat -N neutron-l3-agent-snat ip netns exec qrouter01 iptables -t nat -N neutron-l3-agent-float-snat ip netns exec qrouter01 iptables -t nat -A POSTROUTING -j neutron-postrouting-bottom ip netns exec qrouter01 iptables -t nat -A neutron-postrouting-bottom -j neutron-l3-agent-snat ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-snat -j neutron-l3-agent-float-snat ip netns exec qrouter01 iptables -A neutron-l3-agent-INPUT -s 0.0.0.0/0 -d 127.0.0.1 -p tcp -m tcp --dport 9697 -j ACCEPT ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-PREROUTING -s 0.0.0.0/0 -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-port 9697 ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-snat -j neutron-l3-agent-float-snat ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-POSTROUTING ! -i qg01 ! -o qg01 -m conntrack ! --ctstate DNAT -j ACCEPT ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-snat -s 10.0.0.0/24 -j SNAT --to-source 10.255.253.100 ip netns exec qrouter01 ip -4 addr add 10.255.253.100/24 brd 10.255.253.255 scope global dev qg01 ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-PREROUTING -d 10.255.253.100/32 -j DNAT --to 10.0.0.100 ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-OUTPUT -d 10.255.253.100/32 -j DNAT --to 10.0.0.100 ip netns exec qrouter01 iptables -t nat -A neutron-l3-agent-float-snat -s 10.0.0.100 -j SNAT --to 10.255.253.100
通過以上配置后外網通過10.255.253.100此ip即可訪問負載均衡服務的vip(10.0.0.100)地址。
參考資料:
SammyLiu的《Neutron 理解》系列 http://www.cnblogs.com/sammyliu/p/4622563.html
深入理解Neutron -- OpenStack 網絡實現 https://www.gitbook.com/book/yeasy/openstack_understand_neutron/details
作者簡介:趙俊峰,現為華勝信泰信息產業發展有限公司 雲計算部Openstack開發工程師。主要從事Power和x86混合環境下Openstack相關計算、網絡、存儲相關服務軟件開發和系統架構設計工作。