OpenStack 是一套用來管理虛擬機器的平台站羣軟件。它不是一個單一的站羣軟件,而是整合了很多個元件用來協同合作。簡單的來説,譬如有十台站羣服務器,在 VMware 的情況下,我們在每台站羣服務器上安裝 esx 或者 esxi,然後裝一台 vcenter,在 vcenter 的管理介面裏把十台站羣服務器的 esx 通過域名或者 ip 加入,就能在 vcenter 裏面統一管理。類似的,紅帽也有 virsh 這種管理虛擬機器的程式。
在這裏我不介紹其他的雲平台的管理站羣軟件,只是介紹如何從技術角度來使用 OpenStack 。如果要作為生產環境的話,你還需要考慮更多,譬如架構,互聯網拓撲,儲存的方式,節點的分佈等等。
在本篇文章裏,我將介紹採用 ec2 相容認證的方式 。所有元件安裝在一台 controller 上。
關鍵字定義
控制端:類似 vcenter 的管理系統。
節點:類似安裝了 esx 的站羣服務器。
nova 元件:安裝在節點上,讓節點能按照控制端的命令來操作節點上的虛擬機器或者儲存。
glance 元件:用來管理鏡像站羣。
環境準備
ubuntu 11.10,站羣服務器雙網絡卡
步驟
安裝完基本的操作系統後
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install bridge-utils #安裝網橋站羣軟件
配置互聯網介面
在這裏我的架構是 eth0 連線了外網,即我們可以訪問的網口。 eth1 做了網橋,和節點之間通過一個交換機連線。這樣的好處是,內部節點和控制器的流量都走 br100 的交換機,而不會影響虛擬機器上的應用使用的互聯網。
$ sudo vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.200.21
netmask 255.255.255.0
network 192.168.200.0
broadcast 192.168.200.255
gateway 192.168.200.10
auto br100
iface br100 inet static
bridge_ports eth1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
address 10.200.200.2
netmask 255.255.255.0
$ sudo /etc/init.d/networking restart
初期準備工作做好,接下來就是要安裝關於 nova,glance 等元件
$ sudo apt-get install -y rabbitmq-server #安裝 MQ 訊息元件
$ sudo apt-get install -y python-greenlet python-mysqldb #安裝 Python dependencies
接下來安裝各個 nova 元件及依賴
$ sudo apt-get install nova-volume nova-vncproxy nova-api nova-ajax-console-proxy
$ sudo apt-get install nova-doc nova-scheduler nova-objectstore
$ sudo apt-get install nova-network nova-compute
$ sudo apt-get install glance
安裝 euca2ools 和 unzip
$ sudo apt-get install -y euca2ools unzip
接下來我們安裝資料庫,這裏我選擇了 MySQL,其實個人覺得 PostgreSQL 更好。
$ sudo su –
# MYSQL_PASS=nova 設定 mysql 的密碼和 nova 資料庫的密碼
# cat <
>mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASS
>mysql-server-5.1 mysql-server/start_on_boot boolean true
>MYSQL_PRESEED
# apt-get install -y mysql-server
# exit 退出 root 環境
$ sudo sed -i ‘s/127.0.0.1/0.0.0.0/g’ /etc/mysql/my.cnf 修改 my.cnf 配置檔案
$ sudo service mysql restart
$ MYSQL_PASS=nova 在普通使用者環境下把密碼再次設定一下變數
$ NOVA_PASS=notnova 這是 nova 資料庫的密碼
$ sudo mysql -uroot -p$MYSQL_PASS -e ‘CREATE DATABASE nova;’ 建立一個名字為 nova 的資料庫,這裏建議新手使用 nova 的名字,如果這裏換別的名字,那麼在 nova 的配置檔案裏面也需要更改
$ sudo mysql -uroot -p$MYSQL_PASS -e “GRANT ALL PRIVILEGES ON *.* TO ‘nova’@’%’ WITH GRANT OPTION;”
$ sudo mysql -uroot -p$MYSQL_PASS -e “SET PASSWORD FOR ‘nova’@’%’ = PASSWORD(‘$NOVA_PASS’);”
至此,nova,glance 的安裝部分完成,接下來是配置。
nova 配置
$ sudo vi /etc/nova/nova.conf
–dhcpbridge_flagfile=/etc/nova/nova.conf
–dhcpbridge=/usr/bin/nova-dhcpbridge
–logdir=/var/log/nova
–state_path=/data/openstack/nova 這裏的/data/openstack/nova 是我新建的一個卷和目錄,確保你有這個,並且要屬於 nova 使用者,或者你也可以使用他的預設設定
–instances_path=/data/openstack/nova/instances 修改了預設存放 instances 的地方
–lock_path=/var/lock/nova
–force_dhcp_release=True
–use_deprecated_auth
–iscsi_helper=tgtadm
–verbose
–scheduler_driver=nova.scheduler.simple.SimpleScheduler
–network_manager=nova.network.manager.FlatDHCPManager
–my_ip=10.200.200.2 這是我的內網 ip 地址
–public_inter>
–sql_connection=mysql://nova:notnova@localhost/nova 剛才建立的資料庫
–libvirt_type=kvm
–api_paste_config=/etc/nova/api-paste.ini
–image_service=nova.image.glance.GlanceImageService
–ec2_dmz_host=192.168.200.21
–ec2_url=http://192.168.200.21:8773/services/Cloud
–rabbit_host=localhost
–glance_api_servers=10.200.200.2:9292
–flat_network_bridge=br100
–flat_inter>
–flat_network_dhcp_start=10.200.200.51 指定從 instances 分配從 51 開始,但貌似這個選項不起作用
–fixed_range=10.200.200.0/24 這個選項指定 instances 的網段
–flat_injected=False
–multi_host=1 使用 multi_host,即以後可以在節點上也使用 nova-network
–libvirt_use_virtio_for_bridges 使用 virtio 做 instances 的網絡卡模式
然後是 glance 的:
$ sudo vi /etc/glance/glance-api.conf
修改 filesystem_store_datadir 引數,來指定你需要存放 images 的目錄,當然屬主也要改成 glance 使用者。
$ sudo vi /etc/glance/glance-registry.conf
這個檔案可以選修改 sql_connection 引數來指定你的資料庫。
如果你要修改,使用 mysql 裏面的資料庫,請確保在 mysql 裏面建立了一個相對應的資料庫
sql_connection = mysql://nova:notnova@localhost/glance
這是我的配置,我在 mysql 建立了一個 glance 的資料庫
$ sudo chown -R root:nova /etc/nova
改變一下/etc/nova 的屬主
$ sudo chmod 640 /etc/nova/nova.conf
重啓各個服務
$ sudo restart libvirt-bin
$ sudo restart nova-network
$ sudo restart nova-compute
$ sudo restart nova-api
$ sudo restart nova-objectstore
$ sudo restart nova-scheduler
$ sudo restart glance-registry
$ sudo restart glance-api
注意:我們這裏沒有起 nova-volume,是因為雖然我們安裝了 volume,但是 volume 需要單獨的一個 vg 來使用,我們現在還沒配置 volume,所以起不來。
這裏可能 network 服務和 compute 沒法起來,先暫時不要去管。
接下去,我們做配置 nova 的執行環境了
$ sudo nova-manage db sync
nova-manage user admin
在這裏我們可以建立一個使用者,如
$ sudo nova-manage user admin test
建立成功螢幕上會返回下面這樣的輸出:
export EC2_ACCESS_KEY=d6aa7747-4324-4abc-9604-4f7d6a2f8f3f
export EC2_SECRET_KEY=2b204b75-da2d-47b8-ba7a-611d71f0ecbf
nova-manage project create
建立一個專案,屬於剛才我們建的那個使用者 如:
$ sudo nova-manage project create test-proj test
nova-manage network create –help
建立一個例項的互聯網,如:
$ sudo nova-manage network create –label=test-net –fixed_range_v4=10.200.200.0/24 –num_network=1 –network_size=256
再次啓動剛才失敗的服務
$ sudo start nova-network
$ sudo start nova-compute
$ sudo start nova-scheduler
怎麼樣,成功了吧。
另外,在起每個服務的時候,最好看一下日誌,譬如 sudo tail -f /var/log/nova/nova-network 來確定有沒有報錯,也可以用 ps aux | grep [n]ova-network 來確認服務有沒有開啓。如果起服務失敗,你確認好原因,修改好以後,需要用 sudo start 而不是 sudo restart 來起
好了。這樣計算的環境就部署好了。我們可以用命令來看一下狀態:
$ sudo nova-manage service list
$ sudo nova-manage network list
如此這般。
接下來建立證書,以方便我們使用 euca 工具
$ cd
$ mkdir creds
$ sudo nova-manage project zipfile test-proj test creds/novacreds.zip
$ unzip creds/novacreds.zip -d creds/
$ source creds/novarc
注意每次你重新登入shell的時候,需要source一下這個認證檔案才能使用euca;當然你也可以把novarc的內容>>到你的使用者 profile 檔案或者 bashrc
OK,完成,我們可以用工具來看一下
$ euca-describe-availability-zones verbose
VAILABILITYZONE nova available
AVAILABILITYZONE |- nova-test
AVAILABILITYZONE | |- nova-network enabled 🙂 2011-10-17 04:45:44
AVAILABILITYZONE | |- nova-compute enabled 🙂 2011-10-17 04:45:45
AVAILABILITYZONE | |- nova-scheduler enabled 🙂 2011-10-17 04:45:45
至此,成功啓用了服務。當你發現服務不能正常使用時,用 ps aux | grep nova 檢查一下服務有沒有開啓,並需要詳細觀察/var/log/nova/目錄下的各個服務的日誌檔案,這樣才能獲得更進一步的資訊。
接下來我們可以用 kvm 來建立一個 image 鏡像站羣
$ sudo apt-get install kvm-pxe
安裝一下這個,否則執行 kvm 的時候會有個警告
$ kvm-img create -f raw server.img 5G
$ sudo kvm -m 1024 -cdrom rhel5.iso -drive file=server.img,if=virtio,index=0 -boot d -net nic -net user -nographic -vnc :0
這裏我們使用 RHEL 5 的 iso,執行完這個命令,可以用 vnc 連線。
在你的本機連線站羣服務器:ssvncviewer 192.168.200.21 :0
開啓 vnc 你就可以看到安裝介面。
安裝完以後,把下面一段寫入 rhel 鏡像站羣的/etc/rc.local 的開頭:
depmod -a
modprobe acpiphp
# simple attempt to get the user ssh key using the meta-data service
mkdir -p /root/.ssh
echo >> /root/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep ‘ssh-rsa’ >> /root/.ssh/authorized_keys
echo “AUTHORIZED_KEYS:”
echo “************************”
cat /root/.ssh/authorized_keys
echo “************************”
儲存退出,這樣 image 就做好了。
使用 glance 上傳鏡像站羣
$ glance –verbose add name=”rhel5″ disk_format=raw is_public=true < server.img
同時你應該觀察/var/log/glance/registry 和 api 的 log 。成功之後,用
$ glance index
看看鏡像站羣列表。
啓動你的例項
$ euca-describe-images
檢視你現在可用的 image,輸出類似下面這樣:
IMAGE ami-00000003 server.img
記住這裏 ami-000000003 這個 image 號。
$ euca-run-instances -t m1.tiny ami-00000003
啓動 ami-00000003 鏡像站羣的例項。-t 指明瞭例項的型別,型別規定了 cpu,內存,磁碟大小等資訊。
觀察/var/log/nova/nova-api.log nova-scheduler.log,nova-compute,nova-network.log 的輸出資訊,同時你也可以使用 vnc 連線 serverip:0 來看例項的 console 。
用命令 $ euca-describe-instances 來檢視你目前的例項情況。第一次啓動例項會比較慢,因為需要把 image 從 glance 拷貝到 nova 下的例項目錄。
由於 nova 目前發展的很快,diablo 的 release 版本功能可以完成日常的一些需求。但是開發版本的 nova 可以更好的結合 keystone,novaclient,dashboard 等一些其他的專案,使得 OpenStack 更加健全。有興趣的朋友,可以在生產環境使用 repo 的安裝方式,在測試環境測試開發版本。我本人由於在生產環境中使用了 git 方式安裝的開發版本,因此後續更加完善的整合,我都將以開發版本的形式出現。當然使用開發版本的話,會有更多的煩惱,但也同樣有更多的樂趣和動手的實踐,能更進一步瞭解其工作的原理機制。