恢复OpenStack虚拟机网络(Network is unreachable)

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:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
2: ens3:  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上了

你可能感兴趣的:(恢复OpenStack虚拟机网络(Network is unreachable))