Tips:目前Ocata只支持Single cells,并不支持Muiti-cells,所以不要用本文的实例来操作您的环境!
背景
今年2月份OpenStack基金会就发布了Ocata版本,由于主打OpenStack的稳定性和服务的可扩展性,便决定整套Ocata环境玩玩。
其中重点关注现在Nova部署强制使用的Cells v2架构。
因为之前在Kilo上有玩过 Cells v1,由于其复杂的设计和长期被标注实验性质,所以目前这部分关注点极低,也没有多少用户去了解和关注这方面。
造成现在Cells v1版本几乎处于冻结状态。目前用Cell v1最成功的可能就是CERN(欧洲原子能研究中心)了,其5000+计算节点不可谓不牛逼啊。
感兴趣的朋友可以在官网社区上看下CERN的分享
简单看下Cell v1和v2的区别
Nova Cells v1
Nova Cells v2
这里可以看到相对于v1,v2版本清爽简单了许多。
API节点甚至都不要MQ组件,Scheduler在调度的时候只需要在DB中查出对于的Cell信息就能直接连接过去。
所有的Cell节点只需要依赖自己的DB和MQ。
Cell下的Compute节点只需注册到所在的Cell节点下就可以了。
当然目前v2的架构设计得益与Nova数据库的拆分,我们知道从M版开始Nova就开始把API部分拆开创建一个独立的实例。当时在部署的时候Nova配置文件中会有
[api_database]和[database]两个域。
经过两个版本的迭代,这次Ocata发布的时候已经强制用户在部署的创建nova_cell实例了。
根据Cells v2的设计
API节点只使用两个实例,即nova_api
和nova_cell0
nova_api实例里面放了全局信息,如下
+------------------------------+
| Tables_in_nova_api |
+------------------------------+
| aggregate_hosts |
| aggregate_metadata |
| aggregates |
| allocations |
| build_requests |
| cell_mappings |
| flavor_extra_specs |
| flavor_projects |
| flavors |
| host_mappings |
| instance_group_member |
| instance_group_policy |
| instance_groups |
| instance_mappings |
| inventories |
| key_pairs |
| migrate_version |
| placement_aggregates |
| project_user_quotas |
| quota_classes |
| quota_usages |
| quotas |
| request_specs |
| reservations |
| resource_classes |
| resource_provider_aggregates |
| resource_providers |
+------------------------------+
其中Cells的信息放在cell_mappings
表中,Host的信息放在host_mappings
表中,Instances的信息放在instancce_mappings
表中。
**1. ** cell_mappings 表 cell 的 Database 和 Mesage Queue 的连接 。 用于和子 cell 通讯
**2. ** host_mappings 是用于 nova-scheduler, 可以确认分配到的机器 。 这里其实也有一个坑 , 之前 nova-compute 启动起来 , 就可以直接使用了 ,cell v2 之后 , 就需要手动运行 nova-manage cell_v2 discover_host , 把 host mapping 到 cell_mappings 表里面 , 那台计算节点才会加入到调度中 。
**3. ** instance_mappings 表里有所有 instance id, 这样在查询 instance 时 , 就可以从这个表里查到他所在的 cell, 然后直连 cell 拿到 instance 具体信息
nova_cell实例就和普通nova实例的schema是一样的。其中有一个nova_cell0的实例是用来保留当 instance 调度失败时 , instance 的信息不属于任何一个 cell时,就会放到 cell0 里面
操作
1. 部署API节点
这里我通过RDO快速部署一个最小的可用环境。answer-file如下:
[general]
CONFIG_MARIADB_INSTALL=y
CONFIG_GLANCE_INSTALL=y
CONFIG_CINDER_INSTALL=y
CONFIG_NOVA_INSTALL=y
CONFIG_NEUTRON_INSTALL=y
CONFIG_HORIZON_INSTALL=y
CONFIG_CLIENT_INSTALL=y
CONFIG_DEBUG_MODE=y
CONFIG_CONTROLLER_HOST=10.1.1.53
CONFIG_COMPUTE_HOSTS=10.1.1.53
CONFIG_NETWORK_HOSTS=10.1.1.53
CONFIG_STORAGE_HOST=10.1.1.53
CONFIG_USE_EPEL=y
CONFIG_ENABLE_RDO_TESTING=n
CONFIG_AMQP_BACKEND=rabbitmq
CONFIG_AMQP_HOST=10.1.1.53
CONFIG_AMQP_AUTH_USER=amqp_user
CONFIG_MARIADB_HOST=10.1.1.53
CONFIG_MARIADB_USER=root
CONFIG_KEYSTONE_DB_PURGE_ENABLE=True
CONFIG_KEYSTONE_REGION=RegionOne
CONFIG_KEYSTONE_ADMIN_EMAIL=magine@aliyun.com
CONFIG_KEYSTONE_ADMIN_USERNAME=admin
CONFIG_KEYSTONE_API_VERSION=v3
CONFIG_KEYSTONE_IDENTITY_BACKEND=sql
CONFIG_GLANCE_BACKEND=file
CONFIG_CINDER_DB_PURGE_ENABLE=True
CONFIG_CINDER_BACKEND=lvm
CONFIG_NOVA_DB_PURGE_ENABLE=True
CONFIG_NOVA_MANAGE_FLAVORS=y
CONFIG_NOVA_SCHED_CPU_ALLOC_RATIO=16.0
CONFIG_NOVA_SCHED_RAM_ALLOC_RATIO=1.0
CONFIG_NEUTRON_L3_EXT_BRIDGE=br-ex
CONFIG_LBAAS_INSTALL=y
CONFIG_NEUTRON_METERING_AGENT_INSTALL=y
CONFIG_NEUTRON_FWAAS=y
CONFIG_NEUTRON_ML2_TYPE_DRIVERS=vlan,flat
CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES=vlan
CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS=openvswitch
CONFIG_NEUTRON_ML2_VLAN_RANGES=physnet1:10:100
CONFIG_NEUTRON_ML2_VNI_RANGES=10:100
CONFIG_NEUTRON_L2_AGENT=openvswitch
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=physnet1:br-em2
CONFIG_NEUTRON_OVS_EXTERNAL_PHYSNET=br-ex:em3
CONFIG_NEUTRON_OVS_VXLAN_UDP_PORT=4789
2. 部署Cell节点
- 服务安装
这里需要mariadb-server、rabbitmq-server、openstack-nova-compute和openstack-nova-conductor这几个服务
$ yum install -y mariadb-server rabbitmq-server openstack-nova-compute openstack-nova-conductor
$ systemctl enable mariadb rabbitmq-server openstack-nova-conductor openstack-nova-compute
$ systemctl start mariadb rabbitmq-server
- 数据库初始化
$ mysql -e 'create database nova_cell1;'
$ mysql -e "GRANT ALL PRIVILEGES ON nova_cell1.* TO 'nova'@'%' IDENTIFIED BY 'magine1989';"
$ mysql -e "GRANT ALL PRIVILEGES ON nova_cell1.* TO 'nova'@'localhost' IDENTIFIED BY 'magine1989';"
$ mysql -e 'FLUSH PRIVILEGES;'
- nova.conf
这里主要关注数据库的配置
connection=mysql+pymysql://nova_api:73b652f170d34a69@10.1.1.53/nova_api
connection=mysql+pymysql://nova:magine1989@10.1.1.56/nova
connection=mysql+pymysql://nova_placement:73b652f170d34a69@10.1.1.53/nova_placement
- 启动服务
$ systemctl start openstack-nova-conductor openstack-nova-compute
$ nova-manage db sync
3. Cell v2操作
因为 cell v2 完全靠 database 的操作为建立 , 所以也没有相关的 api 接口 。 主要靠 nova-manage cell_v2 命令
添加cell
$ nova-manage cell_v2 create_cell --verbose --name cell1 --database_connection mysql+pymysql://nova:magine1989@10.1.1.56/nova_cell1 --transport-url rabbit://guest:guest@10.1.1.56:5672/
查看cell
$ nova-manage cell_v2 list_cells --verbose
+---------+--------------------------------------+--------------------------------------+------------------------------------------------------+
| Name | UUID | Transport URL | Database Connection |
+---------+--------------------------------------+--------------------------------------+------------------------------------------------------+
| cell1 | 95fa78c1-bb42-4b81-8d37-9d8a23651b1a | rabbit://guest:guest@10.1.1.56:5672/ | mysql+pymysql://nova:magine1989@10.1.1.56/nova_cell1 |
| default | e8969639-bdc3-4b0d-933a-91bbf9759927 | rabbit://guest:guest@10.1.1.53:5672/ | mysql+pymysql://nova:73b652f170d34a69@10.1.1.53/nova |
+---------+--------------------------------------+--------------------------------------+------------------------------------------------------+
发现主机
$ nova-manage cell_v2 discover_hosts
这个时候我们去查数据库的nova_api实例,可以看到cell_mappings表和host_mappings表已经更新如下
# cell_mappings
+---------------------+---------------------+----+--------------------------------------+---------+--------------------------------------+------------------------------------------------------+
| created_at | updated_at | id | uuid | name | transport_url | database_connection |
+---------------------+---------------------+----+--------------------------------------+---------+--------------------------------------+------------------------------------------------------+
| 2017-04-18 02:10:21 | 2017-04-19 03:36:46 | 2 | e8969639-bdc3-4b0d-933a-91bbf9759927 | default | rabbit://guest:guest@10.1.1.53:5672/ | mysql+pymysql://nova:73b652f170d34a69@10.1.1.53/nova |
| 2017-04-19 08:01:35 | 2017-04-19 08:17:54 | 18 | 95fa78c1-bb42-4b81-8d37-9d8a23651b1a | cell1 | rabbit://guest:guest@10.1.1.56:5672/ | mysql+pymysql://nova:devops@10.1.1.56/nova_cell1 |
+---------------------+---------------------+----+--------------------------------------+---------+--------------------------------------+------------------------------------------------------+
# host_mappings
+---------------------+------------+----+---------+-------------------------------+
| created_at | updated_at | id | cell_id | host |
+---------------------+------------+----+---------+-------------------------------+
| 2017-04-18 06:35:25 | NULL | 1 | 2 | ocata.dev.com |
| 2017-04-19 08:22:21 | NULL | 3 | 18 | ocata.compute01.dev.com |
+---------------------+------------+----+---------+-------------------------------+
这里host_mappings的cell_id和cell_mappings的id是关联上的
3. 失败
讲道理,做到这一步后,Nova应该可以发现注册进来的计算节点了。
但是当我在用nova host-list查看host信息却查不到cell1里面节点
$ nova host-list
+---------------+-------------+----------+
| host_name | service | zone |
+---------------+-------------+----------+
| ocata.dev.com | cert | internal |
| ocata.dev.com | conductor | internal |
| ocata.dev.com | scheduler | internal |
| ocata.dev.com | consoleauth | internal |
| ocata.dev.com | compute | nova |
+---------------+-------------+----------+
$ nova service-list
+----+------------------+---------------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason |
+----+------------------+---------------+----------+---------+-------+----------------------------+-----------------+
| 17 | nova-cert | ocata.dev.com | internal | enabled | up | 2017-04-19T08:32:23.000000 | - |
| 18 | nova-conductor | ocata.dev.com | internal | enabled | up | 2017-04-19T08:32:30.000000 | - |
| 23 | nova-scheduler | ocata.dev.com | internal | enabled | up | 2017-04-19T08:32:26.000000 | - |
| 24 | nova-consoleauth | ocata.dev.com | internal | enabled | up | 2017-04-19T08:32:30.000000 | - |
| 25 | nova-compute | ocata.dev.com | nova | enabled | up | 2017-04-19T08:32:29.000000 | - |
+----+------------------+---------------+----------+---------+-------+----------------------------+-----------------+
$ nova hypervisor-list
+----+---------------------+-------+---------+
| ID | Hypervisor hostname | State | Status |
+----+---------------------+-------+---------+
| 1 | ocata.dev.com | up | enabled |
+----+---------------------+-------+---------+
结果
刚开始我一直以为是nova-manage cell_v2的操作问题,当我用各种命令map_cell_and_hosts、update_cell、simple_cell_setup等仍然有问题时,我便开始怀疑Cell v2版本的问题。
经过一段时间上网查资料才知道丫的Ocata版本现在只支持single cells,多Multi-cell还得等今年下半年的Pike。汗 - - !
Ocata新特性原文看这里《53 new things to look for in OpenStack Ocata》
另外,这里想吐槽下现在国内有些媒体在做新闻翻译的时候,有些地方还是欠妥,容易误导人。
比如:99cloud的《OpenStack Ocata Release Notes 》
Ocata 版本加入了许多 Cell V2 的功能 。 但是不是所有的都可以用于生产 。 现在部署 Nova 需要最少创建一个 Cell。
而原文是
Nova now uses Cells v2 for all deployments; currently implemented as single cells, the next release, Pike, will support multi-cell clouds.
这里就说的很清楚,Cell v2的多节点部署要到下个发行版才会被支持。