在openstack管理的公有云或私有云中,默认情况下,用户创建的虚拟机是通过DHCP来获取自身的IP地址,虽然虚拟机是 通过DHCP来获取IP地址,但虚拟机每次获取的IP地址都是一样的。因此,其实很多用户可能会希望将网络配置写到配置文件 中,这样就不用周期性的通过DHCP获取IP地址了,可以避免DHCP服务不稳定带来的影响。另外,静态网络配置在有多块网卡 的情况下能够更准确的配置网络。

基本原理

通过cloud-init静态配置虚拟机的网络的原理是这样的:

  • nova创建虚拟机的过程中,将虚拟机的网络配置信息写入config drive
  • 虚拟机中安装的cloud-init读取config drive中的网络配置信息,将其转化为操作系统的网络配置
  • 操作系统的初始化程序根据配置进行网络初始化和网络配置

为了能够通过cloud-init自动配置虚拟机的网络,需要满足以下条件:

  • cloud-init版本 >= 0.7.9
  • nova启用了config drive
  • openstack版本 >= liberty

实现方法

下面,以CentOS 7为例,看看具体如何配置实现虚拟机网络的静态配置。

配置虚拟机镜像

首先需要更新虚拟机的镜像,更新cloud-init的版本,并禁用NetworkManager。

1
2
3
4
5
6
7
## 更新cloud-init rpm包
wget http://ftp.redhat.com/pub/redhat/linux/enterprise/7Server/en/RH-COMMON/SRPMS/cloud-init-0.7.9-3.el7.src.rpm
rpmbuild --rebuild cloud-init-0.7.9-3.el7.src.rpm
yum localinstall cloud-init-0.7.9-3.el7.centos.x86_64.rpm

## 禁用NetworkManager
systemctl disable NetworkManager

设置虚拟机网络

调整完虚拟机配置之后,创建一个虚拟网络,并禁用DHCP。操作命令如下:

1
2
3
4
5
6
## 如果要创建一个新的网络
$ neutron net-create net1
$ neutron subnet-create net1 192.168.1.0/24 --gateway 192.168.1.1 --disable-dhcp

## 如果更新一个已经创建的网络
$ neutron subnet-update --disable-dhcp <subnet uuid>

创建虚拟机

创建虚拟机,等虚拟机启动完成后,登陆虚拟机查看网络配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ip -f inet addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.1.128/24 brd 192.168.1.255 scope global dynamic eth1
        valid_lft 70782sec preferred_lft 70782sec

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=static
DEFROUTE=yes
DEVICE=eth0
GATEWAY=192.168.1.128
HWADDR=fa:16:3e:26:c7:af
IPADDR=192.168.1.1
MTU=1450
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Ethernet
USERCTL=no

上面的配置都是cloud-init自动生成的,因此,通过cloud-init可以实现静态网络配置,降低虚拟机对于DHCP的依赖。 通过cloud-init实现静态网络配置更重大的意义在于使用多个网络的情况下按需配置默认网关等。