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中的元数据根据数据类型可以分为两类:

  1. 由系统所提供的结构化数据,以键值对的形式提供。

  2. 由用户所提供的非结构化数据,大多以命令、脚本、配置文件的形式提供。

元数据注入方式

元数据注入实例的方式分为两种:

  1. 元数据服务

    元数据服务为实例提供了一种可以通过REST API获实例特定的数据的方式,无论是用户提供的非结构化的数据还是系统提供的结构化数据都可以通过这种方式来访问(元数据服务要求实例先通过DHCP获取IP地址)。

  2. 配置驱动器

    配置驱动器是一种不需要通过DHCP向实例分配IP地址就能够向实例传递数据的一种方式,它是一种会随实例启动的特殊的驱动器。实例能够挂载该驱动器并从中读取出那些也可以通过元数据服务读取出的相同的消息。

元数据验证

作业与实验环境

超星网址
快照管理:控制节点和计算节点选择均是默认的项目12

创建虚拟机实例并注入元数据

  1. 先利用上节课介绍的OpenStack管理命令创建虚拟机实例所需的虚拟网络、实例类型。

    1. 虚拟网络、子网创建

      # 运行登录脚本
      [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
    2. 实例类型创建

      [root@controller ~]# openstack flavor create --public test_flavor --id auto --ram 2048 --disk 15 --vcpus 2
    3. 创建密钥并复制

      [root@controller ~]# openstack keypair create test-key
  2. 登录Horizon图形界面,使用创建镜像功能将本地D盘的CentOS-7-x86_64-GenericCloud-2003.qcow2镜像上传到OpenStack平台。

    1698020757698.png
  3. 创建实例、注入用户数据元数据,注意勾选配置驱动

    #!/bin/bash
    passwd centos<<EOF
    000000
    000000
    EOF
    1698900341448.png

    第二种方法因为镜像的原因无法实现,供参考:

    #cloud-config
    chpasswd :
    list: |
        centos: 000000
    expire: false
    ssh_pwauth: true 

    上述用户数据元数据的导入同样可以通过命令实现,在创建实例的openstack server create命令中添加--user-data选项以及需要传入的YAML格式的Cloud-Init配置文件。

  4. 实例启动后在计算节点配置密钥并登录到实例中。

    • 控制节点使用实例管理命令获取实例的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的用于初始化时注入的元数据,对于结构化的元数据可以实例创建之后在元数据选项卡中修改。

1698027308960.png

验证元数据服务

元数据服务为实例提供了一种通过REST API获取实例的特定数据的方法。实例通过 169.254.169.254 访问此服务,并且可以通过此服务访问所有类型的元数据,无论是用户、nova 还是供应商提供的元数据。

  1. 通过发起一个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重启元数据服务后重试。

  2. 在请求的地址中加上版本名可以获取指定版本的元数据目录。

    [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
  3. 继续在请求的地址中加上需要查看的元数据文件名并且通过python工具格式化输出。

    [root@test ~]# curl http://169.254.169.254/openstack/latest/meta_data.json |python -m json.tool

    通过openstack server create命令的--property选项卡所提供的元数据存储在meta键中。

  4. 查看用户数据元数据。

    [root@test ~]# curl http://169.254.169.254/openstack/latest/user_data
    #!/bin/bash
    passwd centos<<EOF
    000000
    000000
    EOF

验证配置驱动器

配置驱动器是元数据服务的一种补充,任何可以挂载 ISO 9660 或者 VFALT 文件的系统都可以使用配置驱动器。

  1. 使用root用户。

    [root@test ~]# sudo su
  2. 挂载配置驱动器到某个目录。

    # 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
  3. 使用 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 
  4. 查看驱动器目录中的内容,和通过元数据服务功能获取的元数据对比。

    [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:通过配置驱动查询到用户数据元数据后截图上传。

增加计算节点

先关闭控制节点和计算节点

  1. 计算节点右键-> 管理 -> 克隆,克隆一个计算节点。

    1698028248479.png 1698028258928.png
  2. 打开新的计算节点后登录,这一步修改新添加的计算节点的网络配置,主机名。

    1. 修改主机名

      [root@compute ~]# hostnamectl set-hostname compute2
    2. Ctrl + D退出登录会话查看主机名

    3. 修改网卡ens33ens34的网络配置,将IP地址改为192.168.10.21192.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
    4. 编辑/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
  3. vi /etc/nova/nova.conf修改计算节点的nova配置。

    1698030589528.png
  4. 重启两个计算节点的计算服务

    [root@compute ~]# systemctl restart libvirtd openstack-nova-compute
    [root@compute2 ~]# systemctl restart libvirtd openstack-nova-compute
  5. 打开原有的控制节点计算节点后在控制节点执行su nova -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose"发现新的计算节点。

  6. 查看当前系统的计算节点信息。

    [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:列出计算节点信息后截图上传。

实例迁移

  1. 这一步设置两个计算节点之间的ssh免密访问,先在compute上配置。

    1. 设置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
    2. 将前一步所修改的配置发送到compute2

      [root@compute ~]# scp /etc/passwd root@192.168.10.21:/etc/passwd
    3. 设置nova密码,这一步在两个计算节点分别上设置。

      [root@compute ~]# passwd nova
      [root@compute2 ~]# passwd nova
    4. 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): 回车
    5. comptue2节点重复第四步生成密钥对。

    6. compute节点和compute2分别执行echo 'StrictHostKeyChecking no' >> /var/lib/nova/.ssh/config关闭严格主机密钥检查。

    7. 使用以下命令查看生成的公钥文件,把两台计算节点的公钥复制粘贴到对方的/var/lib/nova/.ssh/authorized_keys文件中。

      bash-4.2$ cat /var/lib/nova/.ssh/id_rsa.pub
    8. 在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
    9. 在两台计算节点上Ctrl + D回到root用户,重启以下服务。

      [root@compute ~]# systemctl restart libvirtd openstack-nova-compute
      [root@compute2 ~]# systemctl restart libvirtd openstack-nova-compute neutron-linuxbridge-agent
  2. 虚拟机实例冷迁移。

    1. 先查看实例当前的物理机:

      [root@controller ~]# openstack server show test
    2. 执行命令迁移后查看实例:

      [root@controller ~]# openstack server migrate test --wait
      [root@controller ~]# openstack server show test

    作业4:显示实例迁移到新的物理机后截图上传。