开始学习openstack源码,源码文件多,分支不少。按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程。从这一条线入手,能够贯穿openstack核心服务。写博文仅做学习笔记整理,多为借鉴网上大牛的分析。因为涉及到的知识点很多,所以分期来比较写合适。
openstack有3中创建虚拟机的方法,分别是:命令行创建,dashboard界面创建和api接口创建。
前两种方式最终还是调用openstack的Restful API去工作。
openstack创建虚拟机流程如下:
通过命令行查看镜像列表来调试整个过程:
1 -----> START with options : [ u '--debug' , u 'image' , u 'list' ]
2 ###将命令行转化成url
3 -----> command : image list -> openstackclient . image . v2 . image . ListImage
4 ###发送请求
5 -----> Starting new HTTP connection ( 1 ): controller
6 http : //controller:35357 "GET /v3 HTTP/1.1" 200 250
##没有token,所以先请求token 7 ----->Making authentication request to http://controller:35357/v3/auth/tokens
8 http : //controller:35357 "POST /v3/auth/tokens HTTP/1.1" 201 5229
9 ##返回的token信息。
10
11 { "token" :
12 {
13 "is_domain" : false ,
14 "methods" : [ "password" ],
15 "roles" : [{
16 "id" : "39a6815cad0e4e7c879de0092076ff3f" ,
17 "name" : "admin"
18 }],
19 "expires_at" : "2017-10-27T09:11:56.000000Z" ,
20 "project" : {
21 "domain" : {
22 "id" : "default" ,
23 "name" : "Default"
24 },
25 "id" : "ffd1a0df301045f1b20eef7d9e126dbf" ,
26 "name" : "admin"
27 },
28 "catalog" : [{
29 "endpoints" : [{
30 "url" : "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf" ,
31 "interface" : "internal" ,
32 "region" : "RegionOne" ,
33 "region_id" : "RegionOne" ,
34 "id" : "0ee0b857383a44d98970cce3fd0cdfd2"
35 },
36 {
37 "url" : "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf" ,
38 "interface" : "public" ,
39 "region" : "RegionOne" ,
40 "region_id" : "RegionOne" ,
41 "id" : "8c0c6d20c6c1468387282b9a4c5fd444"
42 },
43 {
44 "url" : "http://controller:8080/v1" ,
45 "interface" : "admin" ,
46 "region" : "RegionOne" ,
47 "region_id" : "RegionOne" ,
48 "id" : "eb1f0c50aa1e45c2968da7a59a3054e0"
49 }],
50
##返回信息中获得token,并获得image服务的入口。 ##再次请求image服务51 ----->REQ: curl -g -i -X GET "http://controller:9292/v2/images?marker=None" -H "User-Agent: osc-lib/1.3.0 keystoneauth1/2.18.0 python-requests/2.12.4 CPython/2.7.12" -H "X-Auth-Token: {SHA1}7b4a526303024850fd85c54c830599ad94641d7a"
52 -----> Starting new HTTP connection ( 1 ): controller
53
54 ##获得返回信息,其中有id,name,statues三项,能够显示出来。
55 RESP : [ 200 ] Content - Length : 653 Content - Type : application / json ; charset = UTF - 8 X - Openstack - Request - Id : req - 5bae1adb - 0638 - 438a - 93f2 - e2e4cfc6664c Date : Fri , 27 Oct 2017 08 : 11 : 57 GMT Connection : keep - alive
56 ------> RESP BODY :
57 {
58 "images" : [{
59 "status" : "active" ,
60 "name" : "cirros" ,
61 "tags" : [],
62 "container_format" : "bare" ,
63 "created_at" : "2017-07-11T11:43:18Z" ,
64 "size" : 13267968 ,
65 "disk_format" : "qcow2" ,
66 "updated_at" : "2017-07-11T11:43:18Z" ,
67 "visibility" : "public" ,
68 "self" : "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f" ,
69 "min_disk" : 0 ,
70 "protected" : false ,
71 "id" : "d22d0398-8b12-406c-9ebb-285257c6d31f" ,
72 "file" : "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f/file" ,
73 "checksum" : "f8ab98ff5e73ebab884d80c9dc9c7290" ,
74 "owner" : "ffd1a0df301045f1b20eef7d9e126dbf" ,
75 "virtual_size" : null ,
76 "min_ram" : 0 ,
77 "schema" : "/v2/schemas/image"
78 }],
79 "schema" : "/v2/schemas/images" ,
80 "first" : "/v2/images" }
81 GET call to None for http : //controller:9292/v2/images?marker=d22d0398-8b12-406c-9ebb-285257c6d31f used request id req-553123bd-6373-4306-9e72-fff4737b49b4
82 clean_up ListImage :
83 END return value : 0
84 +--------------------------------------+--------+--------+
85 | ID | Name | Status |
86 +--------------------------------------+--------+--------+
87 | d22d0398 - 8b12 - 406c - 9ebb - 285257c6d31f | cirros | active |
88 +--------------------------------------+--------+--------+
在这个过程中能够清晰看出,请求都是通过URL的方式发送的相应服务,这就是一个基于RESTFUL 的架构。
总结openstack image list 命令生效的过程:
在本地将openstack image list命令转化成URL。
以restful的方式请求image服务,但没有认证所以不成功。
以restful的方式请求keystone获取token。
通过keystone返回的服务列表获取image的服务入口。
以restful的方式请求image服务,获取list信息。
Restful API:
RESTFUL即远程调用函数接口的设计风格,对http协议包装,使其能够满足REST方法,即restful api。
远程:使用http协议,用类似网站请求的流程。
调用函数接口:通过不同的URL请求地址调用不同的函数接口(API)。
设计风格:不同于本地函数调用,所有的API都可以看做是资源,使用URL调用。
例如请求openstack token的过程,一个标准的restful api工作方式。
该命令是一条URL,http://192.168.252.134:5000是keystone服务的入口 /v2.0/tokens是对应的keystone的restful api的接口。
返回的结果部分如下
通过一条URL调用了openstack环境中的函数,操作通过认证,返回下一步要使用的认证token。
熟悉openstack应该了解,keystone认证成功之后除了返回token之外,还会返回所有服务的组件接口,及restful接口。
REST
REST(Representational State Transfer 表现层状态转移)
是一种软件架构风格、设计风格,而不是标准。主要用于客户端和服务端的API
交互,它的优势在于更简洁、清晰、可读性强。
RESTFUL
满足REST约束条件和原则的应用程序或设计就是Restful,即Rest风格的应用
RESRFUL 特征
一、请求方式:
REST构建于HTTP协议之上,遵循并扩展和规范了传统HTTP协议中的标准方法,
以下是RESTful API定义的标准方法:
GET
查询资源
POST
增加资源
PUT
更新资源
HEAD
验证,包括用户身份的验证和资源的验证
DELETE
删除资源
二、资源化:
REST要求URL的格式遵守统一的规范,所有资源都具有唯一的ID。具体到OpenStack中,每个资源都有一个UUID,作为全局唯一的标识。
我们用instances来表示虚拟机的集合,每一个instance(虚拟机实例)具有全局唯一的UUID
在以上的过程中能够看到,restful和URL有着千丝万缕的联系。最后简单总结:
Restful 设计模式 和 网站设计模式的对比:
不同点:数据格式
网站数据传输格式有多种,常见为text/html 而restful为json格式。
相同点:架构设计
都需要相同的架构,即服务器程序(appach,nigix)+ WSGI(接口)+ 应用程序。
额外补充:
与Restful的设计风格不同的其他设计风格:
1.SOA : 面向服务的架构 【组件模型】【将服务通过定义良好的接口和契约联系起来】
2.SOAP : 简单对象访问协议 一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范
3.RPC : 远程过程调用协议 从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(服务)并得到返回的结果【调用本地函数/方法一样去调用远程的函数/方法】
4.微服务: A 独立的进程的方式存在,互相之间并无影响 B 接口方式更加通用化 C 倾向于分布式去中心化的部署方式,在互联网业务场景下更适合
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理