OpenStack实例管理(一)

理解Nova计算服务

Nova计算服务简介

Nova 管理虚拟机实例的整个生命周期,包括创建、启动、停止、暂停、恢复和销毁等操作。它提供了丰富的API接口和命令行工具,方便用户进行实例管理和监控。

Nova 根据用户的请求和资源的可用性,通过Nova Scheduler进行资源调度和分配。它会选择合适的物理主机来部署虚拟机实例,以实现资源的优化利用和负载均衡。

Nova需要下列OpenStack服务的支持:

  • Keystone:为所有的OpenStack服务提供身份管理和认证。

  • Glance:提供计算用的镜像库。

  • Neutron:负责配置管理计算实例启动时的虚拟或物理网络连接。

  • Placement:负责跟踪云中可用的资源库存。

Nova计算服务架构

1697380021376.png
  • DB:用于数据存储的SQL数据库。

  • API:接收 HTTP 请求、转换命令并通过 oslo.messaging 队列或 HTTP 与其他组件通信的组件。

  • Scheduler:决定哪个主机获取每个实例。

  • Compute:管理虚拟机和虚拟机的通信。

  • Conductor:处理需要协调(构建/调整大小)的请求,充当数据库代理,或处理对象转换。

实例创建流程

  1. 用户发起创建请求:用户通过 Nova API 或控制台发起创建实例的请求,提供所需的实例配置信息,如镜像、规格(flavor)、网络等。

  2. Nova Scheduler 进行资源调度:Nova Scheduler 根据实例的需求和当前资源的可用性,在可用的计算节点中选择最合适的物理主机来部署实例。它考虑诸如资源利用率、负载均衡和亲和性等因素进行决策。

  3. Nova Compute 创建实例:一旦 Nova Scheduler 选择了目标计算节点,它会将创建实例的请求发送给相应的 Nova Compute 节点。Nova Compute 负责与底层的 Hypervisor 进行通信,通过创建虚拟机实例的 API 或命令来执行实际的创建操作。

  4. 实例启动和初始化:Nova Compute 在目标计算节点上启动虚拟机实例,并进行初始化配置。这包括分配计算资源、设置网络连接、加载所需的镜像和用户数据等。

  5. 实例状态更新:Nova Compute 在实例创建过程中会定期向 Nova Conductor 汇报实例的状态更新。这包括实例的创建进度、IP 地址分配和可用性等信息,以便 Nova Conductor 进行监控和管理。

Nova服务安装

作业与实验环境

超星网址
快照管理:控制节点选择项目8,计算节点选择5.3.9/项目5-5

