配置多个网卡的OpenStack VM

2018-01-15 14:26:58 浏览数 (1)

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

我们已经在之前的文章中讨论了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-VPC,OpenStack有Neutron项目,还有很多其它实现。

要使用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 eth1niface 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的博客,点击此链接可查看原文

openstackopenstack

0 人点赞