■ 中核能源科技有限公司 侯圣寶
編者按:關(guān)于OpenStack的部署有很多方法和社區(qū)項(xiàng)目,筆者公司采用了社區(qū)中的kolla項(xiàng)目作為部署OpenStack的方案,本文會(huì)詳細(xì)介紹使用kolla在基于傳統(tǒng)企業(yè)常用的vlan網(wǎng)絡(luò)環(huán)境下部署OpenStack生產(chǎn)環(huán)境的實(shí)際案例。

圖1 整體架構(gòu)拓?fù)鋱D
簡(jiǎn)單說(shuō)Kolla項(xiàng)目可以做到上百個(gè)節(jié)點(diǎn)開(kāi)箱即用,把OpenStack項(xiàng)目用到的所有組件都容器化,并且所有的組件都具備生產(chǎn)級(jí)別的HA功能,能實(shí)現(xiàn)單個(gè)或整體OpenStack項(xiàng)目平滑的升級(jí),可以說(shuō)解決了OpenStack的一大痛點(diǎn)。
Kolla分為一下幾個(gè)模塊,每個(gè)模塊做一件事情 :(1)Kolla,主要是負(fù)責(zé)Docker的鏡像制作;(2)kolla-Ansible負(fù) 責(zé) 容器的配置管理;(3)Kolla-Kubernetes,也是負(fù)責(zé)容器集群的配置管理。
本文我們主要采用kolla-ansible來(lái)進(jìn)行部署OpenStack。Kolla本身提供了生產(chǎn)級(jí)別的容器的鏡像,除非有定制化要求,否則完全可以直接使用。
筆者公司私有云項(xiàng)目公分兩個(gè)階段來(lái)進(jìn)行實(shí)施,第一階段先采用的5個(gè)物理節(jié)點(diǎn)來(lái)進(jìn)行試運(yùn)行和性能測(cè)試;第二階段逐步添加存儲(chǔ)和計(jì)算節(jié)點(diǎn)擴(kuò)大規(guī)模; 整體架構(gòu)如圖1所示。
1.服務(wù)器
整個(gè)云架構(gòu)由三臺(tái)控制節(jié)點(diǎn)和N個(gè)計(jì)算節(jié)點(diǎn)組成,為了能夠充分利用服務(wù)器資源,可以將三臺(tái)控制節(jié)點(diǎn)同時(shí)也作為計(jì)算節(jié)點(diǎn)來(lái)使用,對(duì)于作為計(jì)算節(jié)點(diǎn)的服務(wù)器,內(nèi)存容量和CPU的物理核心數(shù)盡量的高一些,以便能承載更多的業(yè)務(wù)。
2.存儲(chǔ)
私有云環(huán)境中可以選擇后端的存儲(chǔ)類(lèi)型很多,可以采用傳統(tǒng)的集中式存儲(chǔ)產(chǎn)品和技術(shù),比如NAS、iscsi等,也可以選擇ceph這樣的分布式存儲(chǔ)系統(tǒng)。
目前ceph與云環(huán)境的集成愈來(lái)愈成熟,其標(biāo)準(zhǔn)的S3接口方便與上層各類(lèi)應(yīng)用對(duì)接,再加上方便動(dòng)態(tài)伸縮、負(fù)載平衡、冗余容災(zāi)等特性,最終筆者選擇ceph作為云環(huán)境的后端存儲(chǔ),用來(lái)承載虛擬機(jī)文件、映像和卷的管理等。
在實(shí)際環(huán)境中,可以根據(jù)自身負(fù)載情況,選擇將ceph的監(jiān)控節(jié)點(diǎn)(monitor)與OpenStack的控制節(jié)點(diǎn)放在同一服務(wù)器上,數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)與計(jì)算節(jié)點(diǎn)放在同一服務(wù)器上,達(dá)到充分利用服務(wù)器資源的目的,而且可以使用SSD作為cache盤(pán)來(lái)提升性能。
3.網(wǎng)絡(luò)
整個(gè)網(wǎng)絡(luò)采用spineleaf架構(gòu),spine層與leaf層分別采用萬(wàn)兆光纖交換機(jī)進(jìn)行堆疊或者虛擬化技術(shù),對(duì)上與核心交換機(jī)、對(duì)下與服務(wù)器利用端口聚合技術(shù)形成全互聯(lián)網(wǎng)絡(luò)。
spin-leaf網(wǎng)絡(luò)架構(gòu)提供了解決橫向網(wǎng)絡(luò)連接的傳輸瓶頸,還提供了高度的擴(kuò)展性,隨著規(guī)模擴(kuò)大可以將leaf橫向不斷擴(kuò)展,它幾乎能適應(yīng)所有大中小型數(shù)據(jù)中心,當(dāng)然各位可以根據(jù)自己公司和業(yè)務(wù)情況選擇更適合自身的技術(shù)架構(gòu),如更小規(guī)模的云環(huán)境可以將spine與leaf合并起來(lái)也是一種經(jīng)濟(jì)選擇。
在二層網(wǎng)絡(luò)技術(shù)方面,由于筆者公司業(yè)務(wù)規(guī)模不是特別大,同時(shí)為了使現(xiàn)有業(yè)務(wù)和網(wǎng)絡(luò)架構(gòu)能夠盡量不做改動(dòng)的平滑遷移,因此沒(méi)有使用流行的VXLAN,而還是采用了之前一直使用vlan網(wǎng)絡(luò)。

