租户视角的系统状态
上面的几个资源,默认都是管理员有权限查询,普通租户是看不到的。那么作为租户,能够对系统使用状态有一个什么样的了解呢?
租户的资源配额
租户可以查询自己的资源配额限制和使用情况,管理员(admin)可以查询普通租户的资源配额使用情况(os-used-limits-for-admin extension)。参见这里, 这里和这里。
如下是租户查到的自己的资源配额限制和使用情况(片段):
{
"limits": {
"absolute": {
"maxImageMeta": 128,
"maxPersonality": 5,
"maxPersonalitySize": 10240,
"maxSecurityGroupRules": 20,
"maxSecurityGroups": 10,
"maxServerMeta": 128,
"maxTotalCores": 20,
"maxTotalFloatingIps": 10,
"maxTotalInstances": 10,
"maxTotalKeypairs": 100,
"maxTotalRAMSize": 51200,
"maxServerGroups": 10,
"maxServerGroupMembers": 10,
"totalCoresUsed": 0,
"totalInstancesUsed": 0,
"totalRAMUsed": 0,
"totalSecurityGroupsUsed": 0,
"totalFloatingIpsUsed": 0,
"totalServerGroupsUsed":
...
租户的资源使用量
管理员可以查询所有租户对计算资源的使用量,也可以查询某个租户的计算资源使用量(包括每个虚拟机计算资源使用信息),参见这里。
示例1,管理员查询租户对计算资源的使用量:
{
"tenant_usages": [
{
"start": "2012-10-08T21:10:44.587336",
"stop": "2012-10-08T22:10:44.587336",
"tenant_id": "openstack",
"total_hours": 1.0,
"total_local_gb_usage": 1.0,
"total_memory_mb_usage": 512.0,
"total_vcpus_usage": 1.0
}
]
}
示例2,查询某个租户的计算资源使用量:
{
"tenant_usage": {
"server_usages": [
{
"ended_at": null,
"flavor": "m1.tiny",
"hours": 1.0,
"instance_id": "1f1deceb-17b5-4c04-84c7-e0d4499c8fe0",
"local_gb": 1,
"memory_mb": 512,
"name": "new-server-test",
"started_at": "2012-10-08T20:10:44.541277",
"state": "active",
"tenant_id": "openstack",
"uptime": 3600,
"vcpus": 1
}
],
"start": "2012-10-08T20:10:44.587336",
"stop": "2012-10-08T21:10:44.587336",
"tenant_id": "openstack",
"total_hours": 1.0,
"total_local_gb_usage": 1.0,
"total_memory_mb_usage": 512.0,
"total_vcpus_usage": 1.0
}
}
虚拟机状态
说到底,作为IaaS,OpenStack玩的还是虚拟机,因为各种资源(存储、网络)都是为了更好的使用虚拟机服务。所以对虚拟机状态的掌握就显得格外重要。
虚拟机操作事件通知
用户对虚拟机的每个操作(开始和结束),都会通过消息队列向外部发送通知,外部系统可以通过接收通知,了解系统的运行过程。使用通知的另外一个好处,就是可以与Nova解耦,作为外部系统的数据源,实现系统的监控分析。Ceilometer、StackTach和Monasca都用到了Nova的通知作为自己的数据源。
与此同时,虚拟机state或task_state发生变化时,也会向外部发送通知。前提是配置项notify_on_state_change要配置为vm_state或vm_and_task_state。
另外,Nova中除了上述说的操作事件通知外,还有一种审计通知,即在一段时间内的系统资源状态,相关的配置项 instance_usage_audit_period,目前Nova中只有event_type类型为 compute.instance.exists一种审计通知,这种通知可以让你对一段周期内系统中存在的虚拟机有一个全局的了解。
虚拟机操作事件记录
Nova中的虚拟机每个操作(启动、停止、暂停、恢复等),都会在db中保存相关的操作记录,给用户提供查询。利用这个功能,用户对自己的虚拟机整个生命周期的过程和状态都会了如指掌,便于用户的管理。参见这里。示例如下:
{
"instanceActions": [
{
"action": "resize",
"instance_uuid": "b48316c5-71e8-45e4-9884-6c78055b9b13",
"message": "",
"project_id": "842",
"request_id": "req-25517360-b757-47d3-be45-0e8d2a01b36a",
"start_time": "2012-12-05 01:00:00.000000",
"user_id": "789"
},
{
"action": "reboot",
"instance_uuid": "b48316c5-71e8-45e4-9884-6c78055b9b13",
"message": "",
"project_id": "147",
"request_id": "req-3293a3f1-b44c-4609-b8d2-d81b105636b8",
"start_time": "2012-12-05 00:00:00.000000",
"user_id": "789"
}
]
}
在内部实现中,nova-api层会记录action开始的记录,在nova-compute层,则会添加event开始和结束的信息,action和event根据request id(一次消息请求的标识)关联。
虚拟机错误信息记录
因为OpenStack的安装部署复杂性,或者操作过程对环境、配置等要求比较苛刻,稍不注意,就有可能发生错误。一旦发生错误,除了从日志中获取错误信息外,还有什么比较方便、快捷的方式能够迅速定位错误呢?
在API层发生错误,用户会立即看到错误码和错误信息。但如果是在conductor,scheduler或compute层发生错误呢?
OpenStack智慧的社区开发者们已经为我们提供了这种能力。其实还是利用DB和通知机制来实现。
先说通知,虚拟机操作异常时,一般都会发送error通知,通知中包含异常的函数名称、异常时函数的参数以及异常信息。
再说db,虚拟机操作异常时,无论是在conductor, scheduler还是compute层,除了会发送通知外,还会记录异常信息到数据库(instance_faults表),当查询虚拟机信息时,会返回虚拟机的异常信息。
虚拟机诊断信息
租户可以查询虚拟机使用过程中的一些统计信息,比如虚拟机磁盘的读写情况、网络的IO情况等,对于KVM来讲,这些信息都是通过libvirt接口获取。
API示例参见这里。返回消息示例:
{
"vnet0_tx_errors": 0,
"vda_errors": -1,
"vda_read": 4447232,
"vda_write": 4347904,
"vnet0_tx_packets": 1259,
"vda_write_req": 3523,
"memory-actual": 524288,
"cpu0_time": 195230000000,
"vnet0_tx": 364840,
"vnet0_rx_drop": 0,
"vnet0_rx_packets": 1423,
"vnet0_rx_errors": 0,
"memory": 524288,
"memory-rss": 243188,
"vda_read_req": 291,
"vnet0_rx": 363725,
"vnet0_tx_drop": 0
}
参考链接
https://wiki.openstack.org/wiki/SystemUsageData
https://wiki.openstack.org/wiki/NotificationEventExamples
https://github.com/rackerlabs/yagi
http://www.stacktach.com/
作者简介
孔令贤,华为技术有限公司云计算领域OpenStack社区团队技术主管,2011年加入华为西安研究所,一直从事云计算相关方向的研发工作。于2012年开始研究OpenStack,其个人博客(CSDN博客:http://blog.csdn.net/lynn_kong,Github博客:http://lingxiankong.github.io/多次被业内人士学习和转载。同时,积极组织和推动OpenStack在国内的技术交流和活动,多次以主讲人的身份参加OpenStack西安meetup。(文/孔令贤 OpensStack中国社区)