配置OpenStack VM启用多张网卡

[这篇文章是由巴拉克·梅里莫维奇撰写的。] 我们已经在之前的文章中广泛讨论了OpenStack网络。在这篇文章中,我想深入讲解一个更高级的OpenStack网络场景。

许多云系统镜像中默认不会显示全部的可用网卡。他们通常只配置一个网卡。我们需要在云主机中设置以启动多张网卡,首先请登录到云主机上并调出其他网卡接口,我们以Ubuntu系统为例命令如下:

echo $'auto eth1 \niface eth1 inet dhcp'| sudo tee /etc/network/interfaces.d/eth1.cfg > /dev/null
# auto eth1 \niface eth1 inet dhcp 使用dhcp分配eth1网卡动态IP地址
# tee命令将前面的输出写入/etc/network/interfaces.d/eth1.cfg配置文件中
sudo ifup eth1 # 启动eth1网卡

云中的网络

复合型的网络架构是现代IaaS(Infrastructure as a Service ,基础设施即服务)云的主流。了解如何配置基于云的网络和主机对于让您的应用程序在云中运行至关重要。我开发的开源云编排平台Cloudify就是为解决配置问题的。

曾经的扁平化云

以前,大多数IaaS提供商只支持扁平化网络 —— 即所有主机都在一个大型网络中。在云中运行的服务之间的分离是通过软件或防火墙/安全组来实施的。但从技术上讲,所有主机都连接到同一个大局域网内,彼此可见。

扁平网络模型很简单,因此易于理解。对于IaaS云的早期来说,这是一个不错的选择,有助于早期各个公司将应用程序迁移到云中。对于刚开始使用“云”的人来说,这种扁平网络模型使EC2更易于使用。实际上仍然可以在亚马逊云服务器中“EC2-Classic”(经典EC2实例)体验到扁平化的网络模型。而对于许多应用来说,一个扁平化网络就够了。

但随着云应用的增加,越来越复杂的应用迁移到了云端,网络分离,安全性,SLA(Service-Level Agreement)和广播域等问题催生了更复杂的网络模型结构。软件定义网络(SDN即Software-defined networking)填补了这一空白。他们现在是IaaS云的主要组成部分。AWS(Amazon Web Services)有AWS-VPC(Virtual Private Cloud,虚拟私有云),OpenStackNeutronNeutron是OpenStack 项目中负责提供网络服务的组件,它基于软件定义网络的思想,实现了网络虚拟化下的资源管理),还有很多其他的实现。

使用SDN需要更多地了解信息如何在云资源之间传递。在这篇文章中,我将讨论如何在云中设置一个主机,以便在复杂的网络环境中运行。我将使用OpenStack,其他云基础架构的设计是相似的。

Openstack配置 我将使用一个只有公共网络可用的新账号进行操作。

首先,让我们设置网络和路由器:

neutron router-create demo-router # 创建路由
neutron net-create demo-network-1 # 创建网络1
neutron net-create demo-network-2 # 创建网络2
neutron subnet-create --name demo-subnet-1 demo-network-1 10.0.0.0/24 # 创建子网1
neutron subnet-create --name demo-subnet-2 demo-network-2 10.0.1.0/24 # 创建子网2
neutron router-interface-add demo-router demo-subnet-1 # 创建子网1的网卡
neutron router-interface-add demo-router demo-subnet-2 # 创建子网2的网卡
neutron router-gateway-set demo-router public # 指定公网网关为刚刚创建的路由
# 以上操作实际创建了2个私有网络,
# 每个私有网络有一个子网,
# 每个子网通过demo-router互联并连接到公网

请注意网络ID:

neutron net-list # 列表所有的网络
| id | name | subnets | 
| 2c33efe2-6204-4125-9716-3bc525630016 | demo-network-1 | 928dafa0-83ef-459c-b20d-71d8ea596fa2 10.0.0.0/24 |
| aa30627e-c181-4a4b-89bf-5dd7c26c244e | demo-network-2 | 26d573f7-7953-4a54-825b-ed7bbc0661c7 10.0.1.0/24 |
| e502de8d-929a-4ee0-bd18-efa297875cf6 | public| d40dab51-a729-452c-9ee6-b9ad08d10808 |

我们将以标准的Ubuntu系统镜像为例:

glance image-create --name "Ubuntu 12.04 Standard" --location "http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img" --disk-format qcow2 --container-format bare
# 其中 "qcow2" 是QEMU(KVM)虚拟机使用的磁盘文件格式
# bare的容器格式,意指此镜像中不包含容器

创建密钥对和安全组:

# 创建密钥对
nova keypair-add demo-keypair> demo-keypair.pem 
# 密钥对文件需要改文件权限,一般只需拥有者只读权限
chmod 400 demo-keypair.pem 
# 创建安全组
nova s​​ecgroup-create demo-security-group "Security group for demo" 
# 允许全IP段访问TCP的22端口
nova s​​ecgroup-add-rule demo-security-group tcp 22 22 0.0.0.0/0 

启动一个连接到我们两个网络的实例:

