專家教你純手工部署 OpenStack 最小系統
目標是安裝一個最小化的 openstack 環境。通過這個過程了解一下構成 openstack 的基本組件都有哪些以及這些組件之間是如何相互配合的。
為了說明起來方便,所有的操作都是以 Ubuntu 12.04 為操作系統進行的。
部署基礎服務
首先,openstack 重度依賴 Message Queue 和 Database 兩種服務。這里我選擇使用 RabbitMQ 和 MySQL 分別來承擔相應的角色。
部署 RabbitMQ
RabbitMQ 是一個開源消息中間件。openstack 中很多子系統會依賴它來進行 RPC (Remote Procedure Call) 調用。
安裝
- apt-get install rabbitmq-server
- service rabbitmq-server start
配置
RabbitMQ 默認的管理員賬戶和密碼是 guest/guest 。但可以通過下面的命令修改 guest 賬戶的密碼。例如:設置 guest 的密碼為 =openstack=。
- rabbitmqctl change_password guest openstack
驗證
使用 rabbitmqctl 工具檢查 RabbitMQ 是否安裝成功,若有狀態輸出則表示 RabbitMQ 啟動成功了。
- rabbitmqctl status
部署 MySQL
MySQL 是最常用的開源數據庫。openstack 中幾乎所有系統和用戶信息都是存儲在數據庫中的。
安裝
由于后面需要編譯 python 對 mysql 的支持模塊。這里需要一并安裝 libmysql++-dev
- apt-get install mysql-server mysql-client libmysql++-dev
- service mysql start
配置
MySQL 服務啟動后,首先需要配置管理員(root)的密碼。
- mysqladmin -u root password openstack
驗證
登陸進 MySQL 跑一個 SQL 來驗證安裝是否正確,
- mysql -h localhost -u root -p -e 'select version();'
- +-----------------------------+
- | version() |
- +-----------------------------+
- | 5.5.31-0ubuntu0.13.04.1-log |
- +-----------------------------+
安裝虛擬化軟件
在安裝 openstack 之前,還需要安裝操作系統對虛擬化支持相關的服務,
- apt-get install libvirt-bin libvirt-dev qemu-kvm
部署 openstack
即使是安裝最小化的 openstack 需要啟動的服務也是非常多的。為了能夠方便調試,要使用 screen 來啟動每個服務。 screen 的便利之處在于不用把服務放在后臺啟動,可以隨時 Ctrl+C 中斷服務進行調整。
openstack 的源代碼可以從他的 Git 倉庫獲取。代碼分支上***選擇穩定版本,例如目前的穩定版分支是 stable/grizzly 。選擇穩定版本分支的好處是不用為了當前版本的 Bug 耽誤時間。當然,如果以嘗鮮為目的也可以嘗試使用 master 分支進行部署。
在部署和運行這些 openstack 服務的時候,推薦使用 python 的 virtualenv來創建一個獨立的 python 運行環境。這是因為 openstack 里面用到的一些 python 庫 ubuntu 上可能沒有打包,因此這類包就需要通過 pip 進行安裝。建立獨立 python 運行環境的目的就是為了這類包不干擾系統自身的 python 環境。
每個 openstack 服務都有自己的配置文件,源代碼中會包含多個擴展名為 .sample 的例子文件。以這些例子作為基礎會讓配置簡單很多。
#p#
下面開始正式的部署過程,
創建獨立的 python 運行環境
- apt-get install virtualenv
- virtualenv openstack-python
- source openstack-python/bin/activate
部署: keystone
keystone 為整個 openstack 系統 AAA (Authentication, Authorization, and Accounting) 服務。在這個最小系統里 keystone 的作用有兩個:
- [ ] 提供用戶登陸所需的密碼驗證
- [ ] 通過 keystone 查詢各個服務的 endpoint (訪問地址)
安裝
下載 keystone 源代碼,并切換到 grizzly 版本。然后通過 pip 安裝依賴的 python 庫。
- git clone https://github.com/openstack/keystone.git
- cd keystone
- git checkout stable/grizzly
- pip install -r tools/pip-requires
- pip install mysql-python
配置及初始化
以源碼包中的 keystone.conf.sample 為基礎,稍作如下修改。并將修改后的文件保存成 keystone.conf 。
- [DEFAULT]
- admin_token = openstack
- debug = True
- verbose = True
- [sql]
- connection = mysql://root:openstack@localhost/keystone
- [signing]
- token_format=UUID
配置文件做好后,需要為 keystone 初始化數據庫。
- mysql -h localhost -u root -p -e 'create database keystone';
- bin/keystone-manage --config-dir etc/ db_sync
啟動服務
keystone 只有一個服務進程。通過下面的命令啟動,
- bin/keystone-all --config-dir etc/
keystone 服務會監聽兩個端口。其中 5000 端口用于和其他 openstack 組件和 keystone 的交互,被稱作 public_port ;另一個端口 35357 用于對 keystone 本身進行管理,被稱作 admin_port 。
當 keystone-all 進程啟動成功后,可以通過 netstat 檢查 端口偵聽是否正常。
- jianingy@ubuntu:~$ netstat -lntp | grep -E '5000|35357'
- tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 9585/python
- tcp 0 0 0.0.0.0:35357 0.0.0.0:* LISTEN 9585/python
安裝 keystone 客戶端程序
在 keystone 部署完成后,后續有許多要用到他的地方。所以在這里先把 keystone 的客戶端程序安裝好,以備后用。
- pip install python-keystoneclient
#p#
創建管理員用戶
openstack 用戶體系簡介
openstack 的用戶管理是基于 keystone 。也就是說 keystone 的用戶體系就是 openstack 的用戶體系。
在這個體系里,最基本的單位是 user/(用戶)。 /user 在 openstack 里面可以代表一個實際的人,也可以代表一個程序或是服務,也就是所謂的系統用戶。無論代表什么 user 是進行登錄驗證、資源分配的最小實體。
user 對資源的訪問通過兩個維度來控制。***個維度是 tenant 。 tenant 在 openstack 里面代表用戶和資源的集合。一個 tenant 下面可以容納多個 user ,而這些 user 只有可能訪問這個 tenant 里面的資源(虛擬機、鏡像、磁盤卷等等)。第二個維度是 role ,role 定義了承載了一組權利。一旦將 role 附加給了一個 user 這個 user 就具備了 role 所具備的權利。兩個維度是邏輯與的關系,在一起共同決定 user 是否能訪問一個資源。
service 指的是 openstack 里承載具體功能的服務。例如:
- Compute (Nova)
- Object Storage (Swift)
- Image Service (Glance)
- etc …
每一個 openstack 服務通常包含一個或多個 endpoint 。 endpoint 是一個網絡上可訪問的地址,通常是一個 URL 。這個 URL 指出了對應服務的 API 入口。
配置 openstack 環境變量
openstack 所有其他服務的客戶端都需要通過環境變量來獲知認證服務(也就是 keystone )的位置以及用于認證的用戶信息。為了方便使用,需要寫一個包含這些環境變量的腳本 openstackrc 并通過 source 命令引入這些環境變量。
- #!/bin/sh
- export OS_SERVICE_ENDPOINT="http://localhost:35357/v2.0"
- export OS_SERVICE_TOKEN=openstack
- export OS_AUTH_URL="http://localhost:5000/v2.0/"
- export OS_USERNAME=admin
- export OS_PASSWORD=admin
- export OS_TENANT_NAME=admin
這幾個參數的作用是:
OS_SERVICE_ENDPOINT
keystone 的管理地址,通常是 35357 端口
OS_SERVICE_TOKEN
驗證密令,也就是 keystone 配置文件里的 =admin_token=。相當于進行后臺管理用的一個驗證碼。
OS_AUTH_URL
其他服務調用 keystone 的地址,通常是 5000 端口
OS_USERNAME
普通用戶調用 openstack 接口時用的用戶名
OS_PASSWORD
與上面 OS_USERNAME 配對使用的密碼
OS_TENANT_NAME
用戶所要操作 Tenant 的名稱
創建用戶
通常情況下通過 keystone 創建用戶的基本流程是這樣的,
keystone-create-user-activity
然而,***次使用 keystone 時還沒有 tenant 和 role 存在。因此,在執行上述過程之前還需要先通過 keystone tenant-create來創建一個 tenant ;通過 keystone role-create 來創建一個 role 。openstack 有一個默認的約定:名為 admin 的 role 具備管理權限。
創建用戶會是今后經常性的操作并且步驟較多相對繁瑣。這里給出一個腳本來簡化這些的重復勞動,
- #!/bin/bash
- # filename : keystone-add-user.sh
- # created at : 2013-08-30 16:27:56
- # author : Jianing Yang <a href="mailto:jianingy%40unitedstack.com"><jianingy@unitedstack.com></a>
- until [ -z "$1" ]; do
- case "$1" in
- --tenant)
- shift
- opt_tenant=${1:-service}
- ;;
- --role)
- shift
- opt_role=${1:-admin}
- ;;
- --name)
- shift
- opt_name=$1
- ;;
- esac
- shift
- done
- # find tenant id, create a new one if not exist
- tenant_id=$(keystone tenant-get "$opt_tenant" | awk "/id/{print $4}")
- if [ -z "$tenant_id" ]; then
- keystone tenant-create --name "$opt_tenant" || exit 11
- tenant_id=$(keystone tenant-get "$opt_tenant" | awk "/id/{print $4}")
- [ -z "$tenant_id" ] && exit 11
- fi
- # find role id, create a new one if not exist
- role_id=$(keystone role-get "$opt_role" | awk "/id/{print $4}")
- if [ -z "$role_id" ]; then
- keystone role-create --name "$opt_role" || exit 22
- role_id=$(keystone role-get "$opt_role" | awk "/id/{print $4}")
- [ -z "$role_id" ] && exit 22
- fi
- # find user id, create a new user if not exist
- user_id=$(keystone user-get "$opt_name" | awk "/id/{print $4}")
- if [ -z "$user_id" ]; then
- keystone user-create --name "$opt_name" --pass "$opt_name" --email "$opt_name@localhost" --tenant_id "$tenant_id" || exit 33
- user_id=$(keystone user-get "$opt_name" | awk "/id/{print $4}")
- [ -z "$user_id" ] && exit 33
- fi
- # attach role to user
- keystone user-role-add --user_id "$user_id" --role_id "$role_id" --tenant_id "$tenant_id" | exit 44
使用這個腳本可以輕松地創建出***個用戶即管理員用戶,
- ./keystone-add-user.sh --tenant admin --role admin --name admin
注冊***個服務:keystone
每一個 openstack 的服務都要向 keystone 注冊自己的服務地址即 endpoint/。就連 /keystone 自身也不例外。這個注冊的過程需通過 keystone 客戶端來完成。
- pip install python-keystoneclient
- source openstackrc
- keystone service-create --name=keystone --type=identity --description="Identity Service"
- export KEYSTONE_SERVICE_ID=$(keystone service-list | awk '/keystone/{print $2}')
- keystone endpoint-create
- --region RegionOne
- --service-id=$KEYSTONE_SERVICE_ID
- --publicurl=http://localhost:5000/v2.0
- --internalurl=http://localhost:5000/v2.0
- --adminurl=http://localhost:35357/v2.0
#p#
TODO 部署計算服務: nova
nova 可以說是整個 openstack 系統的核心。負責整個虛擬機生命周期的管理以及周邊資源的調度。
安裝 nova
與 keystone 的安裝過程一樣,從 git 倉庫中下載源代碼并切換至穩定的 stable/grizzly 分支。
- git clone http://github.com/openstack/nova.git
- cd nova
- git checkout stable/grizzly
- pip install -r tools/pip-requires
配置及初始化
正如之前在 openstack 用戶體系的描述中提到的, nova 作為一個服務也需要創建一個與之對應的用戶,
- ./keystone-add-user.sh --tenant service --role admin --name nova
接下來將用戶的登錄信息寫入配置文件: etc/nova/api-paste.ini 。請對比下列內容進行修改。選項 auth_* 關系到keystone API 的訪問。 admin_* 則提供了用戶認證所需的信息。
- [filter:authtoken]
- paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
- auth_host = 127.0.0.1
- auth_port = 35357
- auth_protocol = http
- admin_tenant_name = service
- admin_user = nova
- admin_password = nova
- signing_dir = /tmp/keystone-signing
下面該配置 nova 本身了。以源碼包中的 etc/nova/nova.conf.sample 為基礎進行配置。將配置好的文件另存為=etc/nova/nova.conf= 。這里我們選用剛剛安裝的 libvirt 作為虛擬化后端。
- [DEFAULT]
- auth_strategy=keystone
- compute_driver = libvirt.LibvirtDriver
- sql_connection=mysql://root:openstack@localhost/nova
- debug=true
- verbose=true
- rabbit_host=localhost
- rabbit_port=5672
- rabbit_hosts=$rabbit_host:$rabbit_port
- rabbit_use_ssl=false
- rabbit_userid=guest
- rabbit_password=openstack
- rabbit_virtual_host=/
- rootwrap_config=etc/nova/rootwrap.conf
nova 中的很多操作需要 root 權限來執行。/nova/ 會使用 sudo 來執行這些操作。處于安全考慮 nova 使用被稱為 rootwrap 的機制來控制哪些命令可以被 sudo 以 root 權限執行。具體的規則源碼中的配置文件已經寫好,這里只需要修改下規則文件存放的路徑即可。請對比下列配置修改 etc/nova/rootwrap.conf 。
- [DEFAULT]
- # List of directories to load filter definitions from (separated by ',').
- # These directories MUST all be only writeable by root !
- filters_path=etc/nova/rootwrap.d,/usr/share/nova/rootwrap
***,初始化 nova 的數據庫,
- mysql -u root -p -e 'create database nova';
- bin/nova-manage --config-dir etc/ --config-file etc/nova/nova.conf db sync
注冊 nova 服務
為了讓其他服務能找到 nova 的所在,需要在 keystone 里注冊 nova 的 endpoint ,
- keystone service-create --name nova --type compute --description 'OpenStack Compute Service'
- export NOVA_SERVICE_ID=$(keystone service-list | awk '/nova/{print $2}')
- keystone endpoint-create --region RegionOne --service-id $NOVA_SERVICE_ID --publicurl 'http://127.0.0.1:8774/v2/%(tenant_id)s' --adminurl 'http://127.0.0.1:8774/v2/%(tenant_id)s' --internalurl 'http://127.0.0.1:8774/v2/%(tenant_id)s'
啟動服務
- bin/nova-api --config-dir etc/ --config-file etc/nova/nova.conf
- bin/nova-compute --config-dir etc/ --config-file etc/nova/nova.conf
- bin/nova-conductor --config-dir etc/ --config-file etc/nova/nova.conf
TODO 部署 openstack 管理前端:horizon
安裝
- git clone https://github.com/openstack/horizon
- cd horizon
- git checkout stable/grizzly
- pip install -r tools/pip-requires
配置及初始化
horizon 是一個基于 django 寫成的前端程序,其配置方式遵循 django 習慣。 horizon 的配置文件位于其源碼目錄下的openstack_dashboard/local/local_settings.py 。該文件可以基于同目錄下的 local_settings.py.example 進行配置。
- cd openstack_dashboard/local
- cp -v local_settings.py{.example,}
啟動服務
- python ./manage.py runserver 0.0.0.0:8000
服務啟動后就可以通過瀏覽器進行訪問了。