OpenStack Nova:在一个 Hypervisor 上配置多个 Ceph 后端

OSC编辑部 发布于 2015/09/17 19:18
阅读 1K+
收藏 0

使用多个后端配置一个 Nova hypervisor,用来存储实例的根短暂磁盘。

I. 基本原理

这里最主要的是可以充分使用你 hypervisors 上的资源。目前,Nova 不支持多个 image_type后端,也就是说不同的根短暂磁盘依赖于实例的类型,而且只能是单个计算节点。这有点类似 Cinder 多个后端支持,可以分配类型。当我不想为每个后端计算节点,就必须投入到查找适合的解决方案。这个解决方案是可行的,但并不是常规的。但是还是希望对大家 有用,可以摆脱计算节点数量限制和各种用例。

其中一个用例是在 root epheeral disks 上设置不同的 QoS,但是并不想限制 hypervisor。你可以决定提供不同的 Ceph 后端 (不同的速度等等)。

II. 配置 Ceph

首先我们需要准备 Ceph 集群,这个需要创建两个不同的池:

$ ceph osd pool create vms 128
$ ceph osd pool create vms2 128

最后创建一个密钥,可以访问两个池:

$ ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rwx pool=vms2, allow rx pool=images'

III. 配置 OpenStack Nova

III.1. Nova.conf

因为我们需要使用主机聚集我们需要的特定调度器过滤器,所以使用以下方法配置你的 Nova 调度器:

scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,AggregateInstanceExtraSpecsFilter

现在我们使用两个 Nova 配置文件。同一个 hypervisor 上运行两个不同 Nova 实例的唯一方式是使用不同的 host 值。所以这两个不会指向一个真实节点,但是不止一个逻辑条目。但是这两个需要通过 DNS 实例或者 OpenStack controllers 上的/etc/hosts文件知道彼此。

第一个 nova-compute 进程会包括 nova-ceph1.conf:

[DEFAULT]
host = compute-ceph1

[libvirt]
images_rbd_ceph_conf = /etc/ceph/ceph.conf
images_rbd_pool = vms
images_type = rbd

第一个 nova-compute 进程会包括 nova-ceph2.conf:

[DEFAULT]
host = compute-ceph2

[libvirt]
images_rbd_ceph_conf = /etc/ceph/ceph.conf
images_rbd_pool = vms2
images_type = rbd

现在你需要运行你的 nova 进程:

$ nova-compute --config-file /etc/nova/nova-ceph1.conf  --config-file /etc/nova/nova-ceph2.conf

如果你使用 systemd,你可以使用以下单元文件:

[Unit]
Description=OpenStack Nova Compute Server
After=syslog.target network.target

[Service]
Environment=LIBGUESTFS_ATTACH_METHOD=appliance
Type=notify
Restart=always
User=nova
ExecStart=/usr/bin/nova-compute --config-file /etc/nova/nova-ceph1.conf  --config-file /etc/nova/nova-ceph2.conf

[Install]
WantedBy=multi-user.target

验证可行:

$ nova service-list
+----+----------------+---------------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary         | Host          | Zone     | Status  | State | Updated_at                 | Disabled Reason |
+----+----------------+---------------+----------+---------+-------+----------------------------+-----------------+
| 1  | nova-conductor | deventer      | internal | enabled | up    | 2015-09-14T09:55:09.000000 | -               |
| 2  | nova-cert      | deventer      | internal | enabled | up    | 2015-09-14T09:55:18.000000 | -               |
| 3  | nova-network   | deventer      | internal | enabled | up    | 2015-09-14T09:55:11.000000 | -               |
| 4  | nova-scheduler | deventer      | internal | enabled | up    | 2015-09-14T09:55:16.000000 | -               |
| 6  | nova-compute   | compute-ceph1 | nova     | enabled | up    | 2015-09-14T09:55:12.000000 | -               |
| 7  | nova-compute   | compute-ceph2 | nova     | enabled | up    | 2015-09-14T09:55:17.000000 | -               |
+----+----------------+---------------+----------+---------+-------+----------------------------+-----------------+

快速的跳过一些 Nova 在 Ceph 后端的配置,所以类似 libvirt secret 就不再这里一一解释了。如果你不熟悉这个配置,请看官方文档

III.2. Host aggregates

现在我们需要使用 host aggregates 逻辑分离这两个 hypervisors,为了实现这个,我们创建了两个 aggregates:

$ nova aggregate-create ceph-compute-storage1
+----+-----------------------+-------------------+-------+----------+
| Id | Name                  | Availability Zone | Hosts | Metadata |
+----+-----------------------+-------------------+-------+----------+
| 1  | ceph-compute-storage1 | -                 |       |          |
+----+-----------------------+-------------------+-------+----------+
$ nova aggregate-create ceph-compute-storage2
+----+-----------------------+-------------------+-------+----------+
| Id | Name                  | Availability Zone | Hosts | Metadata |
+----+-----------------------+-------------------+-------+----------+
| 2  | ceph-compute-storage2 | -                 |       |          |
+----+-----------------------+-------------------+-------+----------+