我们开启了一个主机名为 demo-vm的虚拟机

nova boot -flavor m1.small --image“Ubuntu 12.04 Standard”?--nic net-id = 2c33efe2-6204-4125-9716-3bc525630016 --nic net-id = aa30627e-c181-4a4b-89bf-5dd7c26c244e --security-groups demo-security-group --key-name demo-keypair demo-vm

并为第一个网络设置浮动IP:

nova list 
| ID | Name | Status | Task State | Power State | Networks | 2b17588b-8980-4489-9a04-6539a159dc3c | demo-vm | ACTIVE | None | Running | demo-network-1=10.0.0.2; demo-network-2=10.0.1.2 |

neutron floatingip-create public # 创建一个公网的浮动IP

neutron floatingip-list # 浮动IP列表 

| id | fixed_ip_address | floating_ip_address | port_id | 
| 49c8b05e-bb8f-4b07-80ed-3155ab6ffc09 |  | 192.168.15.42 |  |

neutron port-list #  搜索端口
| id | name | mac_address | fixed_ips | 
| 1ccfd334-7328-4b22-b93e-24a0888276ab | | fa:16:3e:14:39:39 | {"subnet_id": "94598487-c1fc-4f55-ac1f-ef2545d5cfeb", "ip_address": "10.0.1.3"} | 
| a482c4f6-fa74-476e-b1ce-cd8dd0c70815 | | fa:16:3e:18:92:79 | {"subnet_id": "94598487-c1fc-4f55-ac1f-ef2545d5cfeb", "ip_address": "10.0.1.2"} | 
| b23d7836-30c5-4bff-b873-15c87ba051f6 | | fa:16:3e:3a:28:40 | {"subnet_id": "dec6ec74-cfa9-4a08-8792-54900631b98e", "ip_address": "10.0.0.3"} | 
| d421b447-2adf-406f-876b-142238683344 | | fa:16:3e:9d:fc:7f | {"subnet_id": "dec6ec74-cfa9-4a08-8792-54900631b98e", "ip_address": "10.0.0.2"} | 
| dcf8696b-cc80-4b48-b09c-61c0f8ab02ac | | fa:16:3e:5b:39:fb | {"subnet_id": "94598487-c1fc-4f55-ac1f-ef2545d5cfeb", "ip_address": "10.0.1.1"} | 
| f6a1666e-495a-4d3f-afa3-754b3cb3cfc0 | | fa:16:3e:8a:1b:fb | {"subnet_id": "dec6ec74-cfa9-4a08-8792-54900631b98e", "ip_address": "10.0.0.1"} |

# 将新建的浮动IP关联到上表第四个端口
# 命令格式 neutron floatingip-associate FLOATING_IP_ID INTERNAL_VM_PORT_ID
neutron floatingip-associate 49c8b05e-bb8f-4b07-80ed-3155ab6ffc09 d421b447-2adf-406f-876b-142238683344

请注意我们如何将虚拟机的IP与其端口相匹配,并将浮动IP关联到端口。我希望有一个更简单的方法来从CLI执行此操作...

如果一切正常,你应该有以下设置:

网络拓扑图

确保ssh正常工作:

# 使用密钥连接192.168.15.31
ssh -i demo-keypair.pem ubuntu@192.168.15.31 
hostname # 运行hostname命令 会发现demo-vm

太棒了,ssh正在工作。现在,我们应该有两张网卡。

ifconfig 
eth0 Link encap:Ethernet HWaddr fa:16:3e:5f:a2:5f 
inet addr:10.0.0.4 Bcast:10.0.0.255 Mask:255.255.255.0 
inet6 addr: fe80::f816:3eff:fe5f:a25f/64 Scope:Link 
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
RX packets:230 errors:0 dropped:0 overruns:0 frame:0 
TX packets:224 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:46297 (46.2 KB) TX bytes:31130 (31.1 KB)

# 回环网卡
lo Link encap:Local Loopback 
inet addr:127.0.0.1 Mask:255.0.0.0 
inet6 addr: ::1/128 Scope:Host 
UP LOOPBACK RUNNING MTU:16436 Metric:1 
RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:0 
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

咦?VM只有一个工作网络接口!我的第二个NIC在哪里?OpenStack网络设置是否存在配置问题?答案在这里:

ifconfig -a 
eth0 Link encap:Ethernet HWaddr fa:16:3e:5f:a2:5f 
inet addr:10.0.0.4 Bcast:10.0.0.255 Mask:255.255.255.0 
inet6 addr: fe80::f816:3eff:fe5f:a25f/64 Scope:Link 
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
RX packets:324 errors:0 dropped:0 overruns:0 frame:0 
TX packets:332 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:69973 (69.9 KB) TX bytes:47218 (47.2 KB)

eth1 Link encap:Ethernet HWaddr fa:16:3e:29:6d:22 
BROADCAST MULTICAST MTU:1500 Metric:1 
RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo Link encap:Local Loopback 
inet addr:127.0.0.1 Mask:255.0.0.0 
inet6 addr: ::1/128 Scope:Host 
UP LOOPBACK RUNNING MTU:16436 Metric:1 
RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:0 
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