安装配置控制节点上的Nova服务

  1. 安装Nova软件包

    1. 使用yum -y install在控制节点上安装四个软件包:openstack-nova-api openstack-nova-conductor openstack-nova-scheduler openstack-nova-novncproxy

    2. 安装openstack-nova-api时会创建名为“nova”的同名用户和用户组,使用以下命令检查:

      [root@controller ~]# cat /etc/passwd |grep nova
      nova:x:162:162:OpenStack Nova Daemons:/var/lib/nova:/sbin/nologin
      [root@controller ~]# cat /etc/group |grep nova
      nobody:x:99:nova
      nova:x:162:nova
  2. 创建Nova数据库并授权

    1. 进入数据库

      [root@controller ~]# mysql -uroot -p000000
      Welcome to the MariaDB monitor.  Commands end with ; or \g.
      Your MariaDB connection id is 9
      Server version: 10.3.20-MariaDB MariaDB Server
      
      Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
      
      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    2. 使用CREATE DATABASE命令新建“nova_api”,“nova_cell0”,“nova”三个数据库

    3. 使用以下命令进行数据库授权

      MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '000000';
      Query OK, 0 rows affected (0.000 sec)
      
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '000000';
      Query OK, 0 rows affected (0.000 sec)
      
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY '000000';
      Query OK, 0 rows affected (0.000 sec)
      
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY '000000';
      Query OK, 0 rows affected (0.000 sec)
      
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '000000';
      Query OK, 0 rows affected (0.000 sec)
      
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '000000';
  3. 修改Nova配置文件

    1. 去掉配置文件中的空行

      # 1. 备份配置文件
      [root@controller ~]# cp /etc/nova/nova.conf /etc/nova/nova.bak
      # 2. 去掉空行
      [root@controller ~]# grep -Ev '^$|#' /etc/nova/nova.bak > /etc/nova/nova.conf
    2. 配置连接“nova”和“nova_api”数据库

      [api_database]
      connection=mysql+pymysql://nova:000000@controller/nova_api
      [database]
      connection=mysql+pymysql://nova:000000@controller/nova
    3. Keystone组件交互

      [api]
      auth_strategy = keystone
      [keystone_authtoken]
      auth_url = http://controller:5000
      memcached_servers = controller:11211
      auth_type = password
      project_domain_name = Default
      user_domain_name = Default
      project_name = project
      username = nova
      password = 000000
    4. Placement组件交互

      [placement]
      auth_url = http://controller:5000
      auth_type = password
      project_domain_name = Default
      user_domain_name = Default
      project_name = project
      username = placement
      password = 000000
      region_name = RegionOne
    5. Glance组件交互

      [glance]
      api_servers = http://controller:9292
    6. 配置锁路径

      [oslo_concurrency]
      lock_path = /var/lib/nova/tmp
    7. 配置消息队列和防火墙

      [DEFAULT]
      enabled_apis = osapi_compute,metadata
      transport_url = rabbit://rabbitmq:000000@controller:5672
      my_ip = 192.168.10.10
      use_neutron = true
      firewall_driver = nova.virt.firewall.NoopFirewallDriver
    8. 配置VNC连接

      [vnc]
      enabled = true
      server_listen = $my_ip
      server_proxyclient_address = $my_ip
  4. 初始化数据库

    # 同步nova_api数据库
    [root@controller ~]# su nova -s /bin/sh -c "nova-manage api_db sync"
    # 创建cell1
    [root@controller ~]# su nova -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1"
    # 数据库映射
    [root@controller ~]# su nova -s /bin/sh -c "nova-manage cell_v2 map_cell0"
    # 同步nova数据库
    [root@controller ~]# su nova -s /bin/sh -c "nova-manage db sync"
  5. 验证单元注册

    [root@controller ~]# nova-manage cell_v2 list_cells
    +-------+--------------------------------------+----------------------------------------+-------------------------------------------------+----------+
    |  Name |                 UUID                 |             Transport URL              |               Database Connection               | Disabled |
    +-------+--------------------------------------+----------------------------------------+-------------------------------------------------+----------+
    | cell0 | 00000000-0000-0000-0000-000000000000 |                 none:/                 | mysql+pymysql://nova:****@controller/nova_cell0 |  False   |
    | cell1 | 0a7038d1-6f69-46ad-8b3f-bf8cadc831c5 | rabbit://rabbitmq:****@controller:5672 |    mysql+pymysql://nova:****@controller/nova    |  False   |
    +-------+--------------------------------------+----------------------------------------+-------------------------------------------------+----------+

    作业1:单元注册结果截图

Nova组件初始化

  1. 创建Nova用户

    1. 执行source admin-login导入环境变量进行登录

    2. 在“default”域中创建用户“nova”,密码为“000000”:

      [root@controller ~]# openstack user create --domain default --password 000000 nova
      +---------------------+----------------------------------+
      | Field               | Value                            |
      +---------------------+----------------------------------+
      | domain_id           | default                          |
      | enabled             | True                             |
      | id                  | 5e2fbfe049194a748f6d040686bef9f5 |
      | name                | nova                             |
      | options             | {}                               |
      | password_expires_at | None                             |
      +---------------------+----------------------------------+

      这里所创建的用户和nova.conf配置文件中的[keystone_authtoken]配置的用户名密码一致

    3. 分配“nova”用户在“project”项目中的“admin”角色

      [root@controller ~]# openstack role add --project project --user nova admin
  2. 创建Nova服务和端点

    1. 创建名为“nova”,类型为“compute”的服务

      [root@controller ~]# openstack service create --name nova compute
      +---------+----------------------------------+
      | Field   | Value                            |
      +---------+----------------------------------+
      | enabled | True                             |
      | id      | b6028ad5a1e545a992dcdeaff3e0f7a6 |
      | name    | nova                             |
      | type    | compute                          |
      +---------+----------------------------------+
    2. 创建服务端点

      # 1. 公众用户端点
      [root@controller ~]# openstack endpoint create --region RegionOne nova public http://controller:8774/v2.1
      # 2. 内部组件端点
      [root@controller ~]# openstack endpoint create --region RegionOne nova internal http://controller:8774/v2.1
      # 3. admin用户端点
      [root@controller ~]# openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1
  3. 启动控制节点的Nova服务

    # 1. 设置开机启动
    [root@controller ~]# systemctl enable openstack-nova-api openstack-nova-conductor openstack-nova-scheduler openstack-nova-novncproxy
    # 2. 设置立即启动
    [root@controller ~]# systemctl start openstack-nova-api openstack-nova-conductor openstack-nova-scheduler openstack-nova-novncproxy
  4. 检查Nova组件的运行

    [root@controller ~]# netstat -nutpl|grep 877
    tcp        0      0 0.0.0.0:8774            0.0.0.0:*               LISTEN      6531/python2
    tcp        0      0 0.0.0.0:8775            0.0.0.0:*               LISTEN      6531/python2
    tcp6       0      0 :::8778                 :::*                    LISTEN      1035/httpd
    [root@controller ~]# openstack compute service list
    +----+----------------+------------+----------+---------+-------+----------------------------+
    | ID | Binary         | Host       | Zone     | Status  | State | Updated At                 |
    +----+----------------+------------+----------+---------+-------+----------------------------+
    |  3 | nova-conductor | controller | internal | enabled | up    | 2023-10-16T00:33:33.000000 |
    |  4 | nova-scheduler | controller | internal | enabled | up    | 2023-10-16T00:33:26.000000 |
    +----+----------------+------------+----------+---------+-------+----------------------------+

    作业2:Nova组件运行截图

