cloud-init工作原理 (02)

AWS 现状:通过Metadata Service + Cloud-init(Linux) / EC2Config(Windows)实现用户信息注入

cloud-init工作原理 (02)_第1张图片

Cloud-init:开源项目
(1)设置主机名
(2)密钥对注入
(3)系统分区AutoResize(扩展至磁盘大小)
(4)用户数据:自定义脚本、cloud-init配置数据、自定义数据

EC2Config:AWS私有实现(功能类似cloud-init)
(1)设置主机名
(2)设置管理员账户的随机密码,公钥加密输出到console
(3)系统分区AutoResize(扩展至磁盘大小)

(4)执行用户数据


开源cloud-init工作原理介绍:

cloudinit是专为云环境中虚拟机的初始化而开发的工具,用于在创建虚拟机启动时从各种数据源读取相关数据并据此对虚拟机进行自定义配置。

cloud-init的配置数据分为:metadata(主机名、密码、网络配置信息和SSH密钥)和user data(命令、脚本、文件和自定义数据等)。

1、Config Drive数据源:

这种方式用户数据并不是从网络上获取,用户数据在虚拟机启动前已经写好放到以volume里边,开机挂载读取。config drive的默认格式是一个“ISO 9660”的文件系统,也支持 VFAT。这方式的优势是不依赖网络,避免了一些网络问题,可以对虚拟机启动过程中进行配置。当虚拟机无法通过DHCP正确获取网络信息时,config drive是获取metadata信息的必要方式。该方式常用于私有云;
2、Metadata元数据服务器 RESTful:

如果虚拟机能够自动正确配置网络,那么可以通过 RESTful 服务的方式获取metadata信息。Amazon首先提出了metadata的概念,并搭建了metadata的服务, metadata服务的公网IP地址为169.254.169.254:80,把我们需要的脚本、参数配置等等写入文本文件上传到metadata server上,然后虚拟机的cloud init通过RESTful API来获取metadata信息,并据此进行配置。公有云普遍采用该方式;

cloud-init工作原理 (02)_第2张图片

国内公有云普遍支持密码和密钥两种方式二选一,其中:

租户在申请时指定,而业务实现中将其加密并设置到--admin_pass中,传给nova创建VM,而nova会检测到有该参数后,将其直接加密保存到/etc/shadow中,如果没有该参数,则就是密钥登录,将用户提供的keypair对应的公钥写入到对应的文件中。而Windows VM申请有点特殊,如果提供了--admin_pass,则直接设置administrator的密码,metadata server不记录,如果租户提供了密钥,则走旁路分支,随机生成一个密码,用公钥加密,并保存在metadata server中,租户在console上获取密码并用本地的私钥解密。

当前在VNC窗口中,还提供了初始密码的呈现(主要是给默认用户,而非root),是cloud-init执行本地脚本给其生成随机密码,和注入的公钥不冲突。


问题调试:

如果VM创建后密钥没有注入成功,可以VNC登录并执行如下命令调试:

curl http://169.254.169.254/openstack/latest/meta_data.json
curl http://169.254.169.254/openstack/latest/password
curl http://169.254.169.254/openstack/latest/user_data
curl http://169.254.169.254/openstack/2013-10-17/vendor_data.json
curl http://169.254.169.254/openstack/2015-10-15/network_data.json

curl http://169.254.169.254/openstack/2015-10-15/user_data

另外,在当前的实现中(如下),也要关注网络的连通性,以及cps 中对haproxy服务的metadata设置,确保SB节点都允许访问haproxy;

cloud-init工作原理 (02)_第3张图片

网络问题可以从如下四个方面排查:

cloud-init工作原理 (02)_第4张图片

你可能感兴趣的:(OpenStack)