[这篇文章是由巴拉克·梅里莫维奇撰写的。]
我们已经在之前的文章中讨论了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服务器并解决问题!
结论就是
上面的命令会给我们带来额外的网卡。所以需要为每个额外的网卡和每个虚拟机重复此过程。可以使用启动脚本(又称用户数据脚本)或系统服务来运行这些命令。我将在后续的文章中讨论如何自动化网络设置。