OpenStack实例管理(二)
理解元数据
在之前的课程中介绍了多种定制 OpenStack 镜像的方法。镜像是实例的模板,适用于把通用软件和环境预装到实例中。但有许多配置不适合写入镜像(例如 SSH 密钥、主机名、用户名、磁盘大小、一次性凭据等),这些通常在实例启动时以“元数据”的形式由用户或平台注入。元数据的注入与处理通常由 Cloud‑Init(Windows 下为 Cloudbase‑Init)负责。
主要要点:
- 元数据类型:结构化的键值对(例如通过
--property设置的属性)与非结构化的用户数据(scripts 或 cloud‑config YAML)。 - 常见用途:设置用户名/密码、注入公钥、指定主机名、执行初始化脚本、配置网络或挂载额外磁盘等。
- 提供方式:通过元数据服务(meta-data service)或配置驱动器(config drive);也可在创建实例时使用命令行选项如
openstack server create --user-data <file>或在 Horizon 界面填写用户数据。 - 格式建议:尽量使用 cloud‑config(YAML)来描述初始化任务,便于可读性和幂等性;脚本也可用于复杂或一次性操作。
- 最佳实践:保持镜像通用、轻量,把与环境或机密相关的配置通过元数据注入;避免在镜像中硬编码敏感信息,使用 Cloud‑Init 做安全和可重复的初始化。
这样可以在不频繁重建镜像的情况下,灵活、安全地为不同场景配置实例。
OpenStack中的元数据根据数据类型可以分为两类:
由系统所提供的结构化数据,以键值对的形式提供。
由用户所提供的非结构化数据,大多以命令、脚本、配置文件的形式提供。
元数据注入方式
元数据注入实例的方式分为两种:
元数据服务
元数据服务为实例提供了一种可以通过REST API获实例特定的数据的方式,无论是用户提供的非结构化的数据还是系统提供的结构化数据都可以通过这种方式来访问(元数据服务要求实例先通过DHCP获取IP地址)。
配置驱动器
配置驱动器是一种不需要通过DHCP向实例分配IP地址就能够向实例传递数据的一种方式,它是一种会随实例启动的特殊的驱动器。实例能够挂载该驱动器并从中读取出那些也可以通过元数据服务读取出的相同的消息。
元数据验证
作业与实验环境
超星网址
快照管理:控制节点和计算节点选择均是默认的项目12
创建虚拟机实例并注入元数据
先利用上节课介绍的OpenStack管理命令创建虚拟机实例所需的虚拟网络、实例类型。
虚拟网络、子网创建
# 运行登录脚本 [root@controller ~]# source admin-login [root@controller ~]# openstack network create --share --external --provider-network-type flat --provider-physical-network provider --project admin test_net[root@controller ~]# openstack subnet create --network test_net --subnet-range 192.168.20.0/24 --gateway 192.168.20.2 --allocation-pool start=192.168.20.128,end=192.168.20.140 --dns-nameserver 114.114.114.114 test_subnet实例类型创建
[root@controller ~]# openstack flavor create --public test_flavor --id auto --ram 2048 --disk 15 --vcpus 2创建密钥并复制
[root@controller ~]# openstack keypair create test-key
登录Horizon图形界面,使用创建镜像功能将本地D盘的
CentOS-7-x86_64-GenericCloud-2003.qcow2镜像上传到OpenStack平台。
创建实例、注入用户数据元数据,注意勾选
配置驱动。#!/bin/bash passwd centos<<EOF 000000 000000 EOF
第二种方法因为镜像的原因无法实现,供参考:
#cloud-config chpasswd : list: | centos: 000000 expire: false ssh_pwauth: true上述用户数据元数据的导入同样可以通过命令实现,在创建实例的
openstack server create命令中添加--user-data选项以及需要传入的YAML格式的Cloud-Init配置文件。实例启动后在计算节点配置密钥并登录到实例中。
- 在
控制节点使用实例管理命令获取实例的ip地址
[root@controller ~]# openstack server show test- 将之前的私钥复制并粘贴到
计算节点的/root/.ssh/demo-key.pem,使用ssh命令免密登录
[root@compute ~]# touch ~/.ssh/demo-key.pem [root@compute ~]# chmod 600 ~/.ssh/demo-key.pem [root@compute ~]# ssh -i ~/.ssh/demo-key.pem centos@192.168.20.130作业1:登陆后截图上传。
- 在
设置虚拟机元数据
不同于提供给Cloud-Init的用于初始化时注入的元数据,对于结构化的元数据可以实例创建之后在元数据选项卡中修改。
验证元数据服务
元数据服务为实例提供了一种通过REST API获取实例的特定数据的方法。实例通过 169.254.169.254 访问此服务,并且可以通过此服务访问所有类型的元数据,无论是用户、nova 还是供应商提供的元数据。
通过发起一个GET请求到
http://169.254.169.254/openstack来获取元数据API所支持的版本列表。[root@test ~]# curl http://169.254.169.254/openstack 2012-08-10 2013-04-04 2013-10-17 2015-10-15 2016-06-30 2016-10-06 2017-02-22 2018-08-27 latest如果请求执行失败可以在控制节点尝试执行
systemctl restart neutron-metadata-agent.service重启元数据服务后重试。在请求的地址中加上版本名可以获取指定版本的元数据目录。
[root@test ~]# curl http://169.254.169.254/openstack/latest meta_data.json user_data password vendor_data.json network_data.json vendor_data2.json继续在请求的地址中加上需要查看的元数据文件名并且通过python工具格式化输出。
[root@test ~]# curl http://169.254.169.254/openstack/latest/meta_data.json |python -m json.tool通过
openstack server create命令的--property选项卡所提供的元数据存储在meta键中。查看用户数据元数据。
[root@test ~]# curl http://169.254.169.254/openstack/latest/user_data #!/bin/bash passwd centos<<EOF 000000 000000 EOF
验证配置驱动器
配置驱动器是元数据服务的一种补充,任何可以挂载 ISO 9660 或者 VFALT 文件的系统都可以使用配置驱动器。
使用root用户。
[root@test ~]# sudo su挂载配置驱动器到某个目录。
# 1.创建挂载点 [root@test ~]# mkdir -p /mnt/config # 2.挂载虚拟设备到挂载点上 [root@test ~]# mount /dev/disk/by-label/config-2 /mnt/config mount: /dev/sr0 is write-protected, mounting read-only使用
df -h命令查看当前系统的挂载情况。[root@test ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 896M 0 896M 0% /dev tmpfs 920M 0 920M 0% /dev/shm tmpfs 920M 25M 895M 3% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup /dev/vda1 15G 847M 15G 6% / tmpfs 184M 0 184M 0% /run/user/1000 tmpfs 184M 0 184M 0% /run/user/0 /dev/sr0 492K 492K 0 100% /mnt/config查看驱动器目录中的内容,和通过元数据服务功能获取的元数据对比。
[root@test ~]# ls /mnt/config/openstack/latest meta_data.json user_data vendor_data.json network_data.json vendor_data2.json [root@test ~]# cat /mnt/config/openstack/latest/user_data #!/bin/bash passwd centos<<EOF 000000 000000作业2:通过配置驱动查询到用户数据元数据后截图上传。
增加计算节点
先关闭控制节点和计算节点
计算节点右键-> 管理 -> 克隆,克隆一个计算节点。
打开新的计算节点后登录,这一步修改新添加的计算节点的网络配置,主机名。
修改主机名
[root@compute ~]# hostnamectl set-hostname compute2Ctrl + D退出登录会话查看主机名修改网卡
ens33和ens34的网络配置,将IP地址改为192.168.10.21和192.168.20.21[root@compute2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 [root@compute2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens34 [root@compute2 ~]# systemctl restart network编辑
/etc/hosts文件插入新的主机名映射127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.10 controller 192.168.10.20 compute 192.168.10.21 compute2
vi /etc/nova/nova.conf修改计算节点的nova配置。
重启两个计算节点的
计算服务。[root@compute ~]# systemctl restart libvirtd openstack-nova-compute [root@compute2 ~]# systemctl restart libvirtd openstack-nova-compute打开原有的
控制节点和计算节点后在控制节点执行su nova -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose"发现新的计算节点。查看当前系统的计算节点信息。
[root@controller ~]# openstack hypervisor list +----+---------------------+-----------------+---------------+-------+ | ID | Hypervisor Hostname | Hypervisor Type | Host IP | State | +----+---------------------+-----------------+---------------+-------+ | 1 | compute | QEMU | 192.168.10.20 | up | | 2 | compute2 | QEMU | 192.168.10.21 | up | +----+---------------------+-----------------+---------------+-------+作业3:列出计算节点信息后截图上传。
实例迁移
这一步设置两个计算节点之间的ssh免密访问,先在
compute上配置。设置
nova的登录功能。[root@compute ~]# vi /etc/passwd找到nova用户,参考修改:
# 修改: nova:x:162:162:OpenStack Nova Daemons:/var/lib/nova:/sbin/nologin # 改为: nova:x:162:162:OpenStack Nova Daemons:/var/lib/nova:/bin/bash将前一步所修改的配置发送到
compute2。[root@compute ~]# scp /etc/passwd root@192.168.10.21:/etc/passwd设置nova密码,这一步在两个计算节点分别上设置。
[root@compute ~]# passwd nova [root@compute2 ~]# passwd nova在
compute节点使用su - nova命令切换nova用户,生成密钥对。bash-4.2$ ssh-keygen -t rsa -P '' Generating public/private rsa key pair. Enter file in which to save the key (/var/lib/nova/.ssh/id_rsa): 回车在
comptue2节点重复第四步生成密钥对。在
compute节点和compute2分别执行echo 'StrictHostKeyChecking no' >> /var/lib/nova/.ssh/config关闭严格主机密钥检查。使用以下命令查看生成的公钥文件,把两台计算节点的公钥复制粘贴到对方的
/var/lib/nova/.ssh/authorized_keys文件中。bash-4.2$ cat /var/lib/nova/.ssh/id_rsa.pub在compute节点上验证ssh免密登录compute2。
-bash-4.2$ echo $HOSTNAME compute -bash-4.2$ ssh nova@192.168.10.21 Last login: Wed Nov 1 01:22:32 2023 from compute SIOCSIFFLAGS: Operation not permitted -bash-4.2$ echo $HOSTNAME compute2在两台计算节点上
Ctrl + D回到root用户,重启以下服务。[root@compute ~]# systemctl restart libvirtd openstack-nova-compute [root@compute2 ~]# systemctl restart libvirtd openstack-nova-compute neutron-linuxbridge-agent
虚拟机实例冷迁移。
先查看实例当前的物理机:
[root@controller ~]# openstack server show test执行命令迁移后查看实例:
[root@controller ~]# openstack server migrate test --wait [root@controller ~]# openstack server show test
作业4:显示实例迁移到新的物理机后截图上传。