1. keystone基本概念
- 管理用户及其权限
- 维护 OpenStack Services 的 Endpoint
- Authentication(认证)和 Authorization(鉴权)
User
任何使用 openstack 的实体,可以是真正的用户,其他系统或者服务。
当 User 请求访问 OpenStack 时,Keystone 会对其进行验证。
Credentials
Credentials 是 User 用来证明自己身份的信息:
- 用户名/密码
- Token
- API Key
- 其他高级方式
Authentication
Authentication 是 Keystone 验证 User 身份的过程。
User 访问 OpenStack 时向 Keystone 提交用户名和密码形式的 Credentials,Keystone 验证通过后给 User 一个 Token 作为后续访问的 Credential。
Token
Token 是由数字和字母组成的字符串,User 成功 Authentication 后由 Keystone 分配给 User。
- Token 用做访问 Service 的 Credential
- Service 会通过 Keystone 验证 Token 的有效性
- Token 的有效期默认是 24 小时
Project
Project 用于将 OpenStack 的资源(计算、存储和网络)进行分组和隔离。
根据 OpenStack 服务的对象不同,Project 可以是一个客户(公有云,也叫租户)、部门或者项目组(私有云)。
- 资源的所有权是属于 Project 的,而不是 User。
- 每个 User(包括 admin)必须属于某个 Project 才能访问该 Project 的资源。
- 一个User可以属于多个 Project。
- admin 相当于 root 用户,具有最高权限
Service
包括 Compute、Cinder、Swift、Glance 、Neutron等。
每个 Service 都会提供若干个 Endpoint,User 通过 Endpoint 访问资源。
Endpoint
Endpoint 是一个网络上可访问的URL地址。
Service 通过 Endpoint 暴露自己的 API。
Keystone 负责管理和维护每个 Service 的 Endpoint
查看服务组件的 Endpoint:
# openstack catalog list
+------------+----------------+----------------------------------------------------------------------------------------------------+
| Name | Type | Endpoints |
+------------+----------------+----------------------------------------------------------------------------------------------------+
| cinder | volume | RegionOne |
| | | internal: http://keystone.cn-test-3.lcs.i-lecloud.com:8776/v1/6b13cdad170c4674a061b9ff69847164 |
| | | RegionOne |
| | | public: http://keystone.cn-test-3.lcs.i-lecloud.com:8776/v1/6b13cdad170c4674a061b9ff69847164 |
| | | RegionOne |
| | | admin: http://keystone.cn-test-3.lcs.i-lecloud.com:8776/v1/6b13cdad170c4674a061b9ff69847164 |
| | | |
| glance | image | RegionOne |
| | | public: http://keystone.cn-test-3.lcs.i-lecloud.com:9292 |
| | | RegionOne |
| | | internal: http://keystone.cn-test-3.lcs.i-lecloud.com:9292 |
| | | RegionOne |
| | | admin: http://keystone.cn-test-3.lcs.i-lecloud.com:9292
Role
包含两部分:Authentication(认证)和 Authorization(鉴权)
- Authentication 解决的是“你是谁?”的问题
- Authorization 解决的是“你能干什么?”的问题
Keystone 是借助 Role 来实现 Authorization 的:
# openstack role list
+----------------------------------+------------------+
| ID | Name |
+----------------------------------+------------------+
| 039f666a47834c7baad431559eca1de7 | Member |
| 20401b93799d46488b52ab1b7b0a5a54 | heat_stack_user |
Service 决定 Role 能做什么
Service 通过 policy.json 文件对 Role 进行访问控制。
以下是 Nova 服务 /etc/nova/policy.json:
# cat /etc/nova/policy.json
{
"context_is_admin": "role:admin",
"admin_or_owner": "is_admin:True or project_id:%(project_id)s",
"default": "rule:admin_or_owner",
当用户登录 openstack 时,完成了以下:
Token 中包含了 User 的 Role 信息
admin 从 Keystone 拿到了各 Service 的 Endpoints
会查看 /etc/glance/policy.json,是否有操作的权限
Keystone 主要有两个日志:
- keystone.log
- keystone_access.log
2. image基本概念
Image 是一个模板,里面包含了基本的操作系统和一些软件。
在 OpenStack 中,提供 Image Service 的是 Glance,其具体功能如下:
- 提供 REST API 让用户能够查询和获取 image 的元数据和 image 本身
- 支持多种方式存储 image,包括文件系统、Swift、Amazon S3 等
- 执行 Snapshot 创建新的 image
2.1 Glance 架构
- 与 image metadata (例如 image 的大小和类型)相关的操作,glance-api 会把请求转发给 glance-registry;
- 与 image 自身存取相关的操作,glance-api 会把请求转发给该 image 的 store backend。
store backend,是在 /etc/glance/glance-api.conf 中配置的
2.1 Glance命令
创建命令:
glance image-create --name cirros --file /tmp/cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-formatbare --progress
glance image-create --name centos-7.3_0504 --id 00000000-0000-0000-0000-107030000000 --visibility public --disk-format raw --container-format bare < centos-7.3_0504.raw
qemu-img convert -f qcow2 -O raw centos-7.3_0504.qcow2 centos-7.3_0504.raw
3. nova基本概念
3.1 nova 架构
- nova-conductor: nova-compute 经常需要更新数据库,比如更新虚机的状态。 出于安全性和伸缩性的考虑,nova-compute 并不会直接访问数据库
- nova-consoleauth: 负责对访问虚机控制台请亲提供 Token 认证
- 向 API(nova-api)发送请求:“帮我创建一个虚机”
- API 对请求做一些处理后,向 Messaging 发送了一条消息:“让 Scheduler 创建一个虚机”
- Scheduler 从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计算节点中选出节点,向 Messaging 发送了一条消息:“在计算节点创建这个虚机”
- 计算节点 Compute 从 Messaging 中获取到 Scheduler 发给它的消息,然后在本节点的 Hypervisor 上启动虚机。
- 在虚机创建的过程中,Compute 如果需要查询或更新数据库信息,会通过 Messaging 向 Conductor 发送消息,Conductor 负责数据库访问。
配置文件 /etc/nova/nova.conf 中由 compute_driver 配置项指定该计算节点使用哪种 Hypervisor 的 driver
compute_driver=ironic.IronicDriver
3.2 nova-api
在 keystone 中我们可以查询 nova-api 的 endponits
# openstack endpoint list
3.2 Filter
RetryFilter: 刷掉之前已经调度过的节点AvailabilityZoneFilter: RamFilter: RamFilter 将不能满足 flavor 内存需求的计算节点过滤掉 (ram_allocation_ratio)DiskFilter: DiskFilter 将不能满足 flavor 磁盘需求的计算节点过滤掉(disk_allocation_ratio)CoreFilter: CoreFilter 将不能满足 flavor vCPU 需求的计算节点过滤掉(cpu_allocation_ratio)ComputeFilter:只有 nova-compute 服务正常工作的计算节点才能够被 nova-scheduler调度(必须)ComputeCapabilitiesFilter:根据计算节点的特性来筛选ImagePropertiesFilter:根据所选 image 的属性来筛选匹配的计算节点ServerGroupAntiAffinityFilter:尽量将 Instance 分散部署到不同的节点上ServerGroupAffinityFilter:会尽量将 instance 部署到同一个计算节点上。
3.2 创建instance
- 为 instance 准备资源(为 instance 分配内存、磁盘空间和 vCPU)
- 创建 instance 的镜像文件(首先将该 image 下载到计算节点,然后将其作为 backing file 创建 instance 的镜像文件)
- 创建 instance 的 XML 定义文件
- 创建虚拟网络并启动虚拟机
4. 存储基本概念
操作系统获得存储空间的方式:
- 通过协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)。(Block Storage,每个裸硬盘通常也称作 Volume)
- 通过 NFS、CIFS 等 协议,mount 远程的文件系统(文件系统存储)
管理块存储 Cinder 具体功能是:
- 提供 REST API 使用户能够查询和管理 volume、volume snapshot 以及 volume type
- 提供 scheduler 调度 volume 创建请求,合理优化存储资源的分配
- 通过 driver 支持多种后端存储方式,例如 LVM,NFS,Ceph 等
4.1 cinder 架构
- cinder-volume:管理 volume 的服务,与 volume provider 协调工作,管理 volume 的生命周期。运行 cinder-volume 服务的节点被称作为存储节点。支持多种 volume provider
- cinder-scheduler:通过调度算法选择最合适的存储节点创建 volume。
- volume provider:数据的存储设备,为 volume 提供物理存储空间。 每种 volume provider 通过自己的 driver 与cinder-volume 协调工作。
4.2 创建流程
- 向 cinder-api 发送请求:“创建一个 volume”
- API 对请求做一些处理后,向 Messaging 发送了一条消息:“让 Scheduler 创建一个 volume”
- cinder-scheduler 从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计存储点中选出节点那谁
- Scheduler 向 Messaging 发送了一条消息:“让存储节点那谁创建 volume”
- 存储节点那谁的 cinder-volume 从 Messaging 中获取到 Scheduler 发给它的消息,然后通过 driver 在 volume provider 上创建 volume。
配置文件 /etc/cinder/cinder.conf 中 volume_driver 配置项设置该存储节点使用 driver
定期 cinder-volume 就会报告当前存储节点的资源使用情况。LVM 存储节点使用 vgs 和 lvs 这两个命令获取 LVM 的容量使用信息
5. neutron 基本概念
5.1 为什么需要 neutron
- 传统的网络管理方式大多依赖于管理员手工配置和维护各种网络硬件设备
- 云环境下的网络已经变得非常复杂,特别是在多租户场景里
5.2 neutron 功能
neutron 提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和 VPN 等。
支持多种类型的 network,包括 local, flat, VLAN, VXLAN 和 GRE。
- local: 网络与其他网络和节点隔离。只能与位于同一节点同一网络通信,主要用于单机测试。
- flat: 网络是无 vlan tag 的网络。与位于同一网络通信,并且可以跨多个节点。每个 flat network 都会独占一个物理网卡
- vlan: 具有 802.1q tag 二层广播域的网络。同一 vlan 可以通信,不同 vlan 只能通过 router 通信。vlan 网络可以跨节点。
- vxlan:基于隧道技术的 overlay 网络。通过唯一的 segmentation ID(VNI)与其他 vxlan 网络区分。vxlan 中数据包会通过 VNI 封装成 UPD 包。因为二层包通过封装在三层进行传输,能够克服 vlan 和物理网络基础设施的限制。
- gre: 与 vxlan 类似的一种 overlay 网络。主要区别在于使用 IP 包而非 UDP 封装。
IPv4 或者 IPv6 地址段。instance 从 subnet 分配 IP。subnet 需要定义 IP 地址的范围和掩码。
port: 相当于虚拟交换机上的一个端口。port 定义了 MAC 和 IP,当 instance 的虚拟网卡绑到 port 时,port 会将 MAC 和 IP 分配给 虚拟网卡。
5.3 neutron 架构
- Neutron Server:对外提供 openstack 网络 API,接收请求,并调用 Plugin 处理请求。
- Plugin:处理 Neutron Server 发来的请求,调用 Agent 处理请求。
- Agent:处理 Plugin 的请求,负责在 network provider 实现各种网络功能。
- network provider:提供网络服务的虚拟或物理网络设备,例如 Bridge,Open vSwitch 或者其他支持 Neutron 的物理交换机。
5.4 neutron server
Core Plugin/Agent 负责管理核心实体:network, subnet 和 port。而对于更高级的网络服务,则由 Service Plugin/Agent 管理。
Neutron Server 包括两部分:
- 提供 API 服务
- 运行 Plugin 功能
5.5 neutron ml2
ML2 对二层网络进行抽象和建模,分为 type driver 和 mechansim driver
5.6 floating ip
租户网络连接到 Neutron router,通常将 router 作为默认网关。 当 router 接收到虚拟机的数据包,并将其转发到外网时:
- router 会修改包的源地址为自己的外网地址,这样确保数据包转发到外网,并能够从外网返回。
- router 修改返回的数据包,并转发给真正的虚拟机。
从外网直接访问 instance,可利用 floating IP。
- floating IP 提供静态 NAT 功能,建立外网 IP 与 instance 租户网络 IP 的一对一映射。
- floating IP 配置在 router 提供网关的外网 interface 上的,而非 instance 中。
- router 会根据通信的方向修改数据包的源或者目的地址。