在docker上运行nova-compute

Posted by Shi Hai's Blog on January 15, 2024

测试左移需要通过和物理环境解耦的来实现,否则仅测试用例的测试左移,但没有和物理环境解耦,环境的成本开销会随着测试的持续左移而变大(可以等价理解为用物理资源换测试效率)。

openstack服务

openstack的核心服务有:keystone、nova、neutron、cinder和glance。 OpenStack Nova架构 侵权删

keystone

TBD

nova

  • nova api: 接收用户的API请求,来源于用户的API请求或者用户界面的操作;
  • nova scheduler: 虚拟机调度服务,负责决定在哪个计算节点上运行虚拟机;
  • nova conductor: nova compute访问数据库的能力交给了nova conductor,确保当nova compute节点被攻击劫持后系统数据的安全;
  • nova compute: 管理虚拟机的核心服务,通过调用虚拟机管理程序Hypervisor API实现虚拟机的生命周期管理;

nova-compute

nova-compute组件的main函数nova/cmd/compute.py文件中。

def main():
    ...
    server = service.Service.create(binary='nova-compute',
                                    topic=compute_rpcapi.RPC_TOPIC)
    service.serve(server)
    service.wait()

当我们启动nova-compute组件时,WSGIService类就会根据main函数中指定的binary='nova-compute')查找倒nova-compute的管理器ComputeManager并启动。

# 定义了各种的管理器manager
SERVICE_MANAGERS = {
    'nova-compute': 'nova.compute.manager.ComputeManager',
    'nova-conductor': 'nova.conductor.manager.ConductorManager',
    'nova-scheduler': 'nova.scheduler.manager.SchedulerManager',
}

...
class WSGIService(service.Service):
    ...
    # 获取相关管理器
    def _get_manager(self):
        """Initialize a Manager object appropriate for this service.

        Use the service name to look up a Manager subclass from the
        configuration and initialize an instance. If no class name
        is configured, just return None.

        :returns: a Manager instance, or None.

        """
        manager = SERVICE_MANAGERS.get(self.binary)
        if manager is None:
            return None

        manager_class = importutils.import_class(manager)
        return manager_class()
...

ComputeManager负责和Hypervisor交互的核心功能,所有的虚拟化计算驱动driver都在nova/virt目录中。 nova compute组件类图 引入VirtAPI类的意义是可以向driver提供Manager。因为我们可以通过Manager来调用周边所有服务,这样就避免了driver自己向周边服务发起请求,比如:在数据库中虚拟机实例信息的更新:db.instance_update.*()PR 通过对nova-compute.conf文件中的compute_driver配置进行变更就可以实现对接不同的虚拟化平台。

[DEFAULT]
compute_driver=libvirt.LibvirtDriver
[libvirt]
virt_type=kvm

在所有的虚拟层驱动中,有个驱动driver是专门用来做测试的,这个驱动名字是FakeDriver,在文件nova/virt/fake.py。这个驱动用于控制平面服务的性能测试或者不同计算节点间的“移动”操作。FakeDriver驱动不会和任何的虚拟机管理平台Hypervisor进行通信,也不会和周边的neutron、cinder、glance服务通信。

neutron

TBD

cinder

TBD

glance

TBD

安装

安装基础工具

安装docker

使用此命令进行安装:

# 使用阿里的源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

如果遇到了安装冲突,可以在安装命令中添加“--allowerasing”进行安装:

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin --allowerasing

安装docker-compose

TBD

安装openstack

我使用的是docker-nova-compute在docker容器中安装openstack,因为这个项目已经是10年的项目并且没有更新,使用过程会遇到一些坑。
这个项目docker-nova-compute已经10多年了并且已经不再维护期,我把这个项目进行了一定的更新和维护,放到了docker-openstack,可以直接使用这个项目。

1. 安装基础中间件服务

执行以下命令从docker镜像源拉取rabbitmq、mariadb镜像并运行:

docker run -d -e RABBITMQ_NODENAME=rabbitmq -h rabbitmq --name rabbitmq rabbitmq:latest
docker run -d -e MYSQL_ROOT_PASSWORD=MYSQL_DBPASS -h mysql --name mysql -d mariadb:latest

2. 安装keystone

执行以下命令,运行keystone服务:

docker run -d  --link mysql:mysql --name keystone -h keystone krystism/openstack-keystone:latest

运行过程会遇到两个问题,需要我们手动规避解决:

  • 直接用镜像拉keystone实例,容器镜像中会缺少MySQL-python,需要手动安装MySQL-python或者通过docker直接构建运行;
  • 非admin用户鉴权无法通过,提示401问题,需要在keystone.conf配置文件中的[DEFAULT]中添加default_domain_Id=default的id;

3. 安装glance

执行以下命令,运行glance服务:

运行过程会遇到两个问题,需要我们手动规避解决:

  • glance的镜像中没有安装openstack客户端,只有keystone的客户端,但此客户端版本太低,是0.10.1,所以需要在keystone实例里面创建好资源信息,如下命令行所示。在/etc/hosts中需要配置一下节点和ip信息,否则无法连不上其他节点服务;
openstack --debug user create --domain default --password GLANCE_PASS glance
openstack role add --user glance --project service admin
openstack service create --name glance image --description "OpenStack Image Service"
openstack endpoint create  --region regionOne image public http://glance:9292
openstack endpoint create  --region regionOne image internal http://glance:9292
openstack endpoint create  --region regionOne image admin http://glance:9292
  • i18n/_message.py中抛UnicodeError错误,是一个调用直接抛错的逻辑,需要把/usr/lib/python2.7/dist-packages/oslo/i18n/_message.py中的第167行的__str__()函数直接注释掉;

4. 安装nova-controller

执行以下命令,运行nova-controller服务:

docker run -d --link mysql:mysql --link keystone:keystone --link rabbitmq:rabbitmq --link glance:glance \
-e OS_USERNAME=admin \
-e OS_PASSWORD=ADMIN_PASS \
-e OS_AUTH_URL=http://keystone:5000/v2.0 \
-e OS_TENANT_NAME=admin \
--privileged \
--name controller \
-h controller \
krystism/openstack-nova-controller:latest

运行过程会遇到和glance类似的问题,镜像中就只安装了一个keystone低版本,需要到keystone节点实例里面创建好相关资源信息。

openstack user create --domain default --password NOVA_PASS nova
openstack role add --user nova --project service admin
openstack service create --name nova compute --description "OpenStack Compute"
openstack endpoint create --region regionOne compute public http://controller:8774/v2/%\(tenant_id\)s
openstack endpoint create --region regionOne compute internal http://controller:8774/v2/%\(tenant_id\)s
openstack endpoint create --region regionOne compute admin http://controller:8774/v2/%\(tenant_id\)s

5. 安装nova-compute

执行以下命令,运行nova-compute服务:

docker run -d --link mysql:mysql --link keystone:keystone --link rabbitmq:rabbitmq --link glance:glance --link controller:controller \
-e OS_USERNAME=admin \
-e OS_PASSWORD=ADMIN_PASS \
-e OS_AUTH_URL=http://keystone:5000/v2.0 \
-e OS_TENANT_NAME=admin \
--privileged \
--name node1 \
-h node1 \
krystism/openstack-nova-compute:latest

模型定义

通过模型定义测试依赖

TBD

关联PR

参考文章