前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >配置多个网卡的OpenStack VM

配置多个网卡的OpenStack VM

作者头像
MonroeCode
发布2018-01-15 14:26:58
2.8K0
发布2018-01-15 14:26:58
举报
文章被收录于专栏:Java技术分享Java技术分享

[这篇文章是由巴拉克·梅里莫维奇撰写的。]

我们已经在之前的文章中讨论了OpenStack网络。在本文中,我将深入探讨一个更高级的OpenStack网络场景。

许多云映像没有配置为自动打开可用的所有网卡,它们通常只配置一个网卡。要正确地在云中使用多个网卡设置主机,请登录到计算机并调出其它接口。

代码语言:javascript
复制
echo $'auto eth1 \ niface eth1 inet dhcp'| sudo tee /etc/network/interfaces.d/eth1.cfg> / dev / null
sudo ifup eth1

云网络

一个复杂的网络架构是现代云IaaS的主流。了解如何配置基于云的网络和主机,对于让应用程序在云中运行至关重要。

云,曾经只支持扁平化网络

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

扁平网络模型简单,因此易于理解和理解。对于云IaaS的早期来说,这是一个不错的选择,无疑有助于首先将应用程序迁移到云中。对于刚开始使用“云”的人来说,EC2就是这么容易使用的。这个模型实际上仍然可以在亚马逊网络服务上以“EC2-Classic”为标题获得。而对于许多应用来说,一个扁平的网络就够了。

但随着云应用的增加,越来越复杂的应用正在进入云端,考虑网络分离,安全性,SLA和广播域等问题成为更复杂的网络成为必不可少的。软件定义网络(SDN)填补了这一空白,它们现在是主要云IaaS的主要组成部分。AWS有AWS-VPCOpenStackNeutron项目,还有很多其它实现。

要使用SDN需要更多地了解信息如何在云资源之间移动。在这篇文章中,讨论下如何在云中设置一个主机,以便在复杂的网络中运行。我将使用OpenStack,但其它云基础架构的概念也是差不多的。

Openstack配置

将从一个空租户开始,只有公共网络可用。

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

代码语言:javascript
复制
neutron router-create demo-router 
neutron net-create demo-network-1 
neutron net-create demo-network-2 
neutron subnet-create --name demo-subnet-1 demo-network-1 10.0.0.0/24 
neutron subnet-create --name demo-subnet-2 demo-network-2 10.0.1.0/24 
neutron router-interface-add demo-router demo-subnet-1 
neutron router-interface-add demo-router demo-subnet-2 
neutron router-gateway-set demo-router public

请注意网络ID:

代码语言:javascript
复制
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云图像开始:

代码语言:js
复制
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

创建密钥对和安全组:

代码语言:js
复制
nova keypair-add demo-keypair > demo-keypair.pem

chmod 400 demo-keypair.pem

nova secgroup-create demo-security-group "演示安全组" 
nova secgroup-add-rule demo-security-group tcp 22 22 0.0.0.0/0

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

neutron floatingip-list

| 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"} |

neutron floatingip-associate 49c8b05e-bb8f-4b07-80ed-3155ab6ffc09 d421b447-2adf-406f-876b-142238683344

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

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

一定要确保ssh正常工作:

代码语言:javascript
复制
ssh -i demo-keypair.pem ubuntu@192.168.15.31 hostname
demo-vm

现在,应该有两张网卡了。

代码语言:javascript
复制
ssh -i demo-keypair.pem ubuntu@192.168.15.31 hostname 
demo-vm

Cool, ssh works. Now, we should have two network cards, right? 
ssh -i demo-keypair.pem ubuntu@192.168.15.31 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网络设置是否存在配置问题?答案在这:

代码语言:javascript
复制
ssh -i demo-keypair.pem ubuntu@192.168.15.31 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虽然存在,但是没有运行。

这个问题不在OpenStack网络配置中,而是在图像上。应该将映像本身配置为与多个NIC正常工作。所要做的就是调出网卡,可以看下实例:

代码语言:javascript
复制
ssh -i demo-keypair.pem ubuntu@192.168.15.31

然后运行以下命令:

代码语言:javascript
复制
echo $'auto eth1\niface eth1 inet dhcp' | sudo tee /etc/network/interfaces.d/eth1.cfg > /dev/null 
sudo ifup eth1

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

代码语言:javascript
复制
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服务器无法访问数据库。如果只有网络2的网卡启动,则无法从外部网络访问网络服务器。更糟糕的是,如果这个网络服务器是通过浮动IP访问的,这个IP也将不起作用,所以将无法访问Web服务器并解决问题!

结论就是

上面的命令会给我们带来额外的网卡。所以需要为每个额外的网卡和每个虚拟机重复此过程。可以使用启动脚本(又称用户数据脚本)或系统服务来运行这些命令。我将在后续的文章中讨论如何自动化网络设置。

这是最初发布在 Barak的博客,点击此链接可查看原文

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 这是最初发布在 Barak的博客,点击此链接可查看原文。
相关产品与服务
数据库专家服务
数据库专家服务(Database Expert Service,DBexpert)为您提供专业化的数据库服务。仅需提交您的具体问题和需求,即可获得腾讯云数据库专家的专业支持,助您解决各类专业化问题。腾讯云数据库专家服务团队均有10年以上的 DBA 经验,拥有亿级用户产品的数据库管理经验,以及丰富的服务经验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档