0%

Glance架构

fd94a42d2cb78c98201af77e1d0b7b1e

glance-api

glance-api 是系统后台运行的服务进程。 对外提供 REST API,响应 image 查询、获取和存储的调用。

glance-api 不会真正处理请求。 如果操作是与 image metadata(元数据)相关,glance-api 会把请求转发给 glance-registry; 如果操作是与 image 自身存取相关,glance-api 会把请求转发给该 image 的 store backend。

glance-registry

glance-registry 是系统后台运行的服务进程。 负责处理和存取 image 的 metadata,例如 image 的大小和类型。

glance支持的镜像格式

0ac31c2c324d988dfbfce17f77d16cf9

Store backend

Glance 自己并不存储 image。 真正的 image 是存放在 backend 中的。 Glance 支持多种 backend,包括

  1. A directory on a local file system(这是默认配置)
  2. GridFS
  3. Ceph RBD
  4. Amazon S3
  5. Sheepdog
  6. OpenStack Block Storage (Cinder)
  7. OpenStack Object Storage (Swift)
  8. VMware ESX

具体使用哪种 backend,是在 /etc/glance/glance-api.conf中配置的。

1
2
3
glance image-list # 查看有哪些镜像。
glance image-create --name cirros --file /tmp/cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --progress # 上传镜像,--progress用来显示百分比
glance image-delete imageID

CLI

不同服务用的命令虽然不同,但这些命令使用方式却非常类似,可以举一反三。

1. 执行命令之前,需要设置环境变量

这些变量包含用户名、Project、密码等; 如果不设置,每次执行命令都必须设置相关的命令行参数。如:

1
$ . admin-openrc

2. 各个服务的命令都有增、删、改、查的操作

其格式是

1
2
3
4
CMD <obj>-create [parm1] [parm2]…
CMD <obj>-delete [parm]
CMD <obj>-update [parm1] [parm2]…
CMD <obj>-list CMD <obj>-show [parm]

例如 glance 管理的是 image,那么 CMD 就是 glance,obj 就是 image, 对应的命令就有:

1
2
3
4
5
glance image-create
glance image-delete
glance image-update
glance image-list
glance image-show

再比如 neutron 负责管理网络和子网,那么 CMD 就是 neutron,obj 就是 net 和 subnet,对应的命令就有:

网络相关操作

1
2
3
4
5
neutron net-create
neutron net-delete
neutron net-update
neutron net-list
neutron net –show

子网相关操作

1
2
3
4
5
neutron subnet-create
neutron subnet-delete
neutron subnet-update
neutron subnet-list
neutron subnet–show

有的命令 可以省略,比如 nova 下面的操作都是针对 instance:

1
2
3
nova boot
nova delete
nova list nova show

3. 每个对象都有 ID

delete,show 等操作都以 ID 为参数

4. 使用help查看命令的用法

例如:glance help

查看 glance image-update 的用法:

1
glance help image-update

Troubleshooting

日志位于 /etc/log/glance

glance主要有两个日志:glance_api.log 以及 glance_registry.log

  • glance-api:记录 REST API 调用情况
  • glance-registry:记录 Glance 服务处理请求的过程以及数据库操作

基本概念

Keystone的作用:

  1. 管理用户及其权限
  2. 维护OpenStack的endpoint
  3. Authentication(认证)和 Authorization(鉴权)

一个用户(user)可以有多个角色(role),user 可以是用户也可以是其他服务,user 可以属于多个 project,project 用于将 OpenStack 的资源进行隔离。

user 访问 OpenStack 时,Keyston 会对其进行验证,它使用的是密码这个时候,然后 Keystone 会给它发一个 Token 作为后续访问的 Credentials。

Credentials 包括:

  1. 用户名/密码
  2. Token
  3. API Key
  4. 其他高级方式

Token 是由数字和字母组成的字符串,User 成功 Authentication 后 Keystone 生成 Token 并分配给 User。

  1. Token 用做访问 Service 的 Credential
  2. Service 会通过 Keystone 验证 Token 的有效性
  3. Token 的有效期默认是 24 小时

每个service会提供若干个Endpoint,service通过endpoint暴露自己的API。

使用以下命令查看endpoint:

1
2
source devstack/openrc admin admin
openstack catalog list

使用以下命令查看角色:

1
openstack role list

service通过 /etc/nova/policy.json 对 role 进行访问控制。

Troubleshoot

OpenStack排查问题主要通过日志。

Keystone 主要有两个日志,一个是 keystone.log,一个是 keystone_access.log,在 /var/log/keystone 中。

(在newton版本中,我只看到了第一个日志。)

如果需要得到最详细的日志信息,可以在 /etc/keystone/keystone.conf 中打开 debug 选项。

虚拟化介绍

宿主机通过 Hypervisor 程序将自己的硬件资源虚拟化。

虚拟化类型

1 型虚拟化

2 型虚拟化

虚拟化原理

CPU虚拟化

