1. 程式人生 > >系統重啟後恢復OpenStack網路設定-tips

系統重啟後恢復OpenStack網路設定-tips

眼看著今天就要過去了,一個月就要過去了,馬上一年也就要過去了,可你又能怎樣? 昨天在焦慮,今天還在焦慮,明天將繼續焦慮,何時能停止? 既然無力掙扎,那就閉著眼睛過吧,時間最終會給我們答案,塵過塵,土歸土,看談一些就好,看空一些就好。

不管OpenStack是不是還有些把玩的價值,但終歸割捨不下,我一直把它看作一本書,一本可以提升自己的書,至於它能帶給你什麼? Who knows? Who cares?

所以,當實驗室裡每次斷電之後,虛擬網路都將無法工作,我還是會繼續去stack一下,終於有一天我無法再次忍受,我要去看個究竟,當愚鈍的翻過一行一行指令碼之後,我好像找到了答案。

先看看lib/neutron_plugins/services/l3

裡的這個函式:

function _configure_neutron_l3_agent {

    cp $NEUTRON_DIR/etc/l3_agent.ini.sample $Q_L3_CONF_FILE

    iniset $Q_L3_CONF_FILE DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL
    iniset $Q_L3_CONF_FILE AGENT root_helper "$Q_RR_COMMAND"
    if [[ "$Q_USE_ROOTWRAP_DAEMON" == "True" ]]; then
        iniset $Q_L3_CONF_FILE
AGENT root_helper_daemon "$Q_RR_DAEMON_COMMAND" fi _neutron_setup_interface_driver $Q_L3_CONF_FILE neutron_plugin_configure_l3_agent $Q_L3_CONF_FILE # If we've given a PUBLIC_INTERFACE to take over, then we assume # that we can own the whole thing, and privot it into the OVS # bridge. If we are not, we're probably on a single interface
# machine, and we just setup NAT so that fixed guests can get out. if [[ -n "$PUBLIC_INTERFACE" ]]; then # *看這裡!* _move_neutron_addresses_route "$PUBLIC_INTERFACE" "$OVS_PHYSICAL_BRIDGE" True False "inet" if [[ $(ip -f inet6 a s dev "$PUBLIC_INTERFACE" | grep -c 'global') != 0 ]]; then _move_neutron_addresses_route "$PUBLIC_INTERFACE" "$OVS_PHYSICAL_BRIDGE" False False "inet6" fi else for d in $default_v4_route_devs; do sudo iptables -t nat -A POSTROUTING -o $d -s $FLOATING_RANGE -j MASQUERADE done fi }

從這個函式可以看出,如果綁定了某一個物理網絡卡(例如在localrc中配置了"PUBLIC_INTERFACE"),那麼將會呼叫"_move_neutron_addresses_route"來做進一步處理,否則就做一個源地址偽裝(MASQUERADE)就算完了。

核心就是這段程式碼了,

_move_neutron_addresses_route "$PUBLIC_INTERFACE" "$OVS_PHYSICAL_BRIDGE" True False "inet"

來重點看下繫結物理網絡卡的處理方式,函式有點長,我們調重點的看一下部分核心程式碼,

# lib/neutron-legacy
# _move_neutron_addresses_route() - Move the primary IP to the OVS bridge
# on startup, or back to the public interface on cleanup. If no IP is
# configured on the interface, just add it as a port to the OVS bridge.
function _move_neutron_addresses_route {
...
    if [[ -n "$from_intf" && -n "$to_intf" ]]; then
...
        DEFAULT_ROUTE_GW=$(ip -f $af r | awk "/default.+$from_intf\s/ { print \$3; exit }")
        IP_BRD=$(ip -f $af a s dev $from_intf scope global primary | grep inet | awk '{ print $2, $3, $4; exit }') #①

        if [ "$DEFAULT_ROUTE_GW" != "" ]; then
            ADD_DEFAULT_ROUTE="sudo ip -f $af r replace default via $DEFAULT_ROUTE_GW dev $to_intf" # ②
        fi
        if [[ "$add_ovs_port" == "True" ]]; then
            ADD_OVS_PORT="sudo ovs-vsctl --may-exist add-port $to_intf $from_intf" # ③
        fi
...
        if [[ "$IP_BRD" != "" ]]; then
            IP_DEL="sudo ip addr del $IP_BRD dev $from_intf" # ④
            IP_REPLACE="sudo ip addr replace $IP_BRD dev $to_intf" # ⑤
            IP_UP="sudo ip link set $to_intf up" # ⑥
            if [[ "$af" == "inet" ]]; then
                IP=$(echo $IP_BRD | awk '{ print $1; exit }' | grep -o -E '(.*)/' | cut -d "/" -f1)
                ARP_CMD="arping -A -c 3 -w 4.5 -I $to_intf $IP " # ⑦
            fi
        fi
...
        $DEL_OVS_PORT; $IP_DEL; $IP_REPLACE; $IP_UP; $ADD_OVS_PORT; $ADD_DEFAULT_ROUTE; $ARP_CMD

先來看下網路的路由配置情況,eno2將會作為PUBLIC_INTERFACE被繫結到br-ex上。

$ ip route
default via 192.168.18.1 dev eno2  proto static  metric 100
169.254.0.0/16 dev docker0  scope link  metric 1000 linkdown
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown
192.168.16.0/21 dev eno2  proto kernel  scope link  src 192.168.18.24  metric 100
  1. 這兩句是獲取系統當前的一些網路配置,DEFAULT_ROUTE_GW是物理機的預設路由,IP_BRD得到的是物理網絡卡上的主IP地址配置。
$ ip -f inet r | awk "/default.+eno2\s/ { print \$3; exit }"
192.168.18.1

$ ip -f inet a s dev eno2 scope global primary | grep inet | awk '{ print $2, $3, $4; exit }'
192.168.18.24/21 brd 192.168.23.255
  1. 將預設路由替換為目標網絡卡,這裡當然是替換為OVS的bridge br-ex,這一步之後預設的路由的IP地址雖然沒變,但是device已經改為br-ex了。
$ sudo ip -f inet r replace default via 192.168.18.1 dev br-ex
  1. 將物理網絡卡繫結到br-ex上。
$ sudo ovs-vsctl --may-exist add-port br-ex eno2
  1. 這一步將物理網絡卡上的主IP地址刪除,之後該地址將配置到br-ex上。
$ sudo ip addr del 192.168.18.24/21 brd 192.168.23.255 dev eno2
  1. 將物理網絡卡上的主IP地址配置到br-ex上。
$ sudo ip addr replace 192.168.18.24/21 brd 192.168.23.255 dev br-ex
  1. 不解釋
$ sudo ip link set br-ex up
  1. 設定ARP請求的一些引數,arping沒用過,具體在幹什麼,還是不太瞭解。
$ arping -A -c 3 -w 4.5 -I br-ex 192.168.18.24

之後就是順序執行這幾個命令了,一句話來解釋這段程式碼乾的事情就是這段註釋:

Move the primary IP to the OVS bridge on startup, or back to the public interface on cleanup. If no IP is configured on the interface, just add it as a port to the OVS bridge.

如果系統reboot了,網路掛了,不行就順序再來一便吧,但問題是為什麼網路不能自動恢復?這是個大問題啊?!

希望國慶節之後能對DVR來做個了結吧。

p.s. 天又晚了,碼字確實費時間。