cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)

cloud-init 是 linux 的一个工具,当系统启动时,cloud-init 可从 nova metadata 服务或者 config drive 中获取 metadata,完成包括但不限于下面的定制化工作:

  1. 设置 default locale
  2. 设置 hostname
  3. 添加 ssh keys到 .ssh/authorized_keys
  4. 设置用户密码
  5. 配置网络
  6. 安装软件包

为了实现 instance 定制工作,cloud-init 会按 4 个阶段执行任务:

  1. local
  2. init
  3. config
  4. final

cloud-init 安装时会将这 4 个阶段执行的任务以服务的形式注册到系统中,比如在 systemd 的环境下,我们能够看到这4个阶段分别对应的服务:

  1. local - cloud-init-local.service
  2. init - cloud-init.service
  3. config - cloud-config.service
  4. final - cloud-final.service

local 阶段

作为 cloud-init 执行的第一个阶段,此时 instance 还不知道该如何配置网卡,cloud-init 的任务就是从 config drive 中获取配置信息,然后写入 /etc/network/interfaces 文件(如果是 centos 则写入 /etc/sysconfig/network-scripts/ifcfg-xxx)。

如果没有 config drive,则将所有网卡配置成 dhcp 模式。这是非常关键的一步,只有当网卡正确配置后,才能获取到 metadata。

关于 local 阶段下一节会通过实验详细分析。

init, config 和 final 阶段

正常情况下,在这三个阶段执行之前 instance 网络已经配置好了,并且已经成功获取到 metadata。cloud-init 的配置文件 /etc/cloud/cloud.cfg 定义了三个阶段分别要执行的任务,任务以 module 形式指定。

instance 真正的定制工作就是由这些 module 完成的。module 决定做哪些定制化工作,而 metadata 则决定最终定制化的结果。

举个例子,如果 cloud.cfg 中指定了 set_hostname 这个 module,则意味着 cloud-int 会设置 instance 的主机名,而具体设置成哪个主机名则由 metadata 中 hostname 参数决定。

有些 module 是有默认行为的,比如 growpart,如果 metadata 中没有特别指定,它会自动扩展 / 分区。

由于篇幅限制,这里就不一一讨论每个 module 了,具体可参看文档 https://cloudinit.readthedocs.io/en/latest/topics/modules.html

后面我们会讨论 cloud-init 典型的使用场景,其中也会涉及常用 module 的示例。

时间: 2024-09-20 12:25:39

cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)的相关文章

Neutron Router 工作原理 - 每天5分钟玩转 OpenStack(142)

上一节我们创建了 router 连通了 vlan100 和 vlan101, 今天分析router是如何工作的. 首先查看控制节点的网络结构发生了什么变化: br-int 上多了两个 port:  1. qr-d295b258-45,从命名上可以推断该 interface 对应 router_100_101 的 interface (d295b258-4586),是 subnet_172_16_100_0 的网关.  2. qr-2ffdb861-73,从命名上可以推断该 interface 对

L2 Population 原理 - 每天5分钟玩转 OpenStack(113)

前面我们学习了 VXLAN,今天讨论跟 VXLAN 紧密相关的 L2 Population. L2 Population 是用来提高 VXLAN 网络 Scalability 的. 通常我们说某个系统的 Scalability 好,其意思是: 当系统的规模变大时,仍然能够高效地工作. L2 Population 到底解决了怎样的 Scalability 问题? 请看下图: 这是一个包含 5 个节点的 VXLAN 网络,每个节点上运行了若干 VM. 现在假设 Host 1 上的 VM A 想与 H

CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)

前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助. CPU 虚拟化 KVM 的虚拟化是需要 CPU 硬件支持的.还记得我们在前面的章节讲过用命令来查看 CPU 是否支持KVM虚拟化吗? root@ubuntu:~# egrep -o '(vmx|svm)' /proc/cpuinfo vmx 如果有输出 vmx 或者 svm,就说明当前的 CPU 支持 KVM.CPU 厂商 Intel 和 AM

Neutron Vlan Network 原理- 每天5分钟玩转 OpenStack(92)

前面我们陆续学习了 Neutron local network,flat network 和 DHCP 服务,从本节将开始讨论 vlan network. vlan network 是带 tag 的网络,是实际应用最广泛的网络类型.下图是 vlan100 网络的示例. 1. 三个 instance 通过 TAP 设备连接到名为 "brqXXXX" linux bridge. 2. 在物理网卡 eth1 上创建了 eth1.100 的 vlan interface,eth1.100 连接

写在最前面 - 每天5分钟玩转 OpenStack(1)

<每天5分钟玩转 OpenStack>是一个 OpenStack 教程,这是第 1 篇. 这个教程有下面两个特点: 系统讲解 OpenStack 从架构到各个组件:从整体到细节逐一讨论 重实践并兼顾理论 主要从实际操作的角度带着大家学习 OpenStack.   为啥要写这个? 简单回答是:因为OpenStack 学习难度大,但如果掌握了价值会很大 先做一个自我介绍吧. 本人网名CloudMan,在 IT 这个行当已经摸爬滚打了十多年,05年之前是搞上层应用开发的,那时候 Java 比较火,所

floating IP 原理分析 - 每天5分钟玩转 OpenStack(107)

上一节我们通过 Web UI 创建为 cirros-vm3 分配了浮动 IP,今天将分析其工作原理. 首先查看 router 的 interface 配置: 可以看到,floating IP 已经配置到 router 的外网 interface qg-b8b32a88-03 上. 查看 router 的 NAT 规则: iptables 增加了两条处理 floating IP 的规则: 1. 当 router 接收到从外网发来的包,如果目的地址是 floating IP 10.10.10.3,将

学习 OpenStack 的方法论 - 每天5分钟玩转 OpenStack(150)

作为 OpenStack 的核心教程,我们已经到了最后总结的部分. OpenStack 目前已经有好几十个模块,本教程讨论的是最最重要的核心模块:Keystone,Nova,Glance,Cinder 和 Neutron.请大家看下图: 此图截自 https://www.openstack.org/software/project-navigator/,这是 OpenStack 官方定义的 6 个 Core Service.每个模块都会从三个维度来衡量: ADOPTION - 采用度 MATUR

你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)

​这是 OpenStack 实施经验分享系列的第 13 篇.   instance snapshot 操作可用于备份或者将 instance 保存为新的 image.如果在生产系统中执行 snapshot 操作,必须确保此操作快速且安全.这里有两个关键点: 快速. 为保证数据的一致性,snapshot 时需要 pause instance,操作完后再 resume.在这个过程中 instance 是无法对外服务的,为了减少对业务的影响,我们希望 snapshot 越快越好. 安全. 即数据一致性

cloud-init 典型应用 - 每天5分钟玩转 OpenStack(174)

本节介绍几个 cloud-init 的典型应用:设置 hostanme,设置用户初始密码,安装软件.  设置 hostname cloud-init 默认会将 instance 的名字设置为 hostname.但这样不太方便,有时希望能够将二者分开,可利用 cloud-init 的set_hostname 模块实现.set_hostname 它会查询 metadata 中 hostname 信息,默认值就是 instance 的名字.我们可以指定自己的 hostname,方法是将下面的内容传给