恢复OpenStack虚拟机网络(Network is unre
1.背景
大清早突然被告知 OpenStack 环境中那台特别重要的节点又ping不通了
心想,这还不简单,“重启一下”。找到这台data节点(下文统称data节点)所在的计算节点,重启网桥:
service neutron-linuxbridge-agent restart
以前这么操作都是可以的,今天重启网桥后,还是ping不通,我知道,麻烦来了
从 OpenStack 控制台中登录进去(之前设了root用户和密码),运行 ifconfig
看一下,发现 ipv4
地址没有了,大概是下图的样子:
root@data-selfservice:~# ifconfig
ens3 Link encap:Ethernet HWaddr fa:16:3e:70:ba:03
inet6 addr: fe80::f816:3eff:fe70:ba03/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:37595 errors:0 dropped:0 overruns:0 frame:0
TX packets:35336 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2803538 (2.8 MB) TX bytes:2996436 (2.9 MB)
用它 ping 网关或baidu的时候,出现了臭名昭著的 Network is unreachable
OpenStack 里的虚拟机都是由 OpenStack 的 dhcp 服务分配ip的,创建虚拟机之后两手一撒,网络部分全部交给 OpenStack 负责就行了。像这样把 ipv4
都丢掉的情况我还甚是少见,心里不禁有点惊慌
惊慌的原因在于,这台data节点上存着我们的很多代码,这些代码大多都没传到git上,要是一不小心把data节点搞坏了,那代码就没了。稳妥起见,我先对这台data节点创建了一个快照,创了好久,终于创完了快照,然后我就开始了data节点的网络修复之路
在开始网络修复之前,简单介绍一下网络背景:我们实验室的网络环境是192.168.0.0/24,OpenStack 环境的 provider 网段也在192.168.0.0/24,另外有一个 selfservice 网络,网段在192.168.1.0/24。这台data节点是以selfservice 网络创建的,ip为192.168.1.41,还绑定了浮动ip,ip地址为192.168.0.126,供我们平时访问
好了,开始网络修复
2. ifconfig up、ifup、dhclient无效
总结一下症状,ipv4丢失,节点ping不通网关、baidu
第一个想到的就是查看下网络接口状态,运行 ip a
,理想状态下,应该是像下面这样:
root@data-selfservice:~# ip a | grep state
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
发现是down,于是运行 ifconfig ens3 up
,可惜无效,又运行 ifup ens3
,无效。
把以下指令都折腾一遍,都不起作用:
ifconfig ens3 down / ifconfig ens3 up
ifdown ens3 / ifup ens3
/etc/init.d/networking restart
service networking restart
突然想到,ipv4
没了,是不是该想办法给重新分配一个ip?网上查到了一个方法,dhclient ens3
,病急乱投医,也试了一下,等了很久,命令终于执行完了,但还是不行
3.重设ip思路
按照常理来说,出现这种情况的话,我会去修改网络接口配置文件,于是去 /etc/network/interfaces
看了一眼,OpenStack 创建的虚拟机的配置文件是这样的:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# Source interfaces
# Please check /etc/network/interfaces.d before changing this file
# as interfaces may have been defined in /etc/network/interfaces.d
# See LP: #1262951
source /etc/network/interfaces.d/*.cfg
注意最后一行,再去看 /etc/network/interfaces.d/*.cfg
,是这个文件/etc/network/interfaces.d/50-cloud-init.cfg
:
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
auto lo
iface lo inet loopback
auto ens3
iface ens3 inet dhcp
ip是由 OpenStack 动态分配的,如果我手动改成静态ip的话,会不方便OpenStack的管理(数据库,port和ip的对应等),所以应该想办法让 OpenStack 重新分配一下ip
于是去查方法,找到一个方法可以让 OpenStack 把端口的ip设为指定ip,然后手动修改下网络接口配置,配置成静态ip,再改一下数据库,就可以改变虚拟机的ip。这时候我的虚拟机没有ip,所以可以用这个方法重设ip一下
4.OpenStack重设ip
重设ip的方法如下:
step 1 找到虚拟机对应端口
用data节点的ip,grep搜一下,第一个字段就是该data节点对应的端口ip
端口ip为 9afa9890-294d-4410-9c95-fa75a38229b6
neutron port-list | grep 192.168.1.41
| 9afa9890-294d-4410-9c95-fa75a38229b6 | | 4e3bdf24b3db42a290e0b68e5fc02b47 | fa:16:3e:70:ba:03 | {"subnet_id": "791e39ee-49cb-4140-8e5a-35f9f0f36716", "ip_address": "192.168.1.41"} |
step 2 更改端口对应ip
注意确定要更改的ip没有冲突,这里我改为了 192.168.1.42
(不知道写成 192.168.1.41 会发生什么)
neutron port-update 9afa9890-294d-4410-9c95-fa75a38229b6 --allowed-address-pairs type=dict list=true ip_address=192.168.1.42
step 3 修改网络接口配置文件
注释掉最后一行,改成刚才设定的静态ip,netmask和gateway参照创建selfservice时的设置
vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
auto ens3
iface ens3 inet static
address 192.168.1.42
netmask 255.255.255.0
gateway 192.168.1.1
# Source interfaces
# Please check /etc/network/interfaces.d before changing this file
# as interfaces may have been defined in /etc/network/interfaces.d
# See LP: #1262951
#source /etc/network/interfaces.d/*.cfg
step 4 重启网络
以下指令都可以
ifconfig ens3 down / ifconfig ens3 up
/etc/init.d/networking restart
service networking restart
然后突然就能ping通网关了
step 5 修改数据库端口和IP的对应
MariaDB [neutron]> select * from ipallocations where port_id='9afa9890-294d-4410-9c95-fa75a38229b6';
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
| port_id | ip_address | subnet_id | network_id |
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
| 9afa9890-294d-4410-9c95-fa75a38229b6 | 192.168.1.41 | 791e39ee-49cb-4140-8e5a-35f9f0f36716 | 0cf73d00-b442-4205-8aea-8d41c4ee2607 |
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
MariaDB [neutron]> update ipallocations set ip_address='192.168.1.42' where port_id='9afa9890-294d-4410-9c95-fa75a38229b6';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [neutron]> select * from ipallocations where port_id='9afa9890-294d-4410-9c95-fa75a38229b6';
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
| port_id | ip_address | subnet_id | network_id |
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
| 9afa9890-294d-4410-9c95-fa75a38229b6 | 192.168.1.42 | 791e39ee-49cb-4140-8e5a-35f9f0f36716 | 0cf73d00-b442-4205-8aea-8d41c4ee2607 |
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
1 row in set (0.00 sec)
step 6 解绑浮动IP再重新绑定
之前说到,这台data节点的浮动ip是 192.168.0.126,供我们从外部网络访问。在horizon界面上把data节点的浮动IP解绑,再重新绑定,就可以从外部(用192.168.0.126)访问了
果然是话痨属性,把挺简单的操作写了这么一串,还有,是时候让他们把代码都传到git上了