第二个NIC(National Informatics Centre,网卡)存在,但并没有运行。

这个问题不在OpenStack网络配置中,而因为镜像的原因。应该将映像本身配置为与多个NIC正常工作。我们所要做的就是启动第二张网卡。所以我们进入实例:

ssh -i demo-keypair.pem ubuntu@192.168.15.31

然后运行以下命令:

echo $'auto eth1 \niface eth1 inet dhcp'| sudo tee /etc/network/interfaces.d/eth1.cfg > /dev/null
# 启动第二张网卡
sudo ifup eth1

第二张NIC现在应该正在运行:

ifconfig eth1
eth1 Link encap:Ethernet HWaddr fa:16:3e:18:92:79 
inet addr:10.0.1.2 Bcast:10.0.1.255 Mask:255.255.255.0 
inet6 addr: fe80::f816:3eff:fe18:9279/64 Scope:Link 
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
RX packets:81 errors:0 dropped:0 overruns:0 frame:0 
TX packets:45 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:15376 (15.3 KB) TX bytes:3960 (3.9 KB)

现在你的虚拟机可以访问这两个网络。

当建立一个复杂的应用程序,甚至是一个不太复杂的应用程序时,这个问题会变得复杂。如果你有一个Web服务器和一个数据库服务器。Web服务器连接到Network1和Network2,而数据库服务器只连接到Network2。Network1通过路由器连接到外部世界,Network 2完全在内部,为关键数据库服务器增加了另一层安全性。那么如果Web服务器只有一个网卡会发生什么?如果只有Network1的NIC启动,则Web服务器无法访问数据库。如果只有Network2的网卡启动,则无法从外部网络访问网络服务器。更糟糕的是,如果这个网络服务器是通过浮动IP访问的,这个IP也将不起作用,所以你将无法连接到Web服务器去解决此问题。真的很棘手啊!

结论

上面的命令让你可以使用多张网卡网卡。您当然需要为每个额外的网卡和每个虚拟机重复此过程。您也可以使用启动脚本(又名用户数据脚本)或系统服务来运行这些命令,但我还有更好的方法。我将在后续的文章中讨论如何自动化网络设置。

本文最早是出现在巴拉克的博客Head in the Clouds这里可以找到它。

本文的版权归 Hi胡瀚 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和未来有约会

Silverlight Cairngorm

Cairngorm这个词做过flex开发的朋友应该不会陌生,Cairngorm是Flex开发中的一个MVC框架,由Adobe官方提供支持。现在Silverlig...

28450
来自专栏深度学习那些事儿

如何从亚马逊下载aws-SpaceNet卫星遥感图片数据集

亚马逊SpaceNet数据集是作用于机器学习人工智能方面比赛或者研究用的商用数据集。我们在利用深度学习进行卫星图像分割时,比如利用FCN、Deeplab算法进行...

96050
来自专栏晓晨的专栏

Docker实用技巧之更改软件包源提升构建速度

地球,中国,成都市,某小区的阳台上,一青年负手而立,闭目沉思,阵阵的凉风吹得他衣衫呼呼的飘。忽然,他抬起头,刹那间,睁开了双眼,好似一到精光射向星空,只见这夜空...

10700
来自专栏个人分享

Linux知识体系之磁盘与档案系统管理

硬盘的物理组成:由许许多多的圆形硬盘盘所组成。宜居硬盘盘能够容纳的数据量,而有所谓的单碟或者多碟。

14550
来自专栏北京马哥教育

运维工具箱

运维精简工具箱 Bootstrapping:  Kickstart、Cobbler、rpmbuild/xen、kvm、lxc、 Openstack、 Clou...

529100
来自专栏图像识别与深度学习

64位Win10系统配置IIS 7.0+PHP+Mysql

25170
来自专栏FreeBuf

树莓派随身工具箱:中间人劫持获取控制权

上文讲解了树莓派随身工具箱的环境搭建,这段时间又对其进行了一些优化,主要是从便携美观上面改进。同时,在实际使用中发现了一些问题,并做了小小的改动。

33830
来自专栏技术小黑屋

Gmail托管邮箱发邮件认证失败

Gmail是一款很优秀的邮件工具,我一直使用Gmail来托管公司的邮箱,利用最棒的过滤器进行过滤垃圾邮件。前段时间公司邮箱密码更换,使用了新的密码后导致了只能收...

21710
来自专栏用户2442861的专栏

Python对文件进行批量随机重命名

http://blog.csdn.net/vipygd/article/details/7959440

27520
来自专栏FreeBuf

看我教你如何修改QQ安装包实现绕过QQ语音红包验证来领红包

前言: 这篇文章,俺会手把手教你当你遇到生僻字如何绕过QQ语音红包验证来领红包,主要思路是鄙人在这里(传送门)看到的,但是感觉他的那篇文章复述过程不是很完整,所...

30070

扫码关注云+社区

领取腾讯云代金券