安装配置计算节点上的Nova服务

  1. 安装Nova软件包

    [root@compute ~]# yum -y install openstack-nova-compute

    验证系统内是否有名为“nova”的用户和用户组

    [root@compute ~]# cat /etc/passwd |grep nova
    nova:x:162:162:OpenStack Nova Daemons:/var/lib/nova:/sbin/nologin
    [root@compute ~]# cat /etc/group |grep nova
    nobody:x:99:nova
    qemu:x:107:nova
    libvirt:x:991:nova
    nova:x:162:nova
  2. 修改Nova配置文件/etc/nova/nova.conf

    1. 去掉配置文件中的空行

      # 1. 备份配置文件
      [root@compute ~]# cp /etc/nova/nova.conf /etc/nova/nova.bak
      # 2. 去掉空行
      [root@compute ~]# grep -Ev '^$|#' /etc/nova/nova.bak > /etc/nova/nova.conf
    2. Keystone组件交互

      [api]
      auth_strategy = keystone
      [keystone_authtoken]
      auth_url = http://controller:5000
      memcached_servers = controller:11211
      auth_type = password
      project_domain_name = Default
      user_domain_name = Default
      project_name = project
      username = nova
      password = 000000
    3. Placement组件交互

      [placement]
      auth_url = http://controller:5000
      auth_type = password
      project_domain_name = Default
      user_domain_name = Default
      project_name = project
      username = placement
      password = 000000
      region_name = RegionOne
    4. Glance组件交互

      [glance]
      api_servers = http://controller:9292
    5. 配置锁路径

      [oslo_concurrency]
      lock_path = /var/lib/nova/tmp
    6. 配置消息队列和防火墙

      [DEFAULT]
      enabled_apis = osapi_compute,metadata
      transport_url = rabbit://rabbitmq:000000@controller:5672
      my_ip = 192.168.10.20
      use_neutron = true
      firewall_driver = nova.virt.firewall.NoopFirewallDriver
    7. 配置VNC连接

      [vnc]
      enabled = true
      server_listen = 0.0.0.0
      server_proxyclient_address = $my_ip
      novncproxy_base_url = http://192.168.10.10:6080/vnc_auto.html
    8. 配置[libvirt]部分,设置虚拟化类型qemu

      [libvirt]
      virt_type = qemu
    9. 启动计算节点的Nova服务

      [root@compute ~]# systemctl enable libvirtd openstack-nova-compute
      Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-compute.service to /usr/lib/systemd/system/openstack-nova-compute.service.
      [root@compute ~]# systemctl start libvirtd openstack-nova-compute

发现计算节点并检验

