OpenStack是什么?
OpenStack是一种云操作系统,可控制整个数据中心内的大型计算、存储和网络资源池,所有资源都通过具有通用身份验证机制的API进行管理和配置。管理员也可通过Web界面控制,同时授权用户通过Web界面配置资源。
OpenStack能做什么?
OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于帮助组织运行为虚拟计算或存储服务的云,为公有云、私有云,也为大云、小云提供可扩展的、灵活的云计算。
作为一个开源的云计算管理平台,OpenStack由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。
开源OpenStack版本演进
OpenStack与虚拟化
OpenStack优先关注控制面,OpenStack优先考虑如何将计算、存储、网络领域的各类资源抽象为资源池。在此基础上,对资源池内的各类逻辑对象实施控制操作,并将控制操作包装成面向用户的服务。数据面、管理面目前不是OpenStack的重点关注内容。
OpenStack与云计算
domain(域)
:是项目和用户的容器,用于为管理身份入口定义管理边界project(项目)
:一个用于分组或隔离资源的容器,资源的所有权是属于项目的,用户只有加入项目后才能访 问该项目的资源,每个项目可设置Quotauser(用户)
:任何使用OpenStack服务的实体,OpenStack 为 nova、cinder、neutron 等服务创建了相应 的 usergroup(用户组)
:用户的集合,可以对group赋予角色,group中的用户都拥有该角色对应的权限role(角色)
:权限的集合,各服务通过自己的policy.json文件定义各角色的权限,默认只有admin和非admin 两种角色。keystone通过role进行鉴权token(令牌)
:由数字和字母组成的字符串,是credentials的一种,用户认证成功后keystone生成token分 配给用户,用作访问服务的credential。有效期默认24小时,UUID/PKI/PKIZ/Fernet多种形式的tokenservice(服务)
:OpenStack 服务,如nova、neutron等,每个服务提供一个或者多个 endpoint 供用户访问 资源以及进行操作endpoint(端点)
:endpoint是一个网络上可访问的地址,通常是URL。service 通过 endpoint 暴露自己的API,每个Service有public、internal、admin三个endpoint,keystone 负责管理和维护每个 Service 的 Endpoint用户相关
一个Region中可以包含多个Domain,一个Domain中可以包含多个Group、user和Project,一个Group中可以包 含多个user。
通过role可以建立起Group与Project,user与Project之间的联系,即赋予相应的权限。例如:可以通过Group1将
Role 直接赋予Domain1,则Group1中的所有用户都将会对Domain1中的所有Projects拥有admin权限。
glance-api
:对外提供 REST API,响应 image 查询、获取和存储的调用。glance-api 不真正处理请求, 如果操作是与 image metadata(元数据)相关,glance-api 会把请求转发给 glance-registry; 如果操 作是与 image 自身存取相关,glance-api 会把请求转发给该 image 的 store backend。glance-registry
:负责处理和存取 image 的 metadata,如 image 的大小和类型。database
:使用Mariadb,glance有自己的databasestore backend
:glance 自己并不存储 image,真正的 image 存放在 backend 中,glance 支持多种backend,可在配置文件glance-api.conf中定义openstack image list
组件和架构
nova-api
:接受并响应用户对计算服务的API请求,是Nova 服务对 外的唯一接口,会周期性访问数据库更新虚拟机信息。nova-conductor
:nova-compute 访问数据库的全部操作都由 nova-conductor完成(获取和更新数据库中instance的信息),避 免nova-compute 直接访问数据库,增加系统的安全性和伸缩性nova-scheduler
:负责nova的调度服务,创建虚拟机时决定虚拟机 在哪个nova-compute计算节点上启动nova-compute
:处理虚拟机相关的操作,使用driver架构,支持多 种虚拟化技术nova-consoleauth
:为vnc代理服务器提供token验证服务nova-novncproxy
:为浏览器和vncserver之间建立socket,console用来连接到虚机的console接口,实现基于vnc的登录和操作nova-cert
:对接EC2-API的时候才使用,为euca-bundle-image提 供证书database
message queue
在nova.conf中可配置使用的compute_driver类型
nova-compute定期向OpenStack报告计算节点的状态*,实现instance的生命周期管理
通过nova-compute和Hypervisor一起可实现对虚拟机的生命周期管理
主要操作
launch/terminate
:创建虚拟机、终止虚拟机(终止即删除*)start/shutoff/reboot
:虚拟机的开机、关机、重启操作,硬重启可以是soft/hard rebootsnapshot
:创建快照,对虚拟机的disk镜像文件(不含云硬盘)进行全量备份,生成一个类型为snapshot的image保存在glance中,快照恢复相当于通过snapshot image创建虚拟机pause/resume
:暂停虚拟机,将虚拟机状态保存到宿主机内存中,resume的时候再从内存中读回 虚拟机状态继续运行。暂停状态(状态为paused)的虚拟机可以连接到console,但无法登录操作。suspend/resume
:挂起虚拟机,将虚拟机状态保存到宿主机硬盘中,resume的时候再从宿主机中 读回虚拟机状态继续运行。挂起状态(状态为suspended)的虚拟机无法连接到console。shelf/unshelf
:为虚拟机创建一个快照并将快照的image文件保存在glance中,虚拟机状态变为 Shelved Offloaded,电源状态为shut down。unshelve相当于通过快照恢复虚拟机。lock/unlock
:对被加锁的 instance 执行重启等改变状态的操作会提示操作不允许, 执行解锁操作后 恢复正常。admin 角色的用户不受 lock 的影响,无论加锁与否都可以正常执行操作。migrate/live migrate /evacuate
:迁移操作只能在管理界面进行,在线迁移时不中断虚拟机运行。resize
:变更虚拟机配置,默认会关闭再启动虚拟机rebuild
:选择一个image镜像重建虚拟机,可用于虚拟机的恢复其他操作
:绑定/解绑定Floating IP、增加/删除虚拟网卡、编辑虚拟机信息、编辑安全组、console登录、查看日志等RetryFilter
:过滤掉之前已经调度过的节点AvailabilityZoneFilter
:根据用户的选择,调度到所选的AZ中RamFilter
:将不能满足所选Flavor内存需求的计算节点过滤掉*DiskFilter
:将不能满足Flavor磁盘需求的计算节点过滤掉ComputeFilter
:只有nova-compute服务正常工作的计算节点才能©被2016调Unite度dStack Inc. All RiRegion
:针对endpoint的最大概念,endpoint在一个region中是唯一的,region之间完全隔离,有自己 的计算/网络/存储资源,但可以共享Keystone和HorizonAvailability zone
:region内的再次划分,可以理解为一个故障域,AZ对用户可见,创建云主机时可选择 可用域Host aggregate
:根据某一属性对硬件的划分,HA只对管理员可见,scheduler可根据参数实现到指定Host aggregate的调度Cell
:用于大规模部署时增强nova的横向扩展能力,每个cell有单独的MQ和DBcinder-api
:接受api请求,调用cinder-volumecinder-scheduler
:通过调度算法选择最合适的cinder-volume去创建volumecinder-volume
:管理volume的服务和volume的生命周期。与后端存储协调 工作,通过driver架构支持多种backend storage作为volume providercinder-backup
:提供volume的备份服务。与后端实际提供备份空间的存储协 调工作,支持多种backup backend storage作为备份后端backend storage
:实际提供存储空间的存储设备/系统backup storage backend
:实际提供备份存储空间的存储设备/系统database
message queue
Filter Scheduler
调度过程分为两步:
AvailabilityZoneFilter
:根据用户的选择,调度到所选的AZ中CapacityFilter
:将存储空间不满足 volume 创建需求的存储后端对应的 cinder-volume 过滤掉CapabilityFilter
:不同的存储后端可以有不同的volume type,创建 volume 时可通过 volume type指定需要的Capability,通过filter过滤掉不满足 type 的 cinder-volumehttp://www.openstack.org/marketplace/drivers/
Create volume
:创建存储卷,可以创建空白卷或从镜像创建卷Delete volume
:删除存储卷,存储卷的生命周期不依赖于虚拟机Attach volume
:存储卷挂载到虚拟机,初次挂载后需要分区和格式Detach volume
:存储卷从虚拟机解挂载Extend volume
:存储卷扩容Snapshot volume
:存储卷做快照Boot from volume
:从存储卷启动虚拟机(虚拟机操作系统放在存储卷上)两个层面
控制和数据的分离,数据不用经过 cinder-volume
Neutron 为整个 OpenStack 环境提供网络支持,包括二层交换,三层路由,负载均衡,安全组,防火墙 等。
Neutron 提供了一个灵活的框架,无论是开源还是商业软件,都可以通过配置被用来实现这些功能。
二层交换(Switching)
三层路由(Routing)
负载均衡(Load Balancing)
安全组(Security Group)
防火墙(Firewalling)
Network(网络)
一个隔离的二层广播域。Neutron 支持多种类型的 network,包括 local, flat, VLAN, VxLAN 和 GRE
Subnet(子网)
Port(端口)
组件和架构
neutron server
:接受api请求,调用 plugin处理请求neutron plugin
:处理 neutron server 发来的请求,维护网络逻辑状态,并调用 agent 处理请求(core plugin, service plugin)neutron agent
:处理 plugin 的请求,负责在 network provider 上真正实现各种网络功能(L2 agent, L3 agent, DHCP agent)network provider
:实际提供网络服务的虚拟或物理网络 设备,如Linux Bridge、Open vSwitch或者网络厂商的设 备database
message queue
plugin 按照功能分为两类: core plugin 和 service plugin。core plugin 维护 Neutron 的 netowork, subnet 和 port 相关资源的信息,与 core plugin 对应的 agent 包括 linux bridge, Open
vSwitch 等; service plugin 提供 routing, firewall, load balance 等服务,也有相应的 agent。
plugin 的一个主要工作是在数据库中维护 Neutron 网络的状态信息,以前的 core-plugin 架构带来一个问题,所有 network provider 的 plugin 都要编写一套类似的数据库访问代码,绝大部代码是重复的。并且无法同时使用多种 network provider
Neutron 在 Havana 版本实现了一个 ML2(Modular Layer 2)plugin,对 plugin 的功能进行抽象和封装,各种 network provider 无需开发自己的 plugin,只需要针对 ML2 开发相应的 driver 就可以了。ML2实现二层网络拓扑与底层实现的解耦
neutron.conf
ml2_conf.ini
访问层,负责处理用户的请求和用户身份的认证
Proxy server
:对外提供对象服务RestFul API,可横向扩展,一方面 转发认证服务器进行用户信息认证,一方面将请求转发至相应的账户、 容器或者对象服务;Authentication Server
:验证访问用户的身份信息,并获得一个对 象访问令牌(Token),在一定的时间内会一直有效存储层,负责对象数据的实际存储
region、zone、storage node、device、 partition
account、container、object
account server、container server、 object server
Swift通过 Ring 来实现对象与真正的物理存储位置的映射
Swift通过 Updater、Replicator、Auditor
这三种服务来保 证数据一致性
每个对象有一定数量的副本(replica,默认为3个),每个副 本存放在不同的zone中,对象的副本是通过partition的副本实现的,即,Swift管理副本的粒度是partition而非单个对象
存储层的物理层次划分:
Region
:地理上互相隔离的区域Zone
:region内部,硬件上的隔离,一个zone可以映射为一个硬盘、一台主机或一个机柜。通常可理解为一个zone 代表一组独立的互相隔离的storage nodeStorage node
:存储对象数据的物理节点Device
:可理解为存储节点上的磁盘Partition
:device上的文件系统中的目录存储对象的逻辑层次划分:
Proxy Server 运行在 Proxy Node上,接收用户HTTP请求
请求路由到相应的Controller:AccountController、ContainerController、ObjectController
Controller从对应的 Ring 文件中获取请求数据所在的存储 节点Storage node,然后再将请求转发给该节点上的相应Server:AccountServer、ContainerServer、ObjectServer,最终进行具体的操作
Object server
:提供对象元数据和内容服务,每个对象的内容会 以文件的形式存储在文件系统中,元数据会作为文件属性来存储,需要采用支持扩展属性的文件系统(如XFS)Container server
:提供容器元数据和统计信息,并维护所含对 象列表的服务,每个容器的信息也存储在一个 SQLite 数据库中Account server
:提供账户元数据和统计信息,并维护所含容器Ring:Swift 通过 Ring 来实现物理节点的管理,包括记录对象与物理存储位置间的映射, 物理节点的添加和删除等。
Ring的数据结构,包括是三种重要信息:
存储对象与物理位置间的映射:
物理节点的添加和删除:
添加或者删除物理节点(device)后,需要执行 swift-ring-builder 的 rebalance 命令重新平衡数 据。Ring rebalance 过程是生成了不同的 Ring 文件,更新了设备表和设备查询表,更新
Partition 和 device 之间的映射关系。最终 Partition 的移动是由 Replicator 来实际完成。
分布式系统CAP(Consistency,Availability,Partition Tolerance)理论,无法同时满足 3 个方面,Swift 放弃严格一致性而采用最终一致性模型(Eventual Consistency),来达 到高可用性和无限水平扩展能力。
N:数据的副本总数;W:写操作被确认接受的副本数量;R:读操作的副本数量
Swift 采用比较折中的策略,写操作需要满足至少一半以上成功 W >N/2,再保证读操作与 写操作的副本集合至少产生一个交集,即 R+W>N。
Swift 默认配置是 N=3,W=2>N/2,R=1 或 2
Swift通过三种服务来保证数据一致性:
Auditor
:检查 object,container 和 account 的完整性,如果发现比特级的错误,文件将 被隔离,并复制其他的副本以覆盖本地损坏的副本(实际的复制工作由replicator完成); 其他类型的错误会被记录到日志中 Updater
:当 object 或 container 由于高负载的原因而无法立即更新时,任务将会被序列 化到在本地文件系统中进行排队,以便服务恢复后进行异步更新Replicator
:检测本地节点的分区副本和远程副本是否一致,发现不一致时会将过时副本更 新为最新版本;另外一个任务是负责并将被标记为删除的数据真正从物理介质上删除。什么Heat
为什么需要Heat
概念
heat command-line client
:CLI通过与 heat-api 通信,来调用 API 实现相关功能。终端开发者可以直接使用编排 REST API。heat-api
:实现 OpenStack 原生支持的 REST API。该组件通过把 API 请求经由 AMQP 传送给 Heat engine 来处理 API 请求。heat-api-cfn
:提供与 AWS CloudFormation 兼容的、AWS 风格的查询 API,处理请求并通过 AMQP 将它们发送到 heat-engine。heat-engine
:执行模板内容,最终完成应用系统的创建和部署,并把执行结果返回给 API 调用者。heat-cfntools
:完成虚拟机实例内部的操作配置任务,需要单独下载。概念:Heat 模板全称为heat orchestration template,简称为HOT。
模板详解
1.典型 Heat 模板结构
heat_template_version: -- ### HOT版本
description: ### 说明
# a description of the template
parameter_groups: ### 指定参数顺序
- label: <human-readable label of parameter group>
description: <description of the parameter group>
parameters:
- <param name>
- <param name>
parameters: ### 传递的参数
<param name>: ### 参数名
type: <string | number | json | comma_delimited_list | boolean> ### 参数类型
label: <human-readable name of the parameter> ### 标签
description: <description of the parameter>
default: <default value for parameter>
hidden: <true | false> ### 是否隐藏
constraints: ### 已有的内置参数:OS::stack_name、OS::stack_id、OS::project_id
<parameter constraints>
immutable: <true | false>
resources: ### 资源对象
<resource ID>: ### 资源的ID
type: <resource type> ### 资源的类型
properties: ### 资源的属性
<property name>: <property value>
metadata: ### 资源的元数据
<resource specific metadata>
depends_on: <resource ID or list of ID>
update_policy: <update policy>
deletion_policy: <deletion policy>
outputs: ### 返回值
<parameter name>: ### 参数名
description: <description> ### 说明
value: <parameter value> ### 输出值
例子
heat_temp_version:--
Description: AWS::CloudWatch::Alarm using Ceilometer.
parameters:
user_name:
type: string
label: User Name
description: User name to be configured for the application
port_number:
type: number
label: Port Number
description: Port number to be configured for the web server
resources:
my_instance:
type: OS::Nova::Server
properties:
flavor: m1.small
image: F18-x86_64-cfntools
outputs:
instance_ip:
description: IP address of the deployed compute instance
value: { get_attr: [my_instance, first_address] }
语法
get_attr:
- <resource name> ### 必须是模板 resouce 段中指定的资源。
- <attribute name> ### 要获取的属性,如果属性对应的值是list 或map, 则可以指定key/index来获取具体的值。
- <key/index > (optional)
- <key/index > (optional)
- ...
示例
resources:
my_instance:
type: OS::Nova::Server
# ...
outputs:
instance_ip:
description: IP address of the deployed compute instance
value: { get_attr: [my_instance, first_address] }
instance_private_ip:
description: Private IP address of the deployed compute instance
value: { get_attr: [my_instance, networks, private, ] }
语法
get_file: <content key>
示例
resources:
my_instance:
type: OS::Nova::Server
properties:
# general properties ...
user_data:
get_file: my_instance_user_data.sh
my_other_instance:
type: OS::Nova::Server
properties:
# general properties ...
user_data:
get_file: http://example.com/my_other_instance_user_data.sh
语法
get_param:
- <parameter name>
- <key/index 1> (optional)
- <key/index 2> (optional)
- ...
示例
parameters:
instance_type:
type: string
label: Instance Type
description: Instance type to be used.
server_data:
type: json
resources:
my_instance:
type: OS::Nova::Server
properties:
flavor: { get_param: instance_type}
metadata: { get_param: [ server_data, metadata ] }
key_name: { get_param: [ server_data, keys, 0 ] }
输出
{"instance_type": "m1.tiny",
{"server_data": {"metadata": {"foo": "bar"},"keys": ["a_key","other_key"]}}}
语法
get_resource: <resource ID>
示例
resources:
instance_port:
type: OS::Neutron::Port
properties: ...
instance:
type: OS::Nova::Server
properties:
...
networks:
port: { get_resource: instance_port }
语法
list_join:
- <delimiter>
- <list to join>
示例输出:one,two,three
list_join: [', ', ['one', 'two', 'and three']]
语法
digest:
- <algorithm> ### 可用的值是hashlib(md5, sha1, sha224, sha256, sha384, and sha512) 或openssl的相关值
- <value>
示例
# from a user supplied parameter
pwd_hash: { digest: ['sha512', { get_param: raw_password }] }
语法
repeat:
template:
<template>
for_each:
<var>: <list>
示例
parameters:
ports:
type: comma_delimited_list
label: ports
default: "80,443,8080"
protocols:
type: comma_delimited_list
label: protocols
default: "tcp,udp"
resources:
security_group:
type: OS::Neutron::SecurityGroup
properties:
name: web_server_security_group
rules:
repeat:
for_each:
<%port%>: { get_param: ports }
<%protocol%>: { get_param: protocols }
template:
protocol: <%protocol%>
port_range_min: <%port%>
结果
[{‘protocal’:tpc, ‘prot_range_min’:},
{‘protocal’:tpc, ‘prot_range_min’:},
{‘protocal’:tpc, ‘prot_range_min’:},
{‘protocal’:udp, ‘prot_range_min’:},
{‘protocal’:udp, ‘prot_range_min’:},
{‘protocal’:udp, ‘prot_range_min’:}]
语法
str_replace:
template: <template string>
params: <parameter mappings>
示例
resources:
my_instance:
type: OS::Nova::Server
# general metadata and properties ...
outputs:
Login_URL:
description: The URL to log into the deployed application
value:
str_replace:
template: http://host/MyApplication
params:
host: { get_attr: [ my_instance, first_address ] }
语法
str_split:
- ','
- string,to,split
示例
str_split: [',', 'string,to,split']
结果
['string', 'to', 'split']
为什么要有Ceilometer
历史
sources: A source is a producer of samples
......
- name: cpu_source
interval: 600 ## Poller 获取 cpu samples 的间隔为 10 分钟
meters:
- "cpu"
sinks:
- cpu_sink
......
sinks: A sink on the other hand is a chain of handlers of samples
......
- name: cpu_sink
transformers: ## 转换器
- name: "rate_of_change"
parameters:
target:
name: "cpu_util"
unit: "%"
type: "gauge"
scale: "100.0 / (10**9 * (resource_metadata.cpu_number or1))"
publishers: ## 分发器
- notifier://
[DEFAULT]
dispatcher = database
dispatcher = file
[dispatcher_file]
backup_count = 5
file_path = /var/log/ceilometer/ceilometer-samples
max_bytes = 100000