淺析shell指令碼程式設計之if語句、for語句
阿新 • • 發佈:2021-06-29
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epelrelease-6-8.noarch.rpm 前提:本文件中涉及到的所有主機的OS均為RHEL 6.4 x86_64系統。 Control Node: 172.16.200.6 node1.magedu.com Compute Node: 172.16.200.7 node2.magedu.com Object Storage Node: 172.16.200.8 node3.magedu.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 name bridge id STP enabled interfaces br100 8000.000c29ed4c10 no eth0 virbr0 8000.5254003bee3a yes virbr0-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.magedu.com nova enabled :-) 2013-05-26 05:00:24 nova-console node1.magedu.com nova enabled :-) 2013-05-26 05:00:24 nova-compute node1.magedu.com nova enabled :-) 2013-05-26 05:00:24 nova-network node1.magedu.com nova enabled :-) 2013-05-26 05:00:24 nova-scheduler node1.magedu.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.magedu.com nova enabled :-) 2013-05-26 07:02:45 nova-console node1.magedu.com nova enabled :-) 2013-05-26 07:02:46 nova-compute node1.magedu.com nova enabled :-) 2013-05-26 07:02:52 nova-network node1.magedu.com nova enabled :-) 2013-05-26 07:02:47 nova-scheduler node1.magedu.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.magedu.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 | +----------------------------------+-------+---------+