下面的命令在控制节点执行

  1. 执行source admin-login导入环境变量登录

  2. 发现新的计算节点

    [root@controller ~]# su nova -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose"
  3. 设置/etc/nova/nova.conf配置自动发现计算节点

    [scheduler]
    discover_hosts_in_cells_internal = 60
    # 重启nova-api服务使配置生效
    [root@controller ~]# systemctl restart openstack-nova-api
  4. 验证nova模块的状态

    # 查看模块的运行状态
    [root@controller ~]# openstack compute service list
    +----+----------------+------------+----------+---------+-------+----------------------------+
    | ID | Binary         | Host       | Zone     | Status  | State | Updated At                 |
    +----+----------------+------------+----------+---------+-------+----------------------------+
    |  3 | nova-conductor | controller | internal | enabled | up    | 2023-10-16T01:22:53.000000 |
    |  4 | nova-scheduler | controller | internal | enabled | up    | 2023-10-16T01:22:57.000000 |
    |  5 | nova-compute   | compute    | nova     | enabled | up    | 2023-10-16T01:22:57.000000 |
    +----+----------------+------------+----------+---------+-------+----------------------------+
    # 使用状态检测工具验证,应该显示4个success
    [root@controller ~]# nova-status upgrade check
    +--------------------------------+
    | Upgrade Check Results          |
    +--------------------------------+
    | Check: Cells v2                |
    | Result: Success                |
    | Details: None                  |
    +--------------------------------+
    | Check: Placement API           |
    | Result: Success                |
    | Details: None                  |
    +--------------------------------+
    | Check: Ironic Flavor Migration |
    | Result: Success                |
    | Details: None                  |
    +--------------------------------+
    | Check: Cinder API              |
    | Result: Success                |
    | Details: None                  |
    +--------------------------------+

    作业3:Nova模块检测结果截图

Nova实例管理

实验环境

快照管理:控制节点和计算节点都是项目12

实例创建前提

执行以下命令查看所需的前提条件:

source admin-login          # 命令行环境登录
openstack flavor list       # 列出可用的实例类型
openstack image list        # 列出可用的镜像
openstack network list      # 列出可用的网络
openstack keypair list      # 列出可用的密钥对

然后执行实例创建命令openstack server create,具体格式如下:

openstack server create --flavor <flavor> --image <image> --key-name <key_pair> --network <network> [--security-group <security_group>] [--user-data <user_data>] <instance_name>
命令中的参数说明如下:

--flavor <flavor>:指定虚拟机实例的规格(flavor),例如 m1.small。
--image <image>:指定虚拟机实例的镜像,可以是映像名称、ID或URL。
--key-name <key_pair>:指定用于 SSH 访问虚拟机实例的密钥对的名称。
--network <network>:指定虚拟机实例连接到的网络,可以是网络名称或ID。
--security-group <security_group>(可选):指定用于虚拟机实例的安全组,可以是安全组名称或ID。
--user-data <user_data>(可选):指定启动虚拟机实例时要传递给实例的自定义用户数据(通常是启动脚本)。
<instance_name>:指定要创建的虚拟机实例的名称。

命令行实例管理常用命令:

# 列出虚拟机实例
openstack server list
# 查看实例的详细信息
openstack server show <instance_id_or_name>
# 启动虚拟机实例
openstack server start <instance_id_or_name>
# 停止虚拟机实例
openstack server stop <instance_id_or_name>
# 重启虚拟机实例
openstack server reboot <instance_id_or_name>
# 调整虚拟机实例的实例类型
openstack server resize <instance_id_or_name> --flavor <new_flavor>
# 删除虚拟机实例
openstack server delete <instance_id_or_name>
# 迁移虚拟机实例到其他计算节点
openstack server migrate <instance_id_or_name>