表1 網(wǎng)絡(luò)規(guī)劃表
服務(wù)器網(wǎng)絡(luò)方面,由于筆者公司選擇將計(jì)算節(jié)點(diǎn)與存儲(chǔ)節(jié)點(diǎn)融合在一起,因此服務(wù)器會(huì)有多組不同功能的網(wǎng)卡進(jìn)行配置:
存儲(chǔ)網(wǎng)絡(luò):負(fù)責(zé)ceph存儲(chǔ)節(jié)點(diǎn)之間的數(shù)據(jù)同步,由兩個(gè)萬(wàn)兆網(wǎng)卡做bond,分別連上到堆疊的leaf交換機(jī),實(shí)現(xiàn)鏈路冗余和帶寬負(fù)載。
外部網(wǎng)絡(luò):負(fù)責(zé)虛擬機(jī)與外部通信的網(wǎng)絡(luò),由兩個(gè)千兆/萬(wàn)兆網(wǎng)卡做bond,分別上連到堆疊的leaf交換機(jī),實(shí)現(xiàn)鏈路冗余和帶寬負(fù)載,如果采用vlan方式,該leaf交換機(jī)的聚合端口應(yīng)該配置為trunk模式。
API網(wǎng)絡(luò):負(fù)責(zé)opensack個(gè)組件進(jìn)行通信的,本例中該網(wǎng)絡(luò)同時(shí)融合了各個(gè)組件負(fù)載均衡和Dashboard訪(fǎng)問(wèn)界面,由兩個(gè)千兆/萬(wàn)兆網(wǎng)卡做bond,分別上聯(lián)到堆疊的leaf交換機(jī),實(shí)現(xiàn)鏈路冗余和帶寬負(fù)載。
管理網(wǎng)絡(luò):負(fù)責(zé)部署管理OpenStack物理節(jié)點(diǎn),由一個(gè)千兆網(wǎng)卡上聯(lián)到管理網(wǎng)絡(luò)交換機(jī)上,可以根據(jù)實(shí)際情況同其他網(wǎng)絡(luò)融合。
目前以5個(gè)節(jié)點(diǎn)為例,服務(wù)器系統(tǒng)為CentOS 7.3,將所有網(wǎng)卡根據(jù)前面規(guī)劃,做好bond,接口整理網(wǎng)絡(luò)規(guī)劃如表1所示。
1.部署節(jié)點(diǎn)上環(huán)境
部署節(jié)點(diǎn)用來(lái)控制和部署OpenStack,kolla項(xiàng)目部署OpenStack采用kollaansible的方式,即通過(guò)ansible在各個(gè)物理節(jié)點(diǎn)上部署裝有OpenStack各個(gè)項(xiàng)目的容器。因此要保證部署節(jié)點(diǎn)已經(jīng)安裝了ansible并做了到各個(gè)節(jié)點(diǎn)ssh免密鑰等必備條件。
2.獲取docker鏡像
此前可以通過(guò)http://tarballs.OpenStack.org/kolla/images來(lái) 獲取kolla的docker鏡像,但是從pike版開(kāi)始,所有的鏡像全移到了https://hub.docker.com/u/kolla/官方源中,目的是通過(guò)kolla-ansible安裝的時(shí)候可以直接去下載images,免去還要建立本地源的麻煩。但是由于image較大有時(shí)對(duì)于目前在國(guó)內(nèi)的很多企業(yè)網(wǎng)絡(luò)環(huán)境來(lái)說(shuō)訪(fǎng)問(wèn)官方源會(huì)很慢,造成了部署不便。
為了解決這個(gè)問(wèn)題,建議還是自行在部署節(jié)點(diǎn)建立docker源,那么怎么知道pike需要哪些image呢,如果訪(fǎng)問(wèn)官方docker源的話(huà),會(huì)發(fā)現(xiàn)kolla的各種image都混合在一起,很難找全。
我們可以通過(guò)http://tarballs.OpenStack.org/kolla下載pike版本的kolla。因?yàn)閗olla本身是用來(lái)生成image的,因此解壓縮后在其中的docker文件夾下就包含了kolla所支持的所有組件名稱(chēng),由于我們要使用centos的 source方式部署,因此image的格式就是centos-source-[組件名稱(chēng)],大家可以通過(guò)腳本把這些組件名稱(chēng)提取出來(lái),然后就可以將image批量pull下來(lái),再push到我們自己建立的docker源上,關(guān)于docker image的pull和push,以及自己建立本地docker源我們就不討論了。