一个虚拟机在宿主机中其实就是一个qemu-kvm进程,而每一个虚拟的CPU则是进程中的一个线程,CPU可以超配(overcommit)

内存虚拟化

kvm需要完成VA虚拟内存–>PA物理内存–>MA机器内存直接的地址转换。虚机OS不能直接访问实际机器内存,所以KVM要负责映射客户物理内存到实际机器内存的转换(PA–>MA)。内存也可以overcommit。

存储虚拟化

KVM的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。

Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型。

KVM将宿主机目录 /var/lib/libvirt/images 作为默认的 Storge Pool。KVM 是怎么知道要把 /var/lib/libvirt/images 这个目录当做默认 Storage Pool 的呢?KVM 所有可以使用的 Storage Pool 都定义在宿主机的 /etc/libvirt/storage 目录下,每一个 Pool 一个 xml 文件,默认有一个default.xml。

KVM 支持多种 Volume 格式

raw 是默认格式,即原始磁盘镜像格式,移植性好,性能好,但大小固定,不能节省磁盘空间。

qcow2 是推荐使用的格式。cow 表示 copy on write,能够节省磁盘空间,支持 AES 加密,支持 zlib 压缩,支持多快照,功能很多。

vmdk 是 VMWare 的虚拟磁盘格式,也就是说 VMWare 虚机可以直接在 KVM上 运行。这种是目录类型,还有LVM类型的Storge Pool,还有 iscsi,ceph

LVM 类型的 Storage Pool

不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上 VG 中的 LV 也可以作为虚拟磁盘分配给虚拟机使用。不过,LV 由于没有磁盘的 MBR 引导记录,不能作为虚拟机的启动盘,只能作为数据盘使用。

宿主机上的 VG 就是一个 Storage Pool,VG 中的 LV 就是 Volume。 LV 的优点是有较好的性能;不足的地方是管理和移动性方面不如镜像文件,而且不能通过网络远程使用。

网络虚拟化

虚拟机的虚拟网卡可以通过桥接的方式桥接到物理网卡。

Linux Bridge

Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。

参考:https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587933&idx=1&sn=958532f257d5b4ba575f297a0b66db25&chksm=8d3081c4ba4708d2199ddfaa151e93da2905eab86e963f194d1a7f90bb77535e5de5b7f83d52&scene=21#wechat_redirect

1
2
3
4
5
6
7
esben@all-in-one:~$ brctl show # 查看 Linux Bridge 的配置
bridge name bridge id STP enabled interfaces
virbr0 8000.525400d43ff6 yes virbr0-nic

virsh list --all # 查看所有的虚拟机
virsh start VM # 启动虚拟机
virsh domiflist VM1 # 查看虚拟机网卡信息

参考:https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587932&idx=1&sn=d8442e02c9d19114ed2a64b3375b07f6&chksm=8d3081c5ba4708d326b27352349a01c2f2175c0cc7d56944f40af2fc2c64ffdc9a5548f1b89e&scene=21#wechat_redirect

virbr0

virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。为连接其上的其他虚拟网卡提供 DHCP 服务。

virbr0 使用 dnsmasq 提供 DHCP 服务,可以在宿主机中查看该进程信息。

1
2
esben@all-in-one:~$ ps aux | grep dnsmasq
esben 6841 0.0 0.0 14224 1024 pts/22 R+ 19:14 0:00 grep --color=auto dnsmasq

VLAN

VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。概念上一定要分清。

通常交换机的端口有两种配置模式: Access 和 Trunk:

Access 口

这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。 Access 口都是直接与计算机网卡相连的。

Trunk 口

假设有两个交换机 A 和 B,连接 A 和 B 的口就是 Trunk 口,允许所有 VLAN 的数据通过。

eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备与之相连。 eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10。

这样的配置其效果就是: 宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10。

eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。

而 eth0 就是一个 Trunk 口。VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签。

eth0.10 的作用是:定义了 VLAN10
brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中

参考:https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587920&idx=1&sn=79332fb8fd8370b8d6b7d9728c383008&chksm=8d3081c9ba4708df9fcff17839e3c0fbb53a82298799c15ee45889f830a0087a46672505f115&scene=21#wechat_redirect

Linux Bridge + VLAN = 虚拟交换机

  1. 物理交换机存在多个 VLAN,每个 VLAN 拥有多个端口。 同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离。 所以交换机其包含两层功能:交换与隔离。
  2. Linux 的 VLAN 设备实现的是隔离功能,但没有交换功能。
  3. Linux Bridge 专门实现交换功能。
  4. Linux Bridge 加 VLAN 在功能层面完整模拟现实世界里的二层交换机。eth0 相当于虚拟交换机上的 trunk 口。

OpenStack 架构

openstack_kilo_conceptual_arch

第一个PyQt5程序

这一节我们学习一些基本的操作。

简单的例子