虚拟机实例创建流程

  1. 创建密钥对

    [root@controller ~]# openstack keypair create test-key
    -----BEGIN RSA PRIVATE KEY-----
    MIIEpgIBAAKCAQEA4ezhYShGObIS2GsCMyepBz+beVnJbs5ngIkNor2okw2pNcwW
    kFVf4XUYgAPk8UgzJWVjlbFzPYfYzmrGO/4DthjpnV9udkahIIn+IsfPajvbWn/n
    aOjrncva99YvqpsLOaasaO5fS0k+YLQaWeVzhLW43pndT+e3BRa120msvItqIuK5
    Fs4eCtjtAYeYBOlN/AReymXf6m2Et3TIk8tATk4De0q3u7p2TIfGYdbh22HiOWI4
    2J1Q9y2sC2Jj/idV9+407iLbMN/CfdVDu6Wm2Z0Ec3z5a3nGqHsRHJwK2eAS8eQD
    2AUksTMCBGBQDdgFTXnvXha8pjGz981kAjlYhQIDAQABAoIBAQDU56Z9KLcFKAsa
    Z71q97USX57kfPiWs2xWdNGky5ZQ/k63o9yfp9TzYqXz/beCqceJNkLijpdLJPnr
    jDPD1V0p/dApvgUa8PRm9aPIowOT2VSdtGsfMmDYE4QGipHg9LtfWPKg8AJdsGhY
    OWGb1d9G8PmGzPkClBqlcQFv5b4i7nlkgNlqKMAxTTpYuw8VQ1bcekae1AMX4LJh
    hObxjF2jrAwzKnX7oZtWpkKMNohbPoe4FnvPIbmwEWl6P9ewBqCUukGEYIu8C3u0
    42nkCEzdjjsD4PQ7sQRABeFM045RVUVbWjWo+JhvnIrJYmpi1vMaqiaKnD+DF2nb
    DKvTLNABAoGBAPc/lscQCW95kHvhhxVB3kwwTeUUz5fvMX6kyGfZp0C1oFc1Zp40
    tHSdroZW7t0USJNAdPQXeBGmd3feM/8VsR09VOuaJCTTl0vvIq41JtU7jY6lk4a7
    dkeomB8Dn8yswccvZ22id7CAsd378VKf3KklZQJiTRNaQwxHTsBVUBjRAoGBAOns
    Ey7dHAzmpiv+Ws7UvaBN5Yz4l/9gbMsrpXICnbOGmVAW+WrP4Qloip8SGQLY2Csy
    oj47UcdVLPISe0ChgUtzZCMh+u58fY3mpKlkEMnEahX2HommCzCJhwTa9G/lm/Js
    I2Fnf+siwVzpeR8ZWbXh7NzZBhq1a67oglMpfjF1AoGBAL2shprHbrWZ6IFgjiR8
    l3CTTe6DfI3t7WZeO2+PxYMa0pqUWNjdTeJ4ZL6iSjRHrzVnqVDoADBqKBRI3lK9
    7VWlC1SCt1+ZAuQ5270RAW1rdjkMRJSDk0V9zNVeDmUR0sZfU1UD4hYBZHILKSJd
    iQYprceaac6C3BS7T2q1B/FBAoGBALY8I/Wua9vhFDPRxAy9z7zC8sIQKNna1Oay
    6gEX6KOjiGzMeSKtMDOULeoevz1okX+Vwq+Ypu0TfiBYJY0ERSXyj2CPaF3Cvk1+
    EWmley60xbC2PLQflzgI7BbsPOGvjv4dILMRXqZgPSOU/7cqmKkJiO3EZO0JyQpK
    OL1w5c7BAoGBALZI9+hh82MuOLLl9cd7EhgiNPos+HI4TZJLAlypd55v9cOIkjr+
    olyRV9KLnHZiV086FRihPWbGxXMVg167efPciztS7Qlc+likocWztyIVll++A71M
    547dAnIA4iw30MFMzQxs917RbRv++dJkuyvBLULGzMFOjCb48CzvR9q+
    -----END RSA PRIVATE KEY-----
    • 其他密钥管理命令
    # 列出密钥
    openstack keypair list
    # 查看密钥详细信息
    openstack keypair show <密钥对名称>
  2. 创建实例类型

    [root@controller ~]# openstack flavor create --public test_flavor --id auto --ram 256 --disk 5 --vcpus 1
    +----------------------------+--------------------------------------+
    | Field                      | Value                                |
    +----------------------------+--------------------------------------+
    | OS-FLV-DISABLED:disabled   | False                                |
    | OS-FLV-EXT-DATA:ephemeral  | 0                                    |
    | disk                       | 0                                    |
    | id                         | 205ecf42-35b2-4f79-b928-c56c063cdbc2 |
    | name                       | test_flavor                          |
    | os-flavor-access:is_public | True                                 |
    | properties                 |                                      |
    | ram                        | 256                                  |
    | rxtx_factor                | 1.0                                  |
    | swap                       |                                      |
    | vcpus                      | 1                                    |
    +----------------------------+--------------------------------------+
    • 其他实例类型管理命令
    openstack flavor list
    openstack flavor show <实例类型ID>
    openstack flavor delete <实例类型ID>
  3. 创建网络

    [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
  4. 创建实例

    [root@controller ~]# openstack server create --flavor test_flavor --network test_net --key-name test-key --image cirros cirros-VM1
  5. 计算节点免密登录

    • 控制节点使用实例管理命令获取实例的ip地址
    [root@controller ~]# openstack server show cirros-VM1
    • 将之前的私钥复制并粘贴到计算节点/root/.ssh/demo-key.pem,使用ssh命令免密登录
    [root@compute ~]# chmod 600 ~/.ssh/demo-key.pem
    [root@compute ~]# ssh -i ~/.ssh/demo-key.pem cirros@192.168.20.130

    作业4:计算节点免密登录实例截图