表2 節(jié)點(diǎn)磁盤(pán)配置
各節(jié)點(diǎn)最小化安裝好OS,網(wǎng)絡(luò)配置好之后,yum update一下系統(tǒng)并重啟,使其保持最新內(nèi)核。
本項(xiàng)目我們使用ceph作為后端存儲(chǔ),需要對(duì)存儲(chǔ)節(jié)點(diǎn)的硬盤(pán)做初始化。
筆者公司采取SSD與SATA混 合 使 用,SSD用 作cache和日志盤(pán),SATA作為后端數(shù)據(jù)存儲(chǔ)。
如果服務(wù)器里面有RAID卡,為了獲得更好性能需要將每個(gè)磁盤(pán)都配置成RAID 0。
每個(gè)節(jié)點(diǎn)磁盤(pán)配置如表2所示。
1.緩存盤(pán)分區(qū)準(zhǔn)備
用作ceph的磁盤(pán)分區(qū)必須要指定LABLE,這樣在部署的時(shí)候kolla才能夠通過(guò)LABLE識(shí)別磁盤(pán),并確定這個(gè)磁盤(pán)的用途
parted /dev/sdb -s --mklabel gpt mkpart KOLLA_CEPH_OSD_CACHE_BOOTSTRAP 1 -1
2.數(shù)據(jù)和日志盤(pán)分區(qū)準(zhǔn)備
日志盤(pán)可以與數(shù)據(jù)盤(pán)同屬一個(gè)磁盤(pán),也可以指定外部日志磁盤(pán),為了提升性能筆者使用一個(gè)獨(dú)立的SSD作為日志盤(pán),日志盤(pán)的命名與數(shù)據(jù)盤(pán)是有一定關(guān)系的,有多個(gè)數(shù)據(jù)盤(pán)的話(huà),編號(hào)逐漸增1。
parted /dev/sdd -s --mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_1 1 -1
parted /dev/sde -s --mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_2 1 -1
parted /dev/sdc -s --mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_1_J 1-50000
parted /dev/sdc -s --mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_2_J 50000 -100000
3.磁盤(pán)優(yōu)化
為了使磁盤(pán)在ceph環(huán)境下獲得更好的性能,需要修改每個(gè)磁盤(pán)以下參數(shù):
echo “8192” > /sys/block/sdb/queue/read_ahead_kb
echo “deadline” >/sys/block/sdb/queue/scheduler
在部署節(jié)點(diǎn)上通過(guò)http://tarballs.OpenStack.org/kollaansible/下載穩(wěn)定版本的kolla-ansible,筆者生產(chǎn)環(huán)境用的ocata版本,之后升級(jí)到了pike版本,新部署的可以直接下載pike版本進(jìn)行安裝。
將下載的kollaansible/etc/kolla目錄復(fù)制到/etc下。在kolla下面有兩個(gè)文件 globals.yml和passwords.yml,一個(gè)是部署OpenStack環(huán)境配置文件,包括指定安裝源,定義安裝哪些OpenStack組件等功能,一個(gè)是OpenStack中所用到的所有密碼。
1.全局globals配置
編 輯/etc/kola/globals.yml,里面可以定義開(kāi)啟哪些OpenStack組件,可以根據(jù)自己實(shí)際情況,來(lái)選擇要安裝的組件。其中選項(xiàng)做如下修改,如果有注釋需要去掉:
kola_install_type:“source” #指定部署方式,我們采用source方式
OpenStack_release:“pike” #指 定 OpenStack版本
kola_internal_vip_address: “172.16.6.100”#此ip必須沒(méi)有被分配
docker_registry:“172.16.245.20:4000” #本地docker源地址,如果使用公有源可以不配置此項(xiàng)
docker_namespace:“kolla” #指定docker源名稱(chēng)
network_interface:“em2” #api,存儲(chǔ)、網(wǎng)絡(luò)接口
storage_interface:"bond0"
cluster_interface:"bond0"
tunnel_interface:"bond0"
neutron_external_interface: “em4”
neutron_plugin_agent:“l(fā)inuxbrige”
enable_ceph : “yes” #開(kāi)啟ceph
enable_cinder: “yes”#開(kāi)啟cinder功能
enable_openvswitch:“no”
ceph_enable_cache:“yes” #啟用ceph緩存
glance_backend_ceph:“yes” #指定glance后端使用ceph存儲(chǔ)
2.生成OpenStack密碼
cd kolla-ansible/tools
./generate_passwords.py
生成的密碼會(huì)填充到/etc/kolla/passwords.yml中。
3.配置ansible主機(jī)文件
編 輯kolla-ansible/a n s i b l e/i n v e n t o r y/multimode文 件,根 據(jù) 各個(gè)節(jié)點(diǎn)功能在[control]、[network]、[compute]、[monitoring]、[storage]選項(xiàng)下將OpenStack節(jié)點(diǎn)信息填入,這樣部署的時(shí)候可以通過(guò)指定這個(gè)文件來(lái)部署節(jié)點(diǎn)信息,當(dāng)然這些節(jié)點(diǎn)的主機(jī)名需要事先通過(guò)DNS或者h(yuǎn)osts文件進(jìn)行解析。比如需要三個(gè)控制節(jié)點(diǎn),因此在[control]項(xiàng)下面只寫(xiě)3個(gè)node信息。
[control]
node1
node2
node3
4.配置neutron網(wǎng)絡(luò)文件
因?yàn)楣P者公司網(wǎng)絡(luò)采用vlan方式,默認(rèn)kollaansible只開(kāi)啟了vxlan和flat模式,因此需要修改neutron的ml2_conf.ini.j2等配置文件添加vlan功能,與此端口對(duì)應(yīng)的交換機(jī)端口應(yīng)配置成trunk模式。
首先開(kāi)啟vlan支持
vi kolla-ansible/ansible/group_vars/all.yml
#修改如下選項(xiàng),添加vlan
n e u t r o n_t e n a n t_n e t w o r k_t y p e s:"vxlan,flat,vlan"
添加vlan網(wǎng)絡(luò)所在端口,physnet1默認(rèn)對(duì)應(yīng)著em4外部網(wǎng)絡(luò)接口
vi kolla-ansible/ansible/roles/neutron/templates/ml2_conf.ini.j2
network_vlan_ranges =physnet1
flat_networks = *
由于kolla是基于docker運(yùn)行的,因此在OpenStack節(jié)點(diǎn)上需要預(yù)先配置好docker環(huán)境。kollaansible提供了這個(gè)功能。進(jìn)入部署節(jié)點(diǎn)上kollaansible/tools文件夾,執(zhí)行如下命令,來(lái)對(duì)節(jié)點(diǎn)初始化。
這個(gè)過(guò)程會(huì)安裝pip,并通過(guò)pip安裝一些組件和相應(yīng)版本的docker等,因此這時(shí)候所有OpenStack節(jié)點(diǎn)建議能夠連接到互聯(lián)網(wǎng)。如果順利執(zhí)行完畢不出現(xiàn)報(bào)錯(cuò),我們?cè)偻ㄟ^(guò)prechecks參數(shù)來(lái)進(jìn)一步驗(yàn)證環(huán)境。
cd kolla-ansible/tools
#準(zhǔn)備環(huán)境
./kolla-ansible –i ../ansible/inventory/multimode bootstrapservers
#驗(yàn)證環(huán)境
./ kolla-ansible –i ../ansible/inventory/multimode prechecks
在上述的環(huán)境都準(zhǔn)備好之后就可以通過(guò)kollaansible進(jìn)行部署了,過(guò)程很簡(jiǎn)單,只需執(zhí)行一條命令,然后等待即可,不需要人為參與。
cd kolla-ansible/tools
./kolla-ansible –i ../ansible/inventory/multimode deploy
待執(zhí)行完畢后不出現(xiàn)錯(cuò)誤,那么整個(gè)部署就完成了,可以在瀏覽器訪(fǎng)問(wèn)管理界面http://172.16.6.100,進(jìn)行一系列的管理操作。登錄名為admin,密碼存儲(chǔ)在passwords.yml里 面 的keystone_admin_password項(xiàng)中。
至此,整個(gè)OpenStack部署完成。容易出錯(cuò)的地方就是前期的環(huán)境部署,主要是因?yàn)橄到y(tǒng)有些軟件包與pip安裝的docker某些組件版本沖突,因此盡量最小化安裝OS。