专栏首页云计算配置OpenStack VM启用多张网卡

配置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 条评论
登录 后参与评论

相关文章

  • App与后台通信:从文本协议到二进制协议

    本文主要总结了心悦俱乐部 App 的接入层从文本协议到二进制 jce 协议迭代过程中的技术方案。

    Techeek
  • 部署NGINX Plus作为API网关(第一部分)——NGINX

    HTTP API是现代应用架构的核心。HTTP协议使开发者可以更快地构建应用并使应用的维护变得更加容易。HTTP API提供了一套通用的接口,这使得在任意的应用...

    Techeek
  • 使用HyperForm自动配置虚拟机(第2部分)

    原文地址:https://dzone.com/articles/automated-self-service-provisioning-of-vms-using...

    Techeek
  • client-go连接K8s集群进行pod的增删改查

    最近在看client-go源码最基础的部分,client-go的四类客户端,RestClient、ClientSet、DynamicClient、Discove...

    用户5166556
  • K8s入门手记

    撰写Dockerfile,这里的scratch表示为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。

    王亚昌
  • ORA-02396: exceeded maximum idle time, please connect again的原因

            一般为了防止过多活动的session占用资源,可以对允许连接到数据库的session个数,已连接到数据库的session空闲时间等进行限制(当然...

    bisal
  • Hybris DDIC type and its counterpart model class

    在ABAP里,我们在SE11里面创建data type或者transparent table, 然后在ABAP代码里可以直接消费这些DDIC object. ...

    Jerry Wang
  • 【为宏正名】什么?我忘了去上“数学必修课”!

    简而言之,通过宏所确定的内容是在编译时刻就固化下来的。很多人都了解这一点,也很擅长使用宏的方式来固化一些常数,比如,教科书中最常见的一个例子是:

    GorgonMeducer 傻孩子
  • 基于Django的电子商务网站开发(连载9)

    在这里建立了五个对象,分别是用户(User)、地址(Address)、商品(Goods)、单个订单(Order)和总订单(Orders)。

    小老鼠
  • flask app从py文件加载配置文件(flask 34)

    WIN = sys.platform.startswith('win') if WIN: prefix = 'sqlite:///' else: pre...

    用户5760343

扫码关注云+社区

领取腾讯云代金券