现在添加 hypervisor 到他们各自的 aggregates:

$ nova aggregate-add-host ceph-compute-storage1 compute-ceph1
Host compute-ceph1 has been successfully added for aggregate 1
+----+-----------------------+-------------------+-----------------+----------+
| Id | Name                  | Availability Zone | Hosts           | Metadata |
+----+-----------------------+-------------------+-----------------+----------+
| 1  | ceph-compute-storage1 | -                 | 'compute-ceph1' |          |
+----+-----------------------+-------------------+-----------------+----------+
$ nova aggregate-add-host ceph-compute-storage2 compute-ceph2
Host compute-ceph2 has been successfully added for aggregate 2
+----+-----------------------+-------------------+-----------------+----------+
| Id | Name                  | Availability Zone | Hosts           | Metadata |
+----+-----------------------+-------------------+-----------------+----------+
| 2  | ceph-compute-storage2 | -                 | 'compute-ceph2' |          |
+----+-----------------------+-------------------+-----------------+----------+

最后设置一个特定的元数据,稍后会被 Nova flavor 记录:

$ nova aggregate-set-metadata 1 cephcomputestorage1=true
Metadata has been successfully updated for aggregate 1.
+----+-----------------------+-------------------+-----------------+----------------------------+
| Id | Name                  | Availability Zone | Hosts           | Metadata                   |
+----+-----------------------+-------------------+-----------------+----------------------------+
| 1  | ceph-compute-storage1 | -                 | 'compute-ceph1' | 'cephcomputestorage1=true' |
+----+-----------------------+-------------------+-----------------+----------------------------+
$ nova aggregate-set-metadata 2 cephcomputestorage2=true
Metadata has been successfully updated for aggregate 2.
+----+-----------------------+-------------------+-----------------+----------------------------+
| Id | Name                  | Availability Zone | Hosts           | Metadata                   |
+----+-----------------------+-------------------+-----------------+----------------------------+
| 2  | ceph-compute-storage2 | -                 | 'compute-ceph2' | 'cephcomputestorage2=true' |
+----+-----------------------+-------------------+-----------------+----------------------------+

III.3. Flavors

最后一步是创建新的 flavors,这样可以决定在哪个逻辑 hypervisor  (设置在哪个 Ceph 池上运行实例):

$ nova flavor-create m1.ceph-compute-storage1 8 128 40 1
+----+--------------------------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name                     | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+--------------------------+-----------+------+-----------+------+-------+-------------+-----------+
| 8  | m1.ceph-compute-storage1 | 128       | 40   | 0         |      | 1     | 1.0         | True      |
+----+--------------------------+-----------+------+-----------+------+-------+-------------+-----------+
$ nova flavor-create m1.ceph-compute-storage2 9 128 40 1
+----+--------------------------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name                     | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+--------------------------+-----------+------+-----------+------+-------+-------------+-----------+
| 9  | m1.ceph-compute-storage2 | 128       | 40   | 0         |      | 1     | 1.0         | True      |
+----+--------------------------+-----------+------+-----------+------+-------+-------------+-----------+

我们分配 aggregate 特定元数据到不同版本,可以区分他们:

$ nova flavor-key m1.ceph-compute-storage1 set aggregate_instance_extra_specs:cephcomputestorage1=true
$ nova flavor-key m1.ceph-compute-storage2 set aggregate_instance_extra_specs:cephcomputestorage2=true

IV. 测试

我们配置已经完成,现在来看看这是怎么运作的吧。现在在两个不同的版本中启动实例:

$ nova boot --image 96ebf966-c7c3-4715-a536-a1eb8fc106df --flavor 8 --key-name admin ceph1
$ nova boot --image 96ebf966-c7c3-4715-a536-a1eb8fc106df --flavor 9 --key-name admin ceph2
$ nova list
+--------------------------------------+-------+--------+------------+-------------+------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks         |
+--------------------------------------+-------+--------+------------+-------------+------------------+
| 79f7c0b6-6761-454d-9061-e5f143f02a0e | ceph1 | ACTIVE | -          | Running     | private=10.0.0.5 |
| f895d02e-84f8-4e30-8575-ef97e21a2554 | ceph2 | ACTIVE | -          | Running     | private=10.0.0.6 |
+--------------------------------------+-------+--------+------------+-------------+------------------+

看起来他们是在运行了,现在来验证这些实例是不是在他们自己的 Ceph 池中启动:

$ sudo rbd -p vms ls
79f7c0b6-6761-454d-9061-e5f143f02a0e_disk
79f7c0b6-6761-454d-9061-e5f143f02a0e_disk.config
$ sudo rbd -p vms2 ls
f895d02e-84f8-4e30-8575-ef97e21a2554_disk
f895d02e-84f8-4e30-8575-ef97e21a2554_disk.config

配置完成!

via sebastien-han.fr

PS:有几个词语不是特别会翻译:Flavors,aggregates,hypervisor,root epheeral disks 

加载中
返回顶部
顶部