What is Openstack?
OpenStack是一個開源的雲計算管理平臺項目,它允許企業或服務提供者建立、運行自己的雲計算和存儲設施。OpenStack支持幾乎所有類型的雲環境,項目目標是提供實施簡單、可大規模擴展、豐富、標準統一的雲計算管理平臺。OpenStack通過各種互補的服務提供了基礎設施即服務(IaaS)的解決方案,每個服務提供API以進行集成。
Openstack可以爲我們構建私有云提供的可靠的Iaas雲解決方案,它讓我門的企業可以自行構建自己的私有云環境,同時雲服務提供商也可以利用Openstack去構建公有云,例如青雲公司。
1.1 Openstack的組件關係圖
1.2 Openstack的組件
Openstack之keystone:
Keystone爲所有的OpenStack組件提供認證和訪問策略服務,它依賴自身REST(基於Identity API)系統進行工作,主要對(但不限於)Swift、Glance、Nova等進行認證與授權。事實上,授權通過對動作消息來源者請求的合法性進行鑑定
Keystone採用兩種授權方式,一種基於用戶名/密碼,另一種基於令牌(Token)。除此之外,Keystone提供以下三種服務:
a.令牌服務:含有授權用戶的授權信息
b.目錄服務:含有用戶合法操作的可用服務列表
c.策略服務:利用Keystone具體指定用戶或羣組某些訪問權限
Openstack之glance:
Glance提供REST API來支持以下鏡像操作:
查詢
註冊
上傳
獲取
刪除
訪問權限管理
Glance有兩個版本的REST API V1 和 V2,兩者之間還是有蠻大的不同:
(1). V1只提供了基本的image和member操作功能:鏡像創建、刪除、下載、列表、詳細信息查詢、更新,以及鏡像tenant成員的創建、刪除和列表。
(2). V2除了支持V1的所有功能外,主要是增加了如下功能:
鏡像 location 的添加、刪除和修改等操作
metadata namespace 操作
image tag 操作
(3).V1 和V2對 image store 的支持是相同的。
實現差異:
V1的實現上,有glance-api和glance-registry兩個WSGI 服務,都提供REST API,只不過glance-API的REST API對外使用,glance-registry的API只由glance-api使用。
而 V2在實現上,把 glance-registry 的功能合併到了 glance-api 中,減少了一箇中間環節。
Openstack之comute:
Openstack之neutron:
Openstack之vm:
Openstack之cinder:
它是一個資源管理系統,負責向虛擬機提供持續塊存儲資源。
把不同的後端存儲進行封裝,向外提供統一的api
使用插件方式,結合不同後端存儲驅動提供塊存儲服務。主要核心對卷管理,允許對卷,卷的類型,卷的快照進行處理。
三個主要組成部分
–cinder-api 組件負責向外提供Cinder REST API
–cinder-scheduler 組件負責分配存儲資源
–cinder-volume 組件負責封裝driver,不同的driver負責控制不同的後端存儲
組件之間的RPC靠消息隊列(Queue)實現
Cinder的開發工作主要集中在scheduler和driver,以便提供更多的調度算法、更多的功能、以及指出更多的後端存儲
Volume元數據和狀態保存在Database中
1.3 Openstack的模塊:
Compute:代碼名Npva,管理VM的整個生命週期,主要職責包括啓動、調度VMs;
Networking:代碼名Netron,爲openstack提供NCaaS的功能;插件化設計,支持衆多流行的網絡管理插件;
Object Storage:代碼名swift;分佈式存儲,基於RESTful的API實現非結構化數據對象的存儲及檢索;
Block Stroage:代碼名爲Cinder,爲VMs提供持久的塊存儲能力;
Identity: 代碼爲Keystone;爲Openstack中的所有服務提供了認證、授權以及端點編錄目錄;
Image: 代碼名Glance,用於存儲和檢索磁盤映像文件;
Dashboard: 代碼名爲Horizon,WebGUI;
Telemetry: 代碼名爲Ceilometer,用於實現監控和計量服務的實現;
Orachestration: 代碼名爲Heat,用於多組件聯動;
Database:代碼爲Trove,提供DBaaS服務的實現;
Data processing:代碼爲sahara,用於在OpenStack中實現Hadoop的管理;
主機系統Centos6.7:
Control Node: 172.16.200.6 node1.com
Compute Node: 172.16.200.7 node2.com
Object Storage Node: 172.16.200.8 node3.com
Swift是一個分佈式存儲系統,其架構比較複雜,這裏採用其最簡單的模型來演示其使用,即基於一個物理節點來實現其所有功能。
一、安裝配置Keystone
OpenStack的Identify服務(即Keystone)有兩個主要功能
用戶管理:實現用戶認證及授權;
服務目錄(Service catalog):所有可用服務的信息庫,包含所有可用服務及其API endpoint路徑;
1、安裝Keystone
1.1、安裝並初始化MySQL服務器
# yum -y install mysql mysql-server # service mysqld start # mysqladmin -uroot -p password '[YOUR_ROOT_PASSWORD]' # chkconfig mysqld on
1.2、安裝配置Identity服務
# yum install openstack-utils openstack-keystone python-keystoneclient
創建keystone數據庫,其默認會創建一個keystone用戶以訪問此同名數據庫,密碼可以使用--pass選項指定。
# openstack-db --init --service keystone --pass keystone Please enter the password for the 'root' MySQL user: Verified connectivity to MySQL. Creating 'keystone' database. Asking openstack-keystone to sync the database. Complete!
如果本機尚未安裝mysql-server,此腳本會自動安裝之,並且會提醒用戶爲root用戶設定密碼。
如果不想使用默認的keystone用戶訪問其數據,也可以使用下面的命令爲keystone服務創建訪問數據庫的用戶。
# mysql -uroot -p mysql> GRANT ALL ON keystone.* TO 'KS_USER'@'%' IDENTIFIED BY '[YOUR_KEYSTONEDB_PASSWORD]'; mysql> GRANT ALL ON keystone.* TO 'KS_USER'@'localhost' IDENTIFIED BY '[YOUR_KEYSTONEDB_PASSWORD]';
1.3、編輯keystone的主配置文件,使得其使用MySQL做爲數據存儲池,並配置其使用正確的參數。
# vim /etc/keystone/keystone.conf
在[sql]段中,確保與mysql相關的內容類似如下,注意其中的密碼爲keystone用戶訪問MySQL服務器所使用的密碼:
connection = mysql://keystone:keystone@localhost/keystone
上面的參數指定連接時,其語法格式爲“mysql://[user]:[pass]@[primary IP]/[db name]”。
1.4、配置keystone的管理token
爲了使用admin用戶管理keystone,可以通過配置keystone的客戶端使用SERVICE_TOKEN和SERVICE_ENDPOINT環境變量來連接至Keystone。
# export SERVICE_TOKEN=$(openssl rand -hex 10) # export SERVICE_ENDPOINT=http://172.16.200.6:35357/v2.0 # echo $SERVICE_TOKEN > ~/ks_admin_token # openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token 'YOUR_ADMIN_TOKEN'
其中的‘YOUR_ADMIN_TOKEN’爲一個字符串,建議使用一串隨機數據,這可以使用openssl命令生成。比如,上面的使用可以使用如下形式:
# openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token $SERVICE_TOKEN
接着啓動keystone服務:
# service openstack-keystone start # chkconfig openstack-keystone on
查看進程啓動的相關信息:
# ps auxf | grep -i keystone-all root 3660 0.0 0.1 103236 872 pts/0 S+ 16:47 0:00 \_ grep -i keystone-all keystone 3612 0.0 7.0 270100 34984 ? S 16:35 0:00 /usr/bin/python /usr/bin/keystone-all --config-file /etc/keystone/keystone.conf
檢查日誌文件中有無錯誤提示:
# grep ERROR /var/log/keystone/keystone.log
1.5、初始化新生成的keystone數據庫
以管理員的身份初始化keystone數據庫
# keystone-manage db_sync
1.6、設定Keystone爲API endpoint
在Openstack中,服務(service)指的是計算(nova)、對象存儲(Swift)或映像(image)等,而Horizon(web dashboard)依賴於Keystone registry中的API endpoint(某網絡資源或服務的訪問路徑,通常表現爲URL)來訪問這些服務,包括Keystone自身。因此,這裏需要將Keystone服務自身及訪問路徑(API endpoint)先加入到Keystone的registry中。
# keystone service-create --name=keystone --type=identity --description="Keystone Identity Service" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Keystone Identity Service | | id | 13f56808ea05400f9ae05d72684eeefd | | name | keystone | | type | identity | +-------------+----------------------------------+
爲上面新建的service添加endpoint。注意,其中的service_id的內容爲上面service-create命令創建的service的id。
# keystone endpoint-create \ --service_id 13f56808ea05400f9ae05d72684eeefd \ --publicurl 'http://172.16.200.6:5000/v2.0' \ --adminurl 'http://172.16.200.6:35357/v2.0' \ --internalurl 'http://172.16.200.6:5000/v2.0' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://172.16.200.6:35357/v2.0 | | id | eafd729bb70b4cd7b02ca2a728ec145e | | internalurl | http://172.16.200.6:5000/v2.0 | | publicurl | http://172.16.200.6:5000/v2.0 | | region | regionOne | | service_id | 13f56808ea05400f9ae05d72684eeefd | +-------------+----------------------------------+
如果本機啓用了iptables,還需要確保對tcp的5000和35357端口的請求能正常通過。例如,爲iptables添加如下規則,記得測試完成後要保存規則至配置文件中。
# iptables -A INPUT -p tcp -m multiport --dports 5000,35357 -j ACCEPT
2. 創建user、role及tenant
tenant是OpenStack的Keystone中的一個重要的術語,它相當於一個特定項目(project)或一個特定的組織(origaniztion)等,它實現了資源或identity對象的隔離。用戶(user)在認證通過後即能訪問資源,其通常會被直接關聯至某tenant,因此看起來就像用戶是包含於tenant中的。角色(role)是權限的窗口,其可用於快速爲一組用戶完成相同的授權操作。
keystone可通過兩種方式完成用戶認證,一種爲token認證,一種爲credential(如用戶名和密碼等信息)認證。前面的配置中,爲Keystone的管理用戶admin提供了token的認證方式,並以之完成了如前所述的服務創建等工作。事實上,Keystone的重要功能之一便是提供用戶認證,但爲了便於認證信息的管理,其通常基於credential的方式進行。風格統一起見,這裏讓admin用戶基於後一種認證方式完成認證並執行管理工作,事實上,這也是Keystone服務配置的基本要求。
2.1 keystone子命令
keystone有許多子命令,分別用於實現keystone的各種對象管理,如用戶創建、刪除等。獲取其幫助信息及子命令列表,可以使用-h選項,獲取某子命令的使用幫助,則可以使用如下格式:
# keystone help SUB_COMMAND
例如,要獲取創建租客的使用tenant-create的使用幫助,可以使用如下命令:
# keystone help tenant-create usage: keystone tenant-create --name <tenant-name> [--description <tenant-description>] [--enabled <true|false>] Create new tenant Optional arguments: --name <tenant-name> New tenant name (must be unique) --description <tenant-description> Description of new tenant (default is none) --enabled <true|false> Initial tenant enabled status (default true)
2.2 admin tenant
2.2.1 創建用於keystone管理的tenant、角色和用戶
創建管理tenant,其名稱爲admin,描述信息爲“Admin Tenant”。
# keystone tenant-create --name admin --description "Admin Tenant" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Admin Tenant | | enabled | True | | id | b0b356e2c68f4ab29a1556a01aad022d | | name | admin | +-------------+----------------------------------+
創建admin角色。
# keystone role-create --name admin +----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | fc99371ca2194fdbb35ee46dcec06690 | | name | admin | +----------+----------------------------------+
創建admin用戶,並將其直接關聯至前面創建的Admin Tenant。事實上,這裏的關聯操作也可以不執行,而在爲admin賦予角色時進行,如後面所示。
# keystone user-create --name admin --tenant-id b0b356e2c68f4ab29a1556a01aad022d --pass admin --email [email protected] +----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | [email protected] | | enabled | True | | id | fd97c9eba1974010a147e95d441d9c3a | | name | admin | | password | $6$rounds=40000$Mnul0elEayuu8SrN$YCVt/nA.Maikzmp3mbOGWAIQk9fM4q7T8VvKT0BYNK7YE/8Y86gtMJL5jYj2LlN5PnhXhK0AS.E7.XytBY/731 | | tenantId | b0b356e2c68f4ab29a1556a01aad022d | +----------+-------------------------------------------------------------------------------------------------------------------------+
而後,將admin角色賦予admin用戶,正常執行時,此命令沒有信息輸出。。
# keystone user-role-add --user-id fd97c9eba1974010a147e95d441d9c3a --role-id fc99371ca2194fdbb35ee46dcec06690 --tenant-id b0b356e2c68f4ab29a1556a01aad022d
2.2.2 爲admin用戶啓用基於credential的認證機制
定義如下環境變量,啓用基於credential的用戶認證。爲了使用方便,下面的環境變量導出命令可以保存至一個配置文件中,如~/.keystonerc_admin。
# export OS_USERNAME=admin # export OS_TENANT_NAME=admin # export OS_PASSWORD=admin # export OS_AUTH_URL=http://172.16.200.6:35357/v2.0/ # export PS1='[\u@\h \W(keystone_admin)]\$ '
而後註銷基於token認證時創建的環境變量從而禁止admin用戶使用token認證。
# unset SERVICE_TOKEN # unset SERVICE_ENDPOINT
驗正新的認證機制是否已經生效。
[root@node1 ~(keystone_admin)]# keystone user-list +----------------------------------+-------+---------+------------------+ | id | name | enabled | email | +----------------------------------+-------+---------+------------------+ | fd97c9eba1974010a147e95d441d9c3a | admin | True | [email protected] | +----------------------------------+-------+---------+------------------+
2.3 服務tenant
上面創建的admin用戶用於Keystone的管理工作,而OpenStack的各服務(如swift等)通常需要定義在一個服務tenant中,而且各服務也都需要一個具有管理權限的用戶。
# keystone tenant-create --name service --description "Service Tenant" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Service Tenant | | enabled | True | | id | 11e27e27f0444ef78efe00ec79b4f93c | | name | service | +-------------+----------------------------------+
爲服務Tenant創建用戶nova,以用於後文中的nova服務,密碼同用戶名。
# keystone user-create --tenant-id 11e27e27f0444ef78efe00ec79b4f93c --name nova --pass nova --email [email protected] +----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | [email protected] | | enabled | True | | id | 2484cca84c084fba9e4414a7c1062364 | | name | nova | | password | $6$rounds=40000$U/TWmhtK7wb1izwb$T5/hbOiQIvd9viMokN2VybBB74PlpdsMXKayw6OFF0g4LiCsGrZUKnVRStd8tzDCiBw2R/QCt3t3RYdDRBUlh0 | | tenantId | 11e27e27f0444ef78efe00ec79b4f93c | +----------+-------------------------------------------------------------------------------------------------------------------------+
而後,把admin角色賦予nova用戶,正常執行時,此命令沒有信息輸出。
# keystone user-role-add --tenant-id 11e27e27f0444ef78efe00ec79b4f93c --user-id 2484cca84c084fba9e4414a7c1062364 --role-id fc99371ca2194fdbb35ee46dcec06690
爲服務Tenant創建用戶swift,密碼同用戶名。後面配置swift服務時將用到此用戶。
# keystone user-create --tenant-id 11e27e27f0444ef78efe00ec79b4f93c --name swift --pass swift --email [email protected] +----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | [email protected] | | enabled | True | | id | 4808aeb6da134942b59c9912f9bc3d0e | | name | swift | | password | $6$rounds=40000$ew7m2ahbFHX7mgQ1$fobOBaQcEn5K2BYKJACsSJgNqftrfhLF4uxpyS5Wjf1Ac3PcgSFIvJbcWf2fTewB3fD04//B/fDQ28mDRkV/l0 | | tenantId | 11e27e27f0444ef78efe00ec79b4f93c | +----------+-------------------------------------------------------------------------------------------------------------------------+
把admin角色賦予swift用戶,正常執行時,此命令沒有信息輸出。
# keystone user-role-add --tenant-id 11e27e27f0444ef78efe00ec79b4f93c --user-id 4808aeb6da134942b59c9912f9bc3d0e --role-id fc99371ca2194fdbb35ee46dcec06690
還可以繼續爲服務tenant創建glance等用戶。
二、Openstack Image Service
Openstack Image服務可用於發現、註冊及檢索虛擬機映像(image),它提供了一個RESTful的API,能夠讓用戶查詢VM映像的元數據及通過HTTP請求獲取映像,並可以讓python程序員通過客戶端類在python代碼中完成類似的所有任務。VM映像文件可以存儲在各類存儲中,如普通的文件系統、對象存儲系統(如Openstack Object Storage)、S3存儲及HTTP(僅作爲獲取映像文件之用,而不能寫於此中創建映像文件)等。
2.1 安裝配置Glance服務
2.1.1 安裝相關軟件包
# yum -y install openstack-glance
初始化glance數據庫,同時創建其服務同名的用戶,併爲其指定密碼,這裏選擇使用與服務名同名的密碼glance。
# openstack-db --init --service glance --password glance
如果不想使用默認的glance用戶訪問其數據,也可以使用下面的命令爲glance創建數據庫及相關的用戶。
# mysql -uroot -p mysql> CREATE DATABASE glance; mysql> GRANT ALL ON glance.* TO 'GLANCE_USER'@'%' IDENTIFIED BY 'GLANCE_PASS'; mysql> GRANT ALL ON glance.* TO 'GLANCE_USER'@'localhost' IDENTIFIED BY 'GLANCE_PASS'; mysql> FLUSH PRIVILEGES;
2.1.2 創建glance管理用戶
提示:以keystone管理員的身份完成如下操作。
首先,創建用戶glance,密碼同用戶名。安全起見,實際使用中,用戶名和密碼都應該按需修改。
# keystone user-create --name glance --pass glance --email [email protected] +----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | [email protected] | | enabled | True | | id | b52fcf90cc15422fbbee66cfabaa49a4 | | name | glance | | password | $6$rounds=40000$NW8NIAuNgAMQTphr$8SNrvpr8EfBHIR78SgmIViLJBriSg8gszafS46x36h5C10QrxzDoV4MvU3X4aNlc7Kt6L.e2K/CeSyGZmf8zm0 | | tenantId | | +----------+-------------------------------------------------------------------------------------------------------------------------+
接着將用戶加入前面創建的service tenant中,並將角色admin賦予glance用戶。
# keystone user-role-add --tenant-id 11e27e27f0444ef78efe00ec79b4f93c --user-id b52fcf90cc15422fbbee66cfabaa49a4 --role-id fc99371ca2194fdbb35ee46dcec06690
2.1.3 配置glance-api
編輯/etc/glance/glance-api.conf,配置glance相關屬性。
glance-api服務實現了第一版(v1)和第二版(v2)的OpenStack Images API,如果想啓用它們,請啓用如下兩項。
enable_v1_api = True enable_v2_api = True
將glance-api.conf文件最後兩段的內容按需修改爲類似如下的內容。這些設定也可以使用“openstack-config”的“--set”選項來逐個修改。
[keystone_authtoken] auth_host = 172.16.200.6 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = glance [paste_deploy] config_file = /etc/glance/glance-api-paste.ini flavor=keystone
並且要確保sql_connection參數的值配置使用了正確的用戶名和密碼,本示例中如下所示:
sql_connection = mysql://glance:glance@localhost/glance
此外,glance默認使用“File”做爲其存儲類型,如果可使用後文安裝配置的swift服務來替代這裏的“File”類型,還需要修改類似如下選項的值爲實際需要的值。這裏先採用默認的File類型。
default_store = swift swift_store_auth_address = http://172.16.200.6:5000/v2.0/ swift_store_user = service:swift # servcie_name:user_name swift_store_key = a86850deb2742ec3cb41518e26aa2d89
2.1.4 配置glance-registry
修改/etc/glance/glance-registry.conf最後兩段的內容類似如下所示:
[keystone_authtoken] auth_host = 172.16.200.6 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = glance [paste_deploy] config_file = /etc/glance/glance-registry-paste.ini flavor=keystone
確保glance-registry-paste.ini文件中啓用瞭如下行:
[pipeline:glance-registry-keystone] pipeline = authtoken context registryapp
2.1.5 啓動服務
啓動glance-api服務:
# service openstack-glance-api start # chkconfig openstack-glance-api on
啓動glance-registry服務:
# service openstack-glance-registry start # chkconfig openstack-glance-registry on
2.1.6 填充或遷移數據庫:
# glance-manage db_sync
重啓glance-api及glance-registry服務:
# service openstack-glance-registry restart # service openstack-glance-api restart
2.1.7 在keystone註冊glance服務
# keystone service-create --name=glance --type=image --description="Glance Image Service" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Glance Image Service | | id | cb9a0db4fae44f1ba250034153f68906 | | name | glance | | type | image | +-------------+----------------------------------+
# keystone endpoint-create --service_id cb9a0db4fae44f1ba250034153f68906 \ --publicurl http://172.16.200.6:9292 \ --adminurl http://172.16.200.6:9292 \ --internalurl http://172.16.200.6:9292
2.1.8 測試
默認情況下,glance中沒有任何映像文件,因此下面的命令將沒有任何返回值。如果其不能返回爲空,原因可能是配置有問題,請自行檢查前面的配置過程。
# glance image-list
2.2 Image服務管理
2.2.1 glance image-create命令
glance image-create命令用於添加新的虛擬機映像至glance中,glance image-update命令用於修改已經完成更新的映像的屬性信息。
image-create命令至少要接受三個參數:--name、--container_format及--disk_format。其中--disk_format用於指明磁盤映像文件的格式,包括raw、qcow2、vhd、vmdk、iso、vdi、aki(amazon kernel image)、ari(amazon ramdisk image)及ami(amazon machine image)等。--container_format用於標明映像文件是否包含了虛擬機的元數據信息,然而,目前Compute服務並未使用此信息,因此,在不確定的情況可以將其指定爲bare,而合用的格式主要有bare(沒有container或元數據信息)、ovf、aki、ari或ami幾種。
2.2.2 映像元數據
glance image-create或glance image-update命令的--property key=value參數能夠爲映像文件附加元數據信息。而常用的屬性主要有:
architecture:hypervisor必須支持的CPU架構,如x86_64、arm等;
hypervisor_type:hypervisor類型,其能夠使用的值包括xen、qemu、kvm、lxc、uml、vmware、hyperv及powervm;
vm_mode:定義虛擬機模式,即應用於虛擬機的host/guest ABI;例如hvm、xen、uml、exe等;
xenAPI還有其專用的兩個屬性可以定義:
auto_disk_config:布爾型屬性值,true表示在虛擬機實例啓動前磁盤的根分區將被自動調整;
os_type:image中安裝的操作系統類型,如linux、windows等,XenAPI能夠根據此屬性值來執行不同的操作,如爲windows創建fat32格式的交換分區、限制其主機名稱少於16個字符等;
VMware API也有如下三個專用屬性可以定義:
vmware_adaptertype:定義hypervisor使用的虛擬SCSI或IDE接口類型,其有效值爲lsiLogic、busLogic及ide;
vmware_ostype:VMware GuestID,用於描述映像文件中的操作系統類型;vmware所支持的類型較多,可以參照thinkvirt.com獲取詳細信息;默認值爲otherGuest;
vmware_image_version:目前未使用,默認值爲1;
2.2.3 獲取虛擬機映像
2.2.3.1 CirrOS(test)映像
由Scott Moser維護的一系列用於測試目的的微型虛擬機映像,登錄名爲cirros,下載地址爲https://launchpad.net/cirros/+download。在QEMU或KVM中測試時,官方建議使用QCOW2格式的映像文件。
2.2.3.2 Ubuntu映像
Canonical官方提供了基於Ubuntu的系列映像,登錄名爲ubuntu,下載地址爲http://uec-images.ubuntu.com/。在QEMU或KVM中部署時,建議使用QCOW2格式的映像文件。
2.2.3.3 Fedora映像
Fedora官方提供了預製的Fedora JEOS映像,下載地址爲http://berrange.fedorapeople.org/images,目前最新的是爲x86_64平臺提供爲的QCOW2格式的映像f17-x86_64-openstack-sda.qcow2。
2.2.3.4 OpenSUSE和SLES11映像
通過SUSE Studio(http://susestudio.com/)可以很方便地爲OpenSUSE和SLES11構建與OpenStack兼容的虛擬應用,比如創建一個OpenSUSE12.1的JEOS映像。
2.2.3.5 Rackspace雲生成器映像
Rackspace雲生成器(https://github.com/rackerjoe/oz-image-build)提供了多種發行版預製的預製映像,如RedHat、CentOS、Fedora及Ubuntu等。
2.2.4 製作映像的專用工具
Oz(KVM):Oz是能夠爲常見Linux發行版創建映像文件的命令行工具,Rackspace就是使用Oz創建的映像文件。在Fedora Project的wiki中,提供了使用Oz創建映像文件的案例,具體請參照https://fedoraproject.org/wiki/Getting_started_with_OpenStack_Nova#Building_an_Image_With_Oz。
VMBuilder(KVM,Xen):VMBuilder能夠爲不同的hypervisor創建虛擬機映像文件,它是一個腳本,能夠自動收集所需的資源爲虛擬機創建映像文件。Ubuntu爲之提供了一個使用案例,具體請參照https://help.ubuntu.com/12.04/serverguide/jeos-and-vmbuilder.html。
VeeWee(KVM):VeeWee通常用於創建Vagrant虛擬工作環境,一種基於Virtualbox、VMware、AWS等虛擬化技術的虛擬化工具。VeeWee也可以用於創建KVM映像。
imagefactory:Aeolus項目的一款工具,用於自動化創建、轉換及爲不同的雲服務商上海映像文件,支持Openstack雲。
2.2.5 爲Openstack定製映像
映像文件要實現與Openstack兼容,需要顧及多方面的因素。
2.2.5.1 支持元數據服務或配置驅動(config drive)
Openstack支持的映像文件必須能夠由Openstack獲取到其元數據信息,如ssh公鑰以及用戶在請求映像文件時提交的用戶數據等。這些元數據信息可以通過元數據服務或配置驅動獲取,最簡單的方式莫過於在映像中安裝cloud-init程序。cloud-init用於爲雲實例提供配置及定製功能,項目的地址爲https://launchpad.net/cloud-init。
2.2.5.2 支持對磁盤映像大小進行調整
虛擬機映像文件的磁盤大小由創建映像時的初始大小決定,然而Openstack需要在啓動實例時通過指定不同的flavor來使用不同大小的磁盤空間。例如,有着磁盤初始大小爲5G的映像文件,在用於創建實例時使用了m1.small這個flavor,虛擬機實例將需要一個大小爲10G的主盤。調整實例的磁盤大小時,通過在其尾部填0來完成。
映像文件的分區大小也需要能夠根據用戶的需要在實例啓動時進行調整,否則,在實例啓動後,爲了能夠訪問由flavor的配置指定的超出磁盤原始大小的其它空間就不得不手動去調整分區大小。因此,在實例啓動時,映像文件需要運行一個腳本以修改分區表,並運行相應的程序(如resize2fs等)調整文件系統,使得其能夠適應新的分區大小。
2.3 創建映像文件
爲了使用方便,這裏採用CirrOS項目製作的映像文件,其也經常被拿來測試Openstack的部署。其地址爲https://launchpad.net/cirros,可以按需下載所想嘗試使用的版本。這裏以cirros-0.3.0-i386-disk.img和cirros-0.3.0-x86_64-disk.img爲例。
2.3.1 準備映像文件
# mkdir /stackimages # cd /stackimages # wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-i386-disk.img # wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img
使用qemu-img命令分別查看兩個映像文件的格式信息。
# qemu-img info cirros-0.3.0-i386-disk.img image: cirros-0.3.0-i386-disk.img file format: qcow2 virtual size: 39M (41126400 bytes) disk size: 8.7M cluster_size: 65536 # qemu-img info cirros-0.3.0-x86_64-disk.img image: cirros-0.3.0-x86_64-disk.img file format: qcow2 virtual size: 39M (41126400 bytes) disk size: 9.3M cluster_size: 65536
接下上傳cirros兩個映像文件。
# glance image-create --name=cirros-0.3.0-i386 --disk-format=qcow2 --container-format=bare < /stackimages/cirros-0.3.0-i386-disk.img +------------------+--------------------------------------+ | Property | Value | +------------------+--------------------------------------+ | checksum | 90169ba6f09b5906a7f0755bd00bf2c3 | | container_format | bare | | created_at | 2013-05-26T05:52:19 | | deleted | False | | deleted_at | None | | disk_format | qcow2 | | id | 16bfa875-8e0a-4cc3-8041-e8c64cca9f5e | | is_public | False | | min_disk | 0 | | min_ram | 0 | | name | cirros-0.3.0-i386 | | owner | b0b356e2c68f4ab29a1556a01aad022d | | protected | False | | size | 9159168 | | status | active | | updated_at | 2013-05-26T05:52:19 | +------------------+--------------------------------------+
# glance image-create --name=cirros-0.3.0-x86_64 --disk-format=qcow2 --container-format=bare < /stackimages/cirros-0.3.0-x86_64-disk.img +------------------+--------------------------------------+ | Property | Value | +------------------+--------------------------------------+ | checksum | 50bdc35edb03a38d91b1b071afb20a3c | | container_format | bare | | created_at | 2013-05-26T05:51:47 | | deleted | False | | deleted_at | None | | disk_format | qcow2 | | id | 9f92df26-8fd3-42b9-a00c-b9fb2c73ed21 | | is_public | False | | min_disk | 0 | | min_ram | 0 | | name | cirros-0.3.0-x86_64 | | owner | b0b356e2c68f4ab29a1556a01aad022d | | protected | False | | size | 9761280 | | status | active | | updated_at | 2013-05-26T05:51:48 | +------------------+--------------------------------------+
列出上傳的映像文件。
# glance image-list +--------------------------------------+---------------------+-------------+------------------+---------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +--------------------------------------+---------------------+-------------+------------------+---------+--------+ | 16bfa875-8e0a-4cc3-8041-e8c64cca9f5e | cirros-0.3.0-i386 | qcow2 | bare | 9159168 | active | | 9f92df26-8fd3-42b9-a00c-b9fb2c73ed21 | cirros-0.3.0-x86_64 | qcow2 | bare | 9761280 | active | +--------------------------------------+---------------------+-------------+------------------+---------+--------+
也可以使用“glance index”查看映像文件的索引信息。
# glance index ID Name Disk Format Container Format Size ------------------------------------ ------------------------------ -------------------- -------------------- -------------- 16bfa875-8e0a-4cc3-8041-e8c64cca9f5e cirros-0.3.0-i386 qcow2 bare 9159168 9f92df26-8fd3-42b9-a00c-b9fb2c73ed21 cirros-0.3.0-x86_64 qcow2 bare 9761280
三、安裝配置Nova
3.1 準備工作
3.1.1 啓用網絡接口的PROMISC功能
本示例將基於FlatDHCP網絡模型,因此其所有工作可以僅通過一個網絡接口完成。在所有的節點上,需要爲此接口開啓“promisc”標誌,這可通過如下命令實現。
# ip link set eth0 promisc on
確認其已經啓用“PROMISC”功能。
# ip link show eth0 2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:ed:4c:10 brd ff:ff:ff:ff:ff:ff
3.1.2 創建橋接接口br100
⑴ 禁用NetworkManager
目前,NetworkManager尚不能支持橋接設備,故此,若使用橋接設備必先以原有的network腳本替換NetworkManager實現網絡管理,通過在相關的網關接口中明確聲明禁止接受NetworkManager的控制(NM_CONTROLLED=”no”)即可,如果完全不打算使用,甚至也可以直接禁用NetworkManager服務。
# chkconfig NetworkManager off # chkconfig network on # service NetworkManager stop # service network start
⑵ 創建橋接設備
創建一個名爲brnet0的橋接設備,並將其橋接在eth0網卡上,其實現過程兩步即可完成:首先創建一個橋接類型的設備,爲其指定地址的獲取方式、IP址、子網掩碼和網關等屬性即可,完全類似於管理一個正常的網絡接口,只是其類型TYPE的值要爲Bridge(必須大寫首字母,且後面的字母使用小寫字符);其次,爲eth0接口指定其橋接至剛剛定義的橋接設備即可,需要注意的是,此接口不再需要專門配置IP地址等屬性。
在/etc/sysconfig/network-scripts目錄中新建名爲ifcfg-br0的配置文件,其內容如下:
DEVICE=br100 BOOTPROTO=none DNS1=172.16.0.1 GATEWAY=172.16.0.1 IPADDR=172.16.200.6 NETMASK=255.255.0.0 NM_CONTROLLED=no ONBOOT=yes TYPE=Bridge USERCTL=no DELAY=0
接下將橋接的物理網卡(假設爲eth0)關聯至前面定義的橋接設備,編輯/etc/sysconfig/network-script/ifcfg-eth0爲類似如下內容:
DEVICE=eth0 BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes TYPE=Ethernet HWADDR=00:0c:29:ed:4c:10 IPV6INIT=no USERCTL=no BRIDGE=br100
當然,上述的HWADDR地址應該與實際中的物理網卡的MAC地址保持一致。上述步驟無誤後重啓network服務即可。
3.1.3 安裝橋接管理工具
# yum install bridge-utils
添加橋接接口br100,並重啓網絡服務
# brctl addbr br100 # /etc/rc.d/init.d/network restart
查看橋接接口的信息。
# brctl show bridge namebridge idSTP enabledinterfaces br1008000.000c29ed4c10noeth0 virbr08000.5254003bee3ayesvirbr0-nic
3.1.4 啓動messagbus服務
# service messagebus start # chkconfig messagebus on
3.2 安裝nova
# yum install openstack-utils memcached qpid-cpp-server # yum install openstack-nova
初始化nova數據庫,同時創建其服務同名的用戶,併爲其指定密碼,這裏選擇使用與服務名同名的密碼nova。
# openstack-db --init --service nova --password nova
如果不想使用默認的nova用戶訪問其數據,也可以使用下面的命令爲nova創建數據庫及相關的用戶。
# mysql -uroot -p mysql> CREATE DATABASE nova; mysql> GRANT ALL ON nova.* TO 'NOVA_USER'@'%' IDENTIFIED BY 'NOVA_PASS'; mysql> GRANT ALL ON nova.* TO 'NOVA_USER'@'localhost' IDENTIFIED BY 'NOVA_PASS'; mysql> FLUSH PRIVILEGES;
3.3 配置nova
3.3.1 編輯配置文件/etc/nova/nova.conf,修改其內容如下所示:
[DEFAULT] # AUTHENTICATION auth_strategy=keystone # LOGS/STATE verbose=True logdir=/var/log/nova state_path=/var/lib/nova lock_path=/var/lock/nova rootwrap_config=/etc/nova/rootwrap.conf # SCHEDULER compute_scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler # VOLUMES volume_driver=nova.volume.driver.ISCSIDriver volume_group=nova-volume volume_name_template=volume-%08x iscsi_helper=tgtadm # DATABASE sql_connection=mysql://nova:[email protected]/nova # COMPUTE libvirt_type=qemu compute_driver=libvirt.LibvirtDriver instance_name_template=instance-%08x api_paste_config=/etc/nova/api-paste.ini # set the instances path # instances_path=/nova/instances # New add libvirt_nonblocking = True libvirt_inject_partition = -1 # COMPUTE/APIS: if you have separate configs for separate services # this flag is required for both nova-api and nova-compute allow_resize_to_same_host=True # APIS osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions ec2_dmz_host=172.16.200.6 s3_host=172.16.200.6 # Qpid rpc_backend = nova.openstack.common.rpc.impl_qpid qpid_hostname = 172.16.200.6 # GLANCE image_service=nova.image.glance.GlanceImageService glance_api_servers=172.16.200.6:9292 # NETWORK network_manager=nova.network.manager.FlatDHCPManager force_dhcp_release=True dhcpbridge_flagfile=/etc/nova/nova.conf # New Add dhcpbridge = /usr/bin/nova-dhcpbridge firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver # Change my_ip to match each Compute host my_ip=172.16.200.6 public_interface=eth0 vlan_interface=eth0 flat_network_bridge=br100 flat_interface=eth0 fixed_range=172.16.200.0/24 # NOVNC CONSOLE novncproxy_base_url=http://172.16.200.6:6080/vnc_auto.html # Change vncserver_proxyclient_address and vncserver_listen to match each compute host vncserver_proxyclient_address=172.16.200.6 vncserver_listen=172.16.200.6 [keystone_authtoken] auth_host = 172.16.200.6 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = nova admin_password = nova signing_dirname = /tmp/keystone-signing-nova
說明:KVM虛擬化要求CPU支持svm或vmx,因此,這裏的Openstack所在的系統RHEL6.4必須直接運行於支持這兩種特性之一的CPU平臺上。如果整個過程是在虛擬機上進行測試的話,比如Openstack所安裝的系統RHEL6.4本身就運行於虛擬上,那麼,虛擬化技術只能使用qemu而不能使用KVM。此種情形下,需要執行如下步驟,在RHEL6.4啓動對qemu的支持。
(1)安裝libguestfs-tools
# yum -y install libguestfs-tools
(2)設定libvirt類型爲qemu
openstack-config --set /etc/nova/nova.conf DEFAULT libvirt_type qemu
(3)爲qemu-kvm創建所需要鏈接
# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu
(4)重啓libvirtd服務
# service libvirtd restart
3.3.2 導入或遷移nova數據庫
# nova-manage db sync
3.2.3 安裝配置qpid隊列服務
# yum install -y qpid-cpp-server # sed -i -e 's/auth=.*/auth=no/g' /etc/qpidd.conf # service qpidd start # chkconfig qpidd on
3.3.4 啓動服務
首先創建nova服務的鎖文件目錄,並將其權限賦予nova用戶。
# mkdir /var/lock/nova # chown -R nova.nova /var/lock/nova/
而後啓動nova相關的服務,並將其設置爲開機自動啓動。
# for svc in api compute network cert console scheduler; do service openstack-nova-$svc start; chkconfig openstack-nova-$svc on; done
查看服務啓動狀況:
# nova-manage service list Binary Host Zone Status State Updated_At nova-cert node1.com nova enabled :-) 2013-05-26 05:00:24 nova-console node1.com nova enabled :-) 2013-05-26 05:00:24 nova-compute node1.com nova enabled :-) 2013-05-26 05:00:24 nova-network node1.com nova enabled :-) 2013-05-26 05:00:24 nova-scheduler node1.com nova enabled :-) 2013-05-26 05:00:24
檢驗服務啓動時是否有錯誤產生:
# grep -i ERROR /var/log/nova/*
3.3.5 創建nova網絡
創建nova網絡要通過“nova-manager network create”命令進行,其可以接受許多選項,獲取使用幫助的方式如下所示:
# nova-manage network create --help
例如,下面創建一個名爲“private”的網絡,橋接設備的名稱爲br100。
# nova-manage network create --label=private --multi_host=T --fixed_range_v4=172.16.200.0/24 --bridge_interface=eth0 --bridge=br100 --num_networks=1 --network_size=256
想看創建的網絡。
# nova-manage network list id IPv4 IPv6 start address DNS1 DNS2 VlanID project uuid 1 172.16.200.0/24 None 172.16.200.2 8.8.4.4 None None None c62364cb-9991-488b-ac6e-13f815f62c18
3.4 在KeyStone中註冊Nova compute API
接下來需要將Nova Compute API在KeyStone中註冊,dashboard需要基於此與Nova交互。下面的部分要以keystone的管理員admin身份執行,如果當前未爲連接KeyStone設置環境變量,可以使用“source ~/.keystonerc_admin”進行。
# keystone service-create --name=nova --type=compute --description="Nova Compute Service" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Nova Compute Service | | id | 2ac437bbfc0641deb65a569b2ce9bd33 | | name | nova | | type | compute | +-------------+----------------------------------+
# keystone endpoint-create --service_id 2ac437bbfc0641deb65a569b2ce9bd33 \ --publicurl "http://172.16.200.6:8774/v1.1/\$(tenant_id)s" \ --adminurl "http://172.16.200.6:8774/v1.1/\$(tenant_id)s" \ --internalurl "http://172.16.200.6:8774/v1.1/\$(tenant_id)s" +-------------+---------------------------------------------+ | Property | Value | +-------------+---------------------------------------------+ | adminurl | http://172.16.200.6:8774/v1.1/$(tenant_id)s | | id | 12ab1ca2cf5c4497a34476894efc2122 | | internalurl | http://172.16.200.6:8774/v1.1/$(tenant_id)s | | publicurl | http://172.16.200.6:8774/v1.1/$(tenant_id)s | | region | regionOne | | service_id | 2ac437bbfc0641deb65a569b2ce9bd33 | +-------------+---------------------------------------------+
四、運行VM實例
4.1 安全組(security group)
Compute服務通過安全組(security group)控制通過哪些網絡協議(TCP,UDP,ICMP)、端口及IP地址允許對實例進行訪問。安全組是tenant級別的概念,每個tenant都有其自己的安全組,且都有一個默認的“default”組。在某VM實例啓動時,如果沒有爲其指定特定的安全組,其將使用默認的安全組。使用“nova secgroup-list”命令可以查看安全組。
# nova secgroup-list +---------+-------------+ | Name | Description | +---------+-------------+ | default | default | +---------+-------------+
“nova secgroup-add-rule”可用於爲安全組定義訪問規則,如下面的命令就實現了允許所有IP地址通過TCP協議的22端口訪問關聯的VM實例。
# nova secgroup-add-rule default tcp 22 22 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 22 | 22 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
如果要允許對VM實例發起ping請求,還要開放其ICMP協議。不過,ICMP協議的相關規則需要指定ICMP報文類型(號碼)而非類似TCP或UDP協議的端口。如果要開放所有的報文類型,則使用“-1”這個號碼。例如,允許所有主機對VM實例發起任意類型的ICMP請求,則可以使用下面的命令來定義規則。
# nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | icmp | -1 | -1 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
4.2 SSH公鑰注入
只要對應的VM實例支持使用SSH服務,Compute服務可以注入SSH公鑰信息至此實例的某帳號中。“nova keypair-add”命令能夠生成一對密鑰(不保存至文件中),並將其公鑰添加至Compute服務;當然,也可以只用於將現有的某密鑰對兒的公鑰添加至Compute服務中。爲了使用上的方便,這裏先使用ssh-keygen命令生成一對密鑰文件,而後將其公鑰上傳至Compute服務中。
# ssh-keygen -t rsa -P '' # nova keypair-add --pub-key .ssh/id_rsa.pub testkey
顯示添加的密鑰信息,並確保其與本地密鑰文件的Fingerprint信息完全匹配。
# nova keypair-list +---------+-------------------------------------------------+ | Name | Fingerprint | +---------+-------------------------------------------------+ | testkey | 71:5d:e4:80:c4:7b:53:3a:c9:8f:37:c0:0f:80:08:79 | +---------+-------------------------------------------------+ # ssh-keygen -l -f .ssh/id_rsa.pub 2048 71:5d:e4:80:c4:7b:53:3a:c9:8f:37:c0:0f:80:08:79 .ssh/id_rsa.pub (RSA)
4.3 確保Compute節點的每個服務都已正常運行
在啓動任何VM實例前,要確認Compute節點上的如下服務都已經正常運行。
libvirtd:所有的nova服務均依賴於此服務;
nova-api:用於響應請求以啓動VM實例,及提供VM實例的元數據信息等;
nova-scheduler:響應用戶請求將用戶請求啓動的VM實例調度至某Compute節點運行;
nova-compute:與hypervisor進行交互以管理VM實例;
nova-network:執行Openstack的網絡任務,如將IP地址分配給某VM實例,以及啓用安全組規則等;
# nova-manage service list Binary Host Zone Status State Updated_At nova-cert node1.com nova enabled :-) 2013-05-26 07:02:45 nova-console node1.com nova enabled :-) 2013-05-26 07:02:46 nova-compute node1.com nova enabled :-) 2013-05-26 07:02:52 nova-network node1.com nova enabled :-) 2013-05-26 07:02:47 nova-scheduler node1.com nova enabled :-) 2013-05-26 07:02:46
如果有某服務沒有啓動,在此處啓動其即可。
4.4 啓動一個實例
在啓動一個VM實例時,需要爲其指定一個flavor,也即實例類型,其用於指定此實例的規格,如內存大小、磁盤數量及空間大小、VCPU的個數等。“nova flavor-list”可以查看所有的flavor。
# nova flavor-list +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | extra_specs | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+ | 1 | m1.tiny | 512 | 0 | 0 | | 1 | 1.0 | True | {} | | 2 | m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True | {} | | 3 | m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True | {} | | 4 | m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True | {} | | 5 | m1.xlarge | 16384 | 160 | 0 | | 8 | 1.0 | True | {} | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+
“nova flavor-create”可用於創建一個新的flavor,其使用格式請自行獲取命令的使用幫助。下面就創建了一個名爲“flavor.cirros”的flavor。
# nova flavor-create --swap 256 flavor.cirros 6 128 2 2 +----+---------------+-----------+------+-----------+------+-------+-------------+-----------+-------------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | extra_specs | +----+---------------+-----------+------+-----------+------+-------+-------------+-----------+-------------+ | 6 | flavor.cirros | 128 | 2 | 0 | 256 | 2 | 1 | True | {} | +----+---------------+-----------+------+-----------+------+-------+-------------+-----------+-------------+
另外,啓動實例還依賴於可用的映像文件。在前文的演示中已經添加過兩個示例性的映像文件,可以使用“nova image-list”獲取其相關信息。
# nova image-list +--------------------------------------+---------------------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+---------------------+--------+--------+ | 16bfa875-8e0a-4cc3-8041-e8c64cca9f5e | cirros-0.3.0-i386 | ACTIVE | | | 9f92df26-8fd3-42b9-a00c-b9fb2c73ed21 | cirros-0.3.0-x86_64 | ACTIVE | | +--------------------------------------+---------------------+--------+--------+
具備上述條件後,“nova boot”命令即可用來創建並啓動一個實例了。此命令還可以添加--debug選項,以診斷創建實例過程中的問題。
# nova boot --flavor 6 --image 9f92df26-8fd3-42b9-a00c-b9fb2c73ed21 --key_name testkey --security_group default cirros1 +-------------------------------------+--------------------------------------+ | Property | Value | +-------------------------------------+--------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-SRV-ATTR:host | None | | OS-EXT-SRV-ATTR:hypervisor_hostname | None | | OS-EXT-SRV-ATTR:instance_name | instance-00000007 | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | accessIPv4 | | | accessIPv6 | | | adminPass | p4MSM6Q2osKP | | config_drive | | | created | 2013-05-26T07:56:26Z | | flavor | flavor.cirros | | hostId | | | id | 176c8369-b546-47f1-937f-6e657b793150 | | image | cirros-0.3.0-x86_64 | | key_name | testkey | | metadata | {} | | name | cirros1 | | progress | 0 | | security_groups | [{u'name': u'default'}] | | status | BUILD | | tenant_id | b0b356e2c68f4ab29a1556a01aad022d | | updated | 2013-05-26T07:56:27Z | | user_id | fd97c9eba1974010a147e95d441d9c3a | +-------------------------------------+--------------------------------------+
查看創建的VM實例cirros1:
# nova list +--------------------------------------+---------+--------+----------------------+ | ID | Name | Status | Networks | +--------------------------------------+---------+--------+----------------------+ | 176c8369-b546-47f1-937f-6e657b793150 | cirros1 | ACTIVE | private=172.16.200.2 | +--------------------------------------+---------+--------+----------------------+
基於nova控制檯連接至VM實例cirros1:
# nova console-log cirros1 ===== cloud-final: system completely up in 6.23 seconds ==== instance-id: i-00000007 public-ipv4: local-ipv4 : 172.16.200.2 wget: server returned error: HTTP/1.1 404 Not Found cloud-userdata: failed to read user data url: http://169.254.169.254/2009-04-04/user-data WARN: /etc/rc3.d/S99-cloud-userdata failed ____ ____ ____ / __/ __ ____ ____ / __ \/ __/ / /__ / // __// __// /_/ /\ \ \___//_//_/ /_/ \____/___/ http://launchpad.net/cirros login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root. cirros login:
另外,也可以通過ssh連接至VM實例cirros1,而且由於控制節點已經直接向cirrors中注入了ssh公鑰,連接至VM實例時不再需要提供密碼即可建立SSH會話。
# ssh -l cirros 172.16.200.2
五、安裝配置其它Compute節點
類似前面的Nova的安裝配置過程,首先要配置好網絡屬性,而後安裝Nova,併爲nova提供配置文件。其配置信息中,以下幾項要按需修改爲當前節點的IP地址。配置完成後,啓動相關的服務(openstack-nova-compute、openstack-nove-network和libvirtd)即可。
• my_ip
• vncserver_listen
• vncserver_proxyclient_address
需要注意的是,控制節點一般不應該運行VM實例,因此,當專用的Compute節點配置完成後,即可禁止控制節點上的服務。如下面的命令即禁用了控制節點node1.magedu.com上的nova-compute服務,這樣一來,在啓動VM實例時就不再會將其調度至控制節點。
# nova-manage service disable --host=node1.magedu.com --service=nova-compute
六、Object Storage (swift)
OpenStack Object Storage(Swift)是OpenStack的子項目之一,它使用藉助於商用服務器來構建冗餘、可擴展的分佈式對象存儲集羣,存儲容量可達PB級。Swift基於Python開發,前身是Rackspace Cloud Files項目,Rackspace加入到OpenStack社區後將Cloud Files的代碼貢獻給了社區,後逐漸發展爲現在Swift。
在分佈式對象存儲中的一個關鍵問題是數據存儲位置的選擇及定位。Ring是Swift中最重要的組件,用於記錄存儲對象與物理位置間映射關係。在涉及查詢account、container、object信息時就需要查詢集羣的ring信息。
先來看一下Swift文檔中關於Ring的描述:
Ring用來確定數據駐留在集羣中的位置;有單獨對應於Account數據庫、container數據庫和單個object的ring;
Ring中每個partition在集羣中都(默認)有3個replica;每個partition的位置由ring來維護,並存儲在映射中;
Ring使用zone的概念來保證數據的隔離;每個partition的replica都確保放在了不同的zone中;一個zone可以是一個硬盤,一個服務器,一個機架,一個交換機,甚至是一個數據中心;
6.1 Swift的主要組件
6.1.1 Ring文件
ring文件由一致性哈希算法生成,它的主要作用是存儲名字到位置的映射;其主要分爲三類,分別是:account.ring,container.ring,object.ring。
對於account的請求,就能通過account_name查詢account.ring得到{‘/account_name’ : account_db_position}的映射,從而知道account數據庫文件在集羣的位置;
對於container的請求,通過account_name和container_name查詢container.ring文件,得到{‘/account_name/container_name’ : container_db_position}的映射;
對於object的請求,通過account_name,container_name,object_name查詢object.ring文件,得到{‘/account_name/container_name/object_name’ : object_position}的映射;
Ring文件作爲一個靜態文件存儲在每個節點的/etc/swift目錄下,被用於各節點之間的位置查詢,使得swift的內部網絡是一個P2P網絡,不依賴某幾個節點進行位置查詢,避免了單點瓶頸。
生成ring文件的一致性哈希算法不但爲數據的冗餘性,分區容忍性提供了保證,也爲整體架構上實現性能、容量的橫向擴展奠定了基礎。
6.1.2 proxy-server
proxy-server是proxy節點中唯一運行的守護進程,也是swift集羣的endpoint,向用戶提供RESTful API。
對於用戶的請求,proxy-server會根據配置文件的配置,將請求交給各個中間件進行處理,其中最重要的就是Auth中間件(認證),在處理完成後會根據請求路徑將請求轉發給相應的storage node中的account-server。container-server或object-server進程處理。
swift集羣的流入數據和流出數據都需要經過proxy-server,proxy-server不會對數據進行緩存。
6.1.3 auth-server
這是個驗證服務進程,它爲用戶生成token和驗證每個請求的token及token的權限。swift的驗證服務是作爲一箇中間件被proxy-server使用,是可選的,可以自己開發,也可以使用OpenStack Keystone。Keystone是官方開發的驗證服務,使用Keystone可以無縫的與其它OpenStack項目整合。
6.1.4 account-server
account-server是存儲節點(storage node)中負責處理針對account的GET、HEAD、PUT、DELETE及RELICATION等請求的守護進程,它使用sqlite的數據庫文件保存account的相關信息。
6.1.5 container-server
container-server是存儲節點上負責處理針對container的GET、HEAD、PUT、DELETE、RELICATION請求的服務進程,它也使用sqlite的數據庫文件保存container的相關信息。
6.1.6 object-server
object-server是存儲節點上負責處理針對object的GET、HEAD、PUT、PSOT、DELETE、RELICATION請求的守護進程,它直接操作object,並利用XFS文件系統的xattr包存object的元數據。
6.1.7 account-auditor、container-auditor和object-auditor
這三個進程同樣運行在存儲節點上,分別用於檢測account的db文件、container的db文件和object是否損壞,如果文件損壞,其將會向存儲有其它副本的存儲節點請求副本,並以之替換本地損壞的副本。
6.1.8 account-replicator、container-replicator和object-replicator
這三個進程運行在存儲節點上,分別負責account的db文件、container的db文件和object在集羣中副本的同步。
例如,一個object在swift集羣中通常被存儲在3個不同的storage node中,對於一個PUT /account/container/object的請求,proxy-server會根據 /account/container/object查詢ring文件,得到該object應該存儲的節點列表(長度爲3),proxy-server會將請求轉發到這三個節點。只要有兩個節點寫入成功,就認爲這次PUT操作成功。寫入失敗的節點在一段時間後將會得到寫入成功的節點object-replicator進程推送過來的數據。
6.1.9 container-updater、account-updater
這兩個進程運行在存儲節點上,負責container數據庫和account數據庫的異步更新。在高併發請求的場景下,container-server和account-server可能無法實時處理對數據庫更新的請求,此時,這些請求將被放置於本地化到隊列,由updater進程以異步方式執行更新.
6.2 安裝配置Swift的存儲節點
儘管本示例將swift的多個角色均安裝於同一個物理節點,但爲了規範及便於大規模部署時參考,這裏仍然將其配置過程要開闡述。
6.2.1 安裝swift組件
# yum install openstack-utils openstack-swift-account openstack-swift-container openstack-swift-object xfsprogs python-keystone
6.2.2 爲每個用於存儲的卷配置XFS文件系統
每個磁盤均直接使用單個分區,而後將其格式化爲XFS文件系統。本示例中準備了/dev/sdb、/dev/sdc和/dev/sdd三塊磁盤設備,其分區過程不再演示,僅給出其中一個設備(/dev/sdb1)的文件系統創建步驟,其它設備的類同。
# mkfs.xfs -i size=1024 /dev/sdb1 # echo "/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab # mkdir -p /srv/node/sdb1 # mount /srv/node/sdb1 # chown -R swift:swift /srv/node
說明:如果想快速處理三個設備,可以使用下面的腳本實現。
# for PART in sdb1 sdc1 sdd1; do \ mkfs.xfs -f -i size=1024 /dev/$PART; \ echo "/dev/$PART /srv/node/$PART xfs noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab; \ mkdir -p /srv/node/$PART; \ mount /srv/node/$PART; \ chown -R swift:swift /srv/node; done
6.2.3 啓動各服務進程
# for SERVICE in account container object; do service openstack-swift-$SERVICE start; done # for SERVICE in account container object; do chkconfig openstack-swift-$SERVICE on; done
6.3 安裝配置Swift的代理節點
6.3.1 安裝swift-proxy服務
# yum install openstack-swift-proxy memcached python-keystone openstack-utils python-keystoneclient
6.3.2 啓動memcached服務
通過/etc/sysconfig/memcached配置文件爲memcached服務配置好合適的參數後即可啓動此服務。
# service memcached start # chkconfig memcached on
6.3.3 配置swift-proxy
編輯swift-proxy的配置文件/etc/swift/proxy-server.conf,確保其如下項爲實際需要。
memcache_servers = 172.16.200.8:11211 admin_tenant_name = service admin_user = swift admin_password = swift auth_host = 172.16.200.6 auth_port = 35357 auth_protocol = http
這裏需要說明的是,swift用戶在前面的第一步中已然創建,如果你沒有按照文檔的步驟在第一步中創建此用戶,可使用admin用戶替代之,亦或此時創建swift用戶均可。
6.3.4 創建所需ring
通過“swift-ring-builder”命令創建account、container和object所用的ring文件。
# cd /etc/swift # swift-ring-builder account.builder create 18 3 1 # swift-ring-builder container.builder create 18 3 1 # swift-ring-builder object.builder create 18 3 1
上面的命令後面三個參數中,18表示構建一致hash環時其環的大小,即使用2^18大小的環。實際使用中,可以根據節點數規模進行調整,最大爲32;3表示爲每個對象存儲3個副本;最後的1表示多長時間可以移動一次某partiton。
6.3.5 將存儲設備關係至ring
在ring文件創建完成後,還需要將每個存儲設備添加至每個ring上,而且通常需要以account、container和object的順序進行。其格式爲:
# swift-ring-builder account.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP>:6002/<DEVICE> 100 # swift-ring-builder container.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6001/<DEVICE> 100 # swift-ring-builder object.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6000/<DEVICE> 100
其中<ZONE>爲zone編號,如z1表示第一個zone;<STORAGE_LOCAL_NET_IP>表示存儲節點自己的IP地址;<DEVICE>表示對應設備的設備名稱或掛載點名稱(二者通常相同),如/dev/sdb1設備的掛載點爲/srv/node/sdb1時,其<DEVICE>即爲sdb1。因此,將sdb1、sdc1和sdd1三個設備添加至ring文件可通過如下命令實現。
# swift-ring-builder account.builder add z1-172.16.200.8:6002/sdb1 100 # swift-ring-builder container.builder add z1-172.16.200.8:6001/sdb1 100 # swift-ring-builder object.builder add z1-172.16.200.8:6000/sdb1 100 # swift-ring-builder account.builder add z2-172.16.200.8:6002/sdc1 100 # swift-ring-builder container.builder add z2-172.16.200.8:6001/sdc1 100 # swift-ring-builder object.builder add z2-172.16.200.8:6000/sdc1 100 # swift-ring-builder account.builder add z3-172.16.200.8:6002/sdd1 100 # swift-ring-builder container.builder add z3-172.16.200.8:6001/sdd1 100 # swift-ring-builder object.builder add z3-172.16.200.8:6000/sdd1 100
查看每個ring文件的內容,驗正添加結果:
# swift-ring-builder account.builder account.builder, build version 3 262144 partitions, 3 replicas, 3 zones, 3 devices, 100.00 balance The minimum number of hours before a partition can be reassigned is 1 Devices: id zone ip address port name weight partitions balance meta 0 1 172.16.200.8 6002 sdb1 100.00 0 -100.00 1 2 172.16.200.8 6002 sdc1 100.00 0 -100.00 2 3 172.16.200.8 6002 sdd1 100.00 0 -100.00 # swift-ring-builder container.builder container.builder, build version 3 262144 partitions, 3 replicas, 3 zones, 3 devices, 100.00 balance The minimum number of hours before a partition can be reassigned is 1 Devices: id zone ip address port name weight partitions balance meta 0 1 172.16.200.8 6001 sdb1 100.00 0 -100.00 1 2 172.16.200.8 6001 sdc1 100.00 0 -100.00 2 3 172.16.200.8 6001 sdd1 100.00 0 -100.00 # swift-ring-builder object.builder object.builder, build version 3 262144 partitions, 3 replicas, 3 zones, 3 devices, 100.00 balance The minimum number of hours before a partition can be reassigned is 1 Devices: id zone ip address port name weight partitions balance meta 0 1 172.16.200.8 6000 sdb1 100.00 0 -100.00 1 2 172.16.200.8 6000 sdc1 100.00 0 -100.00 2 3 172.16.200.8 6000 sdd1 100.00 0 -100.00
使用如下命令重新平衡三個環,即將對應的設備分佈式環中的節點上。不過,執行這些命令可能會需要一些時間。
# swift-ring-builder account.builder rebalance # swift-ring-builder container.builder rebalance # swift-ring-builder object.builder rebalance
執行完成後,它們被保存爲三個壓縮文件account.ring.gz、container.ring.gz和object.ring.gz,請自行確保有些三個文件。在多節點的場景中,這三個文件需要複製到每個代理節點和存儲節點的/etc/swift目錄中。
確保每個節點的/etc/swift目錄及其內部子目錄和文件的屬主爲swift用戶,屬組爲swift組。
# chown -R swift:swift /etc/swift
另外,最好爲swift設定一個hash key:
# openstack-config --set /etc/swift/swift.conf swift-hash swift_hash_path_suffix $(openssl rand -hex 10)
6.3.6 啓動代理服務
# service openstack-swift-proxy start # chkconfig openstack-swift-proxy on
6.4 在KeyStone中註冊swift
接下來需要將swift在KeyStone中註冊,dashboard需要基於此與swift交互。下面的部分要以keystone的管理員admin身份執行,如果當前未爲連接KeyStone設置環境變量,可以使用“source ~/.keystonerc_admin”進行。
在Keystone中註冊swift服務:
# keystone service-create --name swift --type object-store --description "Swift Storage Service" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Swift Storage Service | | id | 712004c454f144e0bf0d08d7c3fe2db4 | | name | swift | | type | object-store | +-------------+----------------------------------+
爲上面註冊的服務提供訪問路徑:
# keystone endpoint-create --service_id 712004c454f144e0bf0d08d7c3fe2db4 \ --publicurl "http://172.16.200.8:8080/v1/AUTH_\$(tenant_id)s" \ --adminurl "http://172.16.200.8:8080/v1/AUTH_\$(tenant_id)s" \ --internalurl "http://172.16.200.8:8080/v1/AUTH_\$(tenant_id)s" +-------------+------------------------------------------------+ | Property | Value | +-------------+------------------------------------------------+ | adminurl | http://172.16.200.8:8080/v1/AUTH_$(tenant_id)s | | id | 44d8498d194b4166afe38c2981d67bfd | | internalurl | http://172.16.200.8:8080/v1/AUTH_$(tenant_id)s | | publicurl | http://172.16.200.8:8080/v1/AUTH_$(tenant_id)s | | region | regionOne | | service_id | 712004c454f144e0bf0d08d7c3fe2db4 | +-------------+------------------------------------------------+
6.5 測試swift服務是否已經正常工作
通過keystone客戶端向認證服務器keystone發起帳號驗正請求。其中的“-U service:swift”格式爲“Tenant_Name:Swift_Admin_User”,“-K swift”格式爲“-K Swift_Admin_Password”。
# swift -V 2.0 -A http://172.16.200.6:5000/v2.0 -U service:swift -K swift stat Account: AUTH_11e27e27f0444ef78efe00ec79b4f93c Containers: 0 Objects: 0 Bytes: 0 Accept-Ranges: bytes X-Timestamp: 1369567334.12750
爲了方便上面命令的執行,可以在swift客戶端上聲明如下環境變量。也可以直接將命令保存至配置文件中,如~/.swiftrc_admin,以便之後多次source使用。
# export OS_USERNAME=swift # export OS_TENANT_NAME=service # export OS_PASSWORD=swift # export OS_AUTH_URL=http://172.16.200.6:35357/v2.0/ # export PS1='[\u@\h \W(swift_admin)]\$ '
而後使用就可以將上面的第一個測試命令替換爲如下格式:
# swift stat
swift有多個子命令可以使用,其中upload可用於上傳文件或目錄,download可用於下載文件或目錄。例如創建一個測試文件並上傳文件至swift中。
# cd /tmp # dd if=/dev/zero of=localfile bs=1024 count=5 # swift upload testfile1 localfile
顯示上傳的文件列表:
# swift list testfile1
下載文件至本地:
# swift download testfile1
七、OpenStack Hirizon
以下操作在控制節點node1.com上進行。
7.1 安裝配置Horizon服務
7.1.1 安裝
# yum install -y memcached python-memcached mod_wsgi openstack-dashboard
7.1.2 爲dashboard創建Member角色
dashboard依賴於keystone的Member角色,因此,需要爲其創建此默認角色。
# keystone role-create --name Member +----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | 191ba35b1dfe4982bbdda1b0d781f73a | | name | Member | +----------+----------------------------------+
7.1.3 配置openstack-dashboard
確保dashboard的配置文件/etc/openstack-dashboard.conf中的默認角色定義如下所示。
OPENSTACK_HOST = "172.16.200.6" OPENSTACK_KEYSTONE_DEFAULT_ROLE = "Member" CACHES = { 'default': { 'BACKEND' : 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION' : '127.0.0.1:11211', } } SECRET_KEY ='fdafidoauf8a9re78wfjdalvfdksafjds'
7.1.4 啓動httpd服務,並測試訪問
# service httpd start # ckconfig httpd on
基於HTTP進行訪問測試:
http://172.16.200.6/dashboard
7.2 啓用控制檯訪問
yum install -y openstack-nova-novncproxy
監聽所有地址的6080端口:
openstack-config --set /etc/nova/nova.conf DEFAULT novncproxy_host 0.0.0.0 openstack-config --set /etc/nova/nova.conf DEFAULT novncproxy_port 6080 openstack-config --set /etc/nova/nova.conf DEFAULT novncproxy_base_url http://node1.magedu.com:6080/vnc_auto.html openstack-config --set /etc/nova/nova.conf DEFAULT vnc_enabled true
配置VNC服務真正監聽的地址
openstack-config --set /etc/nova/nova.conf DEFAULT vncserver_listen 127.0.0.1 openstack-config --set /etc/nova/nova.conf DEFAULT vncserver_proxyclient_address 127.0.0.1 service openstack-nova-novncproxy start service openstack-nova-consoleauth start chkconfig openstack-nova-novncproxy on chkconfig openstack-nova-consoleauth on
補充:需要額外下載:dnsmasq-utils、Django14和pytz
# yum install openstack-utils dnsmasq-utils # yum install openstack-keystone
keystone使用MySQL服務器
# openstack-db --init --service keystone # keystone service-create --name=keystone --type=identity --description="Keystone Identity Service" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Keystone Identity Service | | id | db381d733fcc428d89cbf67ef6b3c173 | | name | keystone | | type | identity | +-------------+----------------------------------+
# keystone endpoint-create --service-id db381d733fcc428d89cbf67ef6b3c173 --publicurl 'http://172.16.200.1:5000/v2.0' --adminurl 'http://172.16.200.1:35357/v2.0' --internalurl 'http://172.16.200.1:5000/v2.0' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://172.16.200.1:35357/v2.0 | | id | 39d0e31687224addb7d9aa016ca78a6a | | internalurl | http://172.16.200.1:5000/v2.0 | | publicurl | http://172.16.200.1:5000/v2.0 | | region | regionOne | | service_id | db381d733fcc428d89cbf67ef6b3c173 | +-------------+----------------------------------+
所有服務都會使用keystone實現認證。
# keystone user-create --name admin --pass admin --email [email protected] +----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | [email protected] | | enabled | True | | id | bd02844e87e549148e1c4bbeaefcc4eb | | name | admin | | password | $6$rounds=40000$Tlot13xbxNT9Rtu2$xyf5iwCOHyzV6A9okODwuSZUXkwldaaGoaHwZz6LSP1ZOGtmSOuOY/7b4QXpduzRtVYis0FBPB8wZXvvAdv5b1 | | tenantId | | +----------+-------------------------------------------------------------------------------------------------------------------------+
# keystone role-create --name admin +----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | 7d6014270eaf4162bf8f41481fffe101 | | name | admin | +----------+----------------------------------+
# keystone tenant-create --name admin --description "Admin Tenant" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Admin Tenant | | enabled | True | | id | ca853af6387b419ea7401c1e85237e96 | | name | admin | +-------------+----------------------------------+
# keystone user-role-add --user-id bd02844e87e549148e1c4bbeaefcc4eb --role-id 7d6014270eaf4162bf8f41481fffe101 --tenant-id ca853af6387b419ea7401c1e85237e96
# vim ~/keystonerc_admin export OS_USERNAME=admin export OS_TENANT_NAME=admin export OS_PASSWORD=admin export OS_AUTH_URL=http://172.16.200.1:35357/v2.0/ export PS1='[\u@\h \W(KS_ADMIN)]\$'
# unset SERVICE_TOKEN # unset SERVICE_ENDPOINT # source ~/keystonerc_admin
# keystone user-list +----------------------------------+-------+---------+------------------+ | id | name | enabled | email | +----------------------------------+-------+---------+------------------+ | bd02844e87e549148e1c4bbeaefcc4eb | admin | True | [email protected] | +----------------------------------+-------+---------+------------------+
執行類似如下顯示類的命令,查看新的認證機制是否已經啓用。
# keystone tenant-list +----------------------------------+-------+---------+ | id | name | enabled | +----------------------------------+-------+---------+ | ca853af6387b419ea7401c1e85237e96 | admin | True | +----------------------------------+-------+---------