instance 的网卡是如何被配置并拉起的?这是理解和用好 cloud-init 很是关键的一步。咱们先讨论一个最简单基础的场景:镜像中没有安装 cloud-init。ubuntu
此时 instance 启动时网卡能不能被拉起来彻底 靠运气!是的,就是运气。centos
由于这种状况下网卡的配置是死的,彻底依赖于镜像中 /etc/network/interfaces 原有的配置。好比原镜像中的配置是:
auto eth0
iface eth0 inet dhcp
instance 只有知足下面全部条件网卡才能被拉起来:网络
正好只有一块网卡spa
正好网卡就叫 eth0操作系统
正好 subnet 开了 DHCPcode
只要出现下面任意一种状况就会失败:ip
还有其余网卡,好比 eth1,或者部署
网卡不叫 eth0 ,好比 ens3,或者get
没有 DHCPit
不一样 instance 的网络配置差异很大,在 image 中写死的方法几乎是无效的,只能依靠 cloud-init 动态写入,接下来咱们详细分析 cloud-init 的解决方案。
先考虑 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、网关等信息就配上去了。
几点说明:
instance 上的每一块网卡都会被 cloud-init 扫描出来。
若是没有 config drive 将采用 fallback 配置,将扫描出来的第一块 (只有这一块)网卡配置成 dhcp 模式。请注意:这是 cloud-init 默认行为,跟这块网卡对应的 subnet 是否开启了 DHCP 没有任何关系。
cloud-init 会根据 instance 操做系统类型生成网卡配置文件。例如操做系统是 centos 的话则会将配置写到 /etc/sysconfig/network-scripts 目录下。
如今请你们思考一个问题:若是 subnet 没有开 DHCP,会是怎样一个状况?下节将分析这个问题。