这是一个简单的例子,用来显示一个小窗口。但是我们可以在这个窗口上做很多东西,我们可以调整大小、最大化或者最小化它,这需要很多代码,不过已经有人编好了代码。由于窗口在大多数应用中都要重复使用,所以就没有必要再重复编码了。PyQt5是一个高级的工具,如果我们使用低级的工具包编码,下面的示例代码很容易就达到几百行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

In this example, we create a simple
window in PyQt5.

author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':

app = QApplication(sys.argv)

w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Simple')
w.show()

sys.exit(app.exec_())

上面的代码会在屏幕上显示一个小窗口。

1
2
import sys
from PyQt5.QtWidgets import QApplication, QWidget

这里我们进行了必要的导入。基本部件在 PyQt5.QtWidgets 模块中。

注:本教程翻译自http://zetcode.com/gui/pyqt5/

关于PyQT5

PyQT5是来自Digia的Python和QT5应用程序框架绑定的集合。它可用于Python2和Python3。本教程使用Python3。QT库是最强大的GUI库。PyQt5的官方网站是http://www.riverbankcomputing.co.uk/news。PyQt5由Riverbank Computing公司开发。

PyQt5是被作为Python的一系列模块使用的。它包括超过620个类以及6000个函数和方法。它是一个跨平台的工具包,可以运行在所有主流的操作系统上,包括Unix,Windows以及Mac OS。PyQt5具有双重许可。开发者可以选择GPL许可或者商业许可。

PyQt5的类分成了如下几个模块:

  • QtCore

QtCore模块包含除了GUI以外的核心功能。可以用来处理时间、文件以及目录、各种各样的数据类型、流、URL、MIME(Multipurpose Internet Mail Extensions) type、线程或者进程。

  • QtGui

QtGui包含的类用于窗口化的系统集成、事件处理、2D图形、基本图片、字体以及文本。

  • QtWidgets

QtWidgets模块包含的类提供了一组UI元素,可以创建经典的桌面风格用户界面。

  • QtMultimedia

QtMultimedia模块包含处理多媒体内容和连接相机及无线电功能的API类。

  • QtBluetooth

QtBluetooth模块包含的类可以扫描蓝牙设备并与之连接和交互。

  • QtNetwork

QtNetwork模块包含的类用来进行网络编程。这些类使得TCP/IP、UDP客户端和服务端的编程更加容易和便捷。

  • QtPositioning

QtPositioning包含的类使用多种可获得的资源来确定位置,包括卫星、WiFi或文本文件。

  • Enginio

Enginio模块实现了客户端库,用来管理应用程序托管QT云服务。

  • QtWebSockets

QtWebSockets模块中的类实现了WebSocket协议。

  • QtWebKit

QtWebKit包含基于WebKit2库实现的浏览器的类。

  • QtWebKitWidgets

QtWebKitWidgets包含基于WebKit1实现的浏览器的类,用于QtWidgets基础应用程序。

  • QtXml

QtXml包含解析XML文件的类。这个模块提供SAX和DOM API的实现。

  • QtSvg

QtSvg包含显示SVG文件内容的类。Scalable Vector Graphics (SVG) 是一种语言,用XML描述二维图形和图形应用程序

  • QtSql

QtSql包含有关数据库的类。

  • QtTest

QtTest包含的函数可以对PyQt5应用程序进行单元测试。

PyQt4和PyQt5的区别

PyQt5并不向下兼容PyQt4,PyQt5有几个重大变化。

但是将旧代码迁移到新版本并不困难,不同的地方如下:

  • Python模块已经重写。一些模块已经删除(QtScript),另外一些拆分成了子模块(QtGui,QtWebKit)。
  • 引入了一些新的模块,包括 QtBluetooth,QtPositioning,以及Enginio。
  • PyQt5 只支持新风格的信号和槽处理机制。对 SIGNAL() 和 SLOT() 的调用不再支持。
  • PyQt5不再支持任何 Qt v5.0 中废弃或过时的Qt API。

Python

Python 是一个通用的动态的面向对象编程语言。Python语言的设计目的强调程序员的生产力和代码的可读性。Python 最初是由 Guido van Rossum 开发的。第一个版本发布于1991年。Python 结合了 ABC, Haskell, Java, Lisp, Icon 以及 Perl 等语言的优点。Python 是一种高级的、通用的、多平台的解释型语言,它是简单的。它最显著的特性是不再使用分号或者括号。它使用缩进代替。目前主要有两个 Python 分支:Python2.x 和 Python 3.x。Python 3.x 与之前的 Python 版本不兼容。它纠正了语言的一些设计缺陷,并使得语言更加简洁。Python 由世界各地的志愿者维护。Python 是一个开源的软件,对于想要学习编程的人来说,Python 是一个理想的选择。

本教程使用 Python 3.x 版本。

Python 支持多种编程风格,它并不强迫程序员某一个特定的模式。Python支持面向对象和面向过程编程,还支持有限的函数式编程。

Python 的官方网站是 http://python.org/

Perl、Python 和 Ruby 脚本语言被广泛使用。他们有许多相似的地方并且也是竞争对手。

这一章是对 PyQt5 的介绍。