instance 网卡是如何被拉起来的?- 每天5分钟玩转 OpenStack(172)

instance 的网卡是如何被配置并拉起的?这是理解和用好 cloud-init 非常关键的一步。我们先讨论一个最简单基础的场景:镜像中没有安装 cloud-init。

此时 instance 启动时网卡能不能被拉起来完全 靠运气!是的,就是运气。

因为这种情况下网卡的配置是死的,完全依赖于镜像中 /etc/network/interfaces 原有的配置。比如原镜像中的配置是:

auto eth0
iface eth0 inet dhcp

instance 只有满足下面所有条件网卡才能被拉起来:

  1. 正好只有一块网卡
  2. 正好网卡就叫 eth0
  3. 正好 subnet 开了 DHCP

只要出现下面任意一种情况就会失败:

  1. 还有其他网卡,比如 eth1,或者
  2. 网卡不叫 eth0 ,比如 ens3,或者
  3. 没有 DHCP

不同 instance 的网络配置差别很大,在 image 中写死的方法几乎是无效的,只能依靠 cloud-init 动态写入,接下来我们详细分析 cloud-init 的解决方案。

dhcp

先考虑 subnet 有 DHCP 服务的情况。

我们使用的镜像是 ubuntu 的 cloud image,已经预装的 cloud-init,下载地址为 http://cloud-images.ubuntu.com/ ,国内镜像http://mirrors.ustc.edu.cn/ubuntu-cloud-images/

部署成功后,登录 instance,ip a 显示网卡 ens3 已经正确配置。

下面分析这个 IP 是怎样配置上去的。

上一节我们讨论到,cloud-init 是在 local 阶段完成网络配置的,cloud-init 的执行过程被详细记录在 /var/log/cloud-init.log 中,让我们找找相关操作。

这里可以看到,cloud-init 会做如下工作:

① 扫描出 instance 中的所有网卡(这里是 ens3)

② 获取该网卡的配置信息。 因为没有 config drive,无法得知网卡的详细配置信息,只能采用默认的 fallback 配置,即 dhcp 配置。

③ 将配置信息写入 /etc/network/interfaces.d/50-cloud-init.cfg,内容为:

这样网卡就以 dhcp 模式拉起来,正好与 subnet 的 dhcp 服务对接上,IP、网关等信息就配上去了。

几点说明:

  1. instance 上的每一块网卡都会被 cloud-init 扫描出来。
  2. 如果没有 config drive 将采用 fallback 配置,将扫描出来的第一块 (只有这一块)网卡配置成 dhcp 模式。请注意:这是 cloud-init 默认行为,跟这块网卡对应的 subnet 是否开启了 DHCP 没有任何关系。
  3. cloud-init 会根据 instance 操作系统类型生成网卡配置文件。例如操作系统是 centos 的话则会将配置写到 /etc/sysconfig/network-scripts 目录下。

现在请大家思考一个问题:如果 subnet 没有开 DHCP,会是怎样一个情况?下节将分析这个问题。

时间: 2024-09-20 10:43:06

instance 网卡是如何被拉起来的?- 每天5分钟玩转 OpenStack(172)的相关文章

为 instance 配置静态 IP - 每天5分钟玩转 OpenStack(157)

  这是 OpenStack 实施经验分享系列的第 7 篇. 传统运维中为服务器配置静态 IP 是再常见不过的了.但在 OpenStack 环境下只能指定 network,IP 都是 Neutron 从 subnet IP 池中自动分配的.   有同学就会想办法了:等 instance 起来后手工把 IP 改掉行不行? 非常遗憾,不行! instance 网卡的 IP 和 Mac 地址是记录在 port 中的,计算节点的 iptable 会根据 port 信息生成相应的 rule,只有与 por

Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)

本节通过日志文件详细分析 instance start 操作. 下面是 start instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤. 向 nova-api 发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向API(nova-api)发送请求:"帮我启动这个 Instance" 查看日志 /opt/stack/logs/n-api.log nova-api 发送

动态添加删除网卡 - 每天5分钟玩转 OpenStack(156)

      这是 OpenStack 实施经验分享系列的第 6 篇. 在项目实施过程中,经常会有添加删除网卡的需求.比如一个运行数据库的 instance,初始只有一个网卡,数据库服务和备份共用这块网卡,后来为提高性能以及合规的要求需要加一块网卡专门做备份用.长久以来,Horizon 界面只支持在部署时为 instance 配置网卡,事后添加删除网卡只能用命令行,本节就来演示这个操作. 添加网卡 我们现在有一个 instance "c1",有一块 vlan111 的网卡,IP 为 17

将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net 网络 instance 部署成功,分配的 IP 地址为 172.16.1.3 底层网络发生了什么变化? 对于 instance "cirros-vm1",Neutron 会在 subnet 中创建一个 port,分配 IP 和 MAC 地址,并将 port 分配给 cirros-vm1.

部署 instance 到 OVS vlan100 - 每天5分钟玩转 OpenStack(138)

上一节创建了 OVS vlan network vlan100,今天部署 instance 到该网络.launch 新的 instance "cirros-vm1",网络选择 vlan100. cirros-vm1 分配到的 IP 为 172.16.100.3. cirros-vm1 被 schedule 到控制节点,其虚拟网卡也连接到 br-int. 虚拟网卡与 br-int 的连接方式与 local 和 flat 网络没有任何区别,不再赘述. 当前 vlan100 的结构如下: 继

部署 instance 到 OVS flat network - 每天5分钟玩转 OpenStack(135)

上一节创建了 OVS flat network,今天我们部署 instance 并验证 flat 网络的连通性. launch 新的 instance "cirros-vm1",网络选择 falt_net. cirros-vm1 分配到的 IP 为 172.16.1.3. cirros-vm1 被 schedule 到控制节点,其虚拟网卡也连接到 br-int. 虚拟网卡与 br-int 的连接方式与 local 网络是一样的,不再赘述. 当前 flat_net 的结构如下: 继续用同

创建 OVS vlan101 并部署 instance - 每天5分钟玩转 OpenStack(139)

前面我们创建了 OVS vlan100 并部署了 instance,今天继续创建 vlan101. subnet IP 地址为 172.16.101.0/24. 底层网络发生了什么变化 Neutron 自动在 br-int 网桥上创建了 vlan100 dhcp 的接口 "tap1820558c-0a". 现在,网络结构如下: 将 instance 连接到 vlan101 launch 新的 instance "cirros-vm3",网络选择 vlan101. c

创建 vxlan 并部署 instance - 每天5分钟玩转 OpenStack(147)

上一节我们完成了 OVS VxLAN 的配置工作,今天创建 vxlan100_net 并部署 instance. 创建 vxlan100_net 打开菜单 Admin -> Networks,点击 "Create Network" 按钮. 显示创建页面. Provider Network Type 选择 "VXLAN".  Segmentation ID 即 VNI,设置为 100. 点击 "Create Network",vxlan100

Migrate Instance 操作详解 - 每天5分钟玩转 OpenStack(40)

Migrate 操作的作用是将 instance 从当前的计算节点迁移到其他节点上. Migrate 不要求源和目标节点必须共享存储,当然共享存储也是可以的. Migrate 前必须满足一个条件:计算节点间需要配置 nova 用户无密码访问. 下面是 Migrate instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-scheduler 执行调度 nova-scheduler 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤.