用Kolla在阿里雲部署10節點高可用OpenStack
為展現 Kolla 的真正實力,我在阿里雲使用 Ansible 自動建立 10 臺虛機,部署一套多節點高可用 OpenStack 叢集!
前言
上次 Kolla 已經表示了要打 10 個的願望,這次我們就滿足它。
通過本期內容,你將看到:
- 如何使用阿里云云命令列(Cloud Shell)
- 如何使用 Ansible 建立阿里雲資源
- Kolla 多節點部署配置說明
- OpenStack 高可用架構
本期內容仍然是乾貨滿滿,寫文章,調指令碼,剪視訊,不但花時間,還要在 阿里雲 花錢租雲伺服器,真的費了不少精力,所以如果本文對你有所幫助,請務必點贊支援!謝謝。
操作過程仍可在 B站觀看視訊
準備工作
使用 Cloud Shell
一次性建立 10 臺虛機,從介面一個個的點就太無聊了。所以我們要想辦法讓這個過程自動化地完成。
第一個念頭就是用 Python 去呼叫 API,於是直奔 開發者工具 頁面而去,卻發現阿里雲提供了網頁版的命令列工具:Cloud Shell,使用起來更加方便。
啟動 Cloud Shell 會自動為你建立一個虛機,裡面不但內建了連線阿里雲的 CLI 工具,而且因為是登入後啟動,它自動把認證也處理了。也就是說我們直接就可以開始使用了,非常方便。
具體請參考官方文件:什麼是雲命令列?
不僅如此,為了讓大家更好地掌握這些工具的用法,還提供了互動式的 實驗教程,花上幾分鐘,也許再花上幾分錢,就能上手實驗。
在實驗了 使用 Ansible 管理雲資源 這個教程之後,決定就採用這個方法了。
CloudShell 的操作內容較多,單獨錄了一期 視訊介紹。
準備容器映象
這次部署多節點,比前幾次只部署 All-In-One
節點新增了 Cinder
儲存服務,所以把要用到的映象都提前構建好。
關於 Kolla 構建 Docker 映象的過程以後再詳述。
容器映象仍然使用阿里雲的容器映象服務,儲存在 華東2(上海)
地區。
值得注意的是,上一期內容中我在 華東1(杭州)
地區測試,跨地區從公網地址拉取映象,速度也還不錯。但是本次測試只在部署節點分配了公網 IP,其餘節點都不會分配公網 IP,也就沒法訪問公網資源了。
一個解決辦法是隻在 華東2(上海)
地區測試,這樣可以配置私網地址。這樣限制較大。
另一個比較通用的辦法是先在部署節點上搭建一個私有的 registry 作為中轉,就和使用 davycloud-openstack-stein.iso
安裝的 Deploy Node 一樣。
最終採取的是把 registry 配置成 PROXY
模式,這樣就不用事先把映象 push 到 registry 中了。
# deploy.yml 中的內容
- name: Start docker registry
docker_container:
name: registry
restart_policy: always
image: registry:2
ports:
- 4000:5000
volumes:
- registry:/var/lib/registry
env:
REGISTRY_PROXY_REMOTEURL: "https://registry.cn-shanghai.aliyuncs.com"
編寫 Ansible 劇本
參考上面的教程完成。
為方便使用,指令碼放在了 阿里雲 Code 上:倉庫地址
目標說明
Kolla 角色說明
Kolla 在部署 OpenStack 階段,按職責分為 5 種角色:
- control,控制節點
- network,網路節點
- compute,計算節點
- storage,儲存節點
- monitoring,監控節點(本次未涉及)
實際 1 個節點可以有 1 個或多個角色。比如,All-In-One
安裝時,一個節點就充當了所有角色。
實際這裡的角色對應的是 Ansible 中的主機分組概念。
節點上最終會安裝哪些服務(也就是啟動哪些容器),最終由啟用的各個功能模組綜合決定而成。例如,如果啟用了 cinder
,則 cinder-api
服務會安裝在所有的 control
控制節點上,而 cinder-volume
服務會安裝在所有的 storage
儲存節點上。
除此之外,還需要:
- 1 個部署節點,即安裝
Kolla-Ansible
的節點 - 1 個 docker 容器映象的 registry
在我提供的 ISO 光盤裡,系統安裝時選擇了 Deploy Node
就會自動安裝這些。
如果是平常部署,任選一個機器充當部署節點即可,部署節點本身也可以是控制或計算或儲存。
這次在阿里雲上,我們單獨建立一個虛機來當部署節點。
多節點角色分配
10 個節點的角色分配情況:
- 控制節點的數量需要是奇數,設定為 3 個
- 網路節點是安裝 Neutron agent 的地方,如果啟用了 haproxy / keepalived,浮動 IP 也是在這些節點上啟動,本次設定為 2 個
- 儲存節點我們本次需要安裝 Ceph,預設至少需要 3 個節點
- 計算節點是最終啟動虛機的地方,正常環境下應該是數量最多的,測試只需要 2 個就夠了
注意: 阿里雲上的虛機不支援 keepalived,所以這次無法啟用 haproxy。
建立資源
本節操作在 Cloud Shell 中進行。
下載專案檔案
進入雲命令列後直接執行:
git clone https://code.aliyun.com/davycloud/kolla-openstack.git
cd kolla-openstack/ansible
配置資源
配置資訊都在 kolla-openstack/ansible/group_vars/all
檔案中,根據情況修改即可。
預設配置會建立 11 臺搶佔式例項,對應上面的規劃:
- master: 1 臺,用來安裝 kolla-ansible,部署環境
- control: 3 臺,用來部署 OpenStack 的控制節點
- network: 2 臺,用來部署 OpenStack 的網路節點
- storage: 3 臺,用來部署 OpenStack 的儲存節點
- compute: 2 臺,用來部署 OpenStack 的計算節點
建立資源
執行建立資源的劇本:
cd ~/kolla-openstack/ansible
ansible-playbook create.yml
檢查資源建立情況
劇本完成後可以在頁面上看到資源的建立情況。
同時 ~/kolla-openstack/ansible
目錄下會生成一個 hosts
檔案,記錄所有建立的例項的私網地址和 hostname
.
注意: 我本意是將此
hosts
檔案直接複製到部署節點的/etc/hosts
.但是這裡遇到了阿里雲 ansible 模組的一個 bug. 其影響就是沒有辦法在批量建立例項時按序生成
hostname
,例如:control01, control02, control03.所以
hosts
檔案中同類型主機名都是一樣的,需要在後面手動修改。
配置 Kolla-Ansible 部署節點
在虛機資源建立完成後,首先需要配置的是部署節點。它是這批虛機中唯一預設建立了公有 IP 的,所以可以直接在 Cloud Shell 中操作。其它節點只有私有網路,必須通過它來操作。
動態 inventory
因為每次建立虛機的時候 IP 地址都是不確定的,不可能提前寫在 Ansible 的劇本中。而每次如果手動去修改編輯主機資訊,又很不方便。
所以 Ansible 中有一個動態 inventory 的功能,通過呼叫指令碼來動態獲取主機資訊。
阿里雲把這個動態 inventory 指令碼也為我們寫好了。這個指令碼所在專案開源託管在 GitHub 中,下載地址 時不時的無法訪問,我就一併放在了自己的這個專案中,也就是 ~/kolla-openstack/ansible/alicloud.py
這個指令碼,同時執行它需要一個配置檔案,就是和它同目錄的 alicloud.ini
目前這個動態 Inventory 還在被官方整合的過程中,需要先手動安裝依賴:
pip install ansible_alicloud_module_utils
執行 deploy.yml
劇本
這樣,我們每次就無需修改程式碼,直接執行下面的劇本就可以了:
chmod +x ~/kolla-openstack/ansible/alicloud.py
ansible-playbook -i ~/kolla-openstack/ansible/alicloud.py deploy.yml -u root -k
執行命令後提示輸入密碼: Test12345
密碼是在
~/kolla-openstack/ansible/group_vars/all
中設定
該劇本會完成以下任務:
- 安裝 Ansible 和 Kolla-Ansible
- 啟動 registry 並設定映象源
- 生成 SSH 金鑰
- 拷貝 Kolla-Ansible 的配置檔案到
/root
目錄 - 執行
kolla-genpwd
執行完此步驟後,我們仍然需要和以前一樣通過 SSH 登入到部署節點,完成後續的 OpenStack 安裝任務。
雖然我們可以在 Cloud Shell 中遠端操作部署節點來執行部署任務,但是基於下面原因:
- 整個部署比較耗時,這個臨時虛機並不穩定
- 多節點部署也是比較靈活的,有些配置不可避免需要根據情況設定,再套一層 ansible 沒必要
- 即使針對一種場景寫 ansible 劇本除錯都要花時間,意味著多花租伺服器的錢…
因此後面的操作將繼續手動執行
執行成功後,在 /root
目錄下會有以下檔案:
all-in-one # 本次用不上
bootstrap.yml # 用來初始化其它節點的 Ansible 劇本
hosts # 建立資源時生成的 hosts 檔案
multinode # Kolla-Ansible 多節點的 Inventroy 檔案
修改 hosts
檔案
編輯 hosts
檔案,把其中的 hostname
按照主機的角色進行修改:
172.16.1.31 control01
172.16.1.32 control02
172.16.1.33 control03
172.16.1.34 network01
172.16.1.35 network02
...
把 hosts
內容複製到 /etc/hosts
中:
cat hosts >> /etc/hosts
配置 multinode
編輯 multinode
檔案,把其中的 hostname
按照主機的角色分組進行填寫:
[control]
control01
control02
control03
[network]
network01
network02
[compute]
compute01
compute02
compute03
[monitoring]
#monitoring01 # 暫不支援
[storage]
storage01
storage02
storage03
# 這下面的所有內容都不要動了!!
使用 Kolla-Ansible 安裝多節點環境
以下的操作都是在部署節點上執行
下發 SSH 公鑰
為了方便 Ansible 無密碼方式連線各個節點,需要先把部署節點的 SSH 公鑰下發到各個節點。
因為節點數量不多,而且密碼都是固定的,所以這裡用 sshpass
手動執行完成:
sshpass -p Test12345 ssh-copy-id control01
sshpass -p Test12345 ssh-copy-id control02
...
sshpass -p Test12345 ssh-copy-id storage03
使用 Ansible 命令測試各節點的連通情況:
ansible -i multinode -m ping all
所有節點都應該能正常回應。
執行 bootstrap.yml
劇本
通過 ansible-playbook
命令執行 bootstrap.yml
劇本:
ansible-playbook -i multinode bootstrap.yml
該劇本會初始化各個節點,為它們安裝上 docker
等必需軟體,詳情可以檢視劇本的內容。
配置 /etc/kolla/globals.yml
需要修改的配置項如下:
# Valid option is Docker repository tag
#openstack_release: ""
openstack_release: "train"
#kolla_internal_vip_address: "10.10.10.254"
kolla_internal_vip_address: "172.16.1.33"
docker_registry: "172.16.1.30:4000"
docker_namespace: "davycloud"
#docker_registry_insecure: "yes"
# 不啟用 HAProxy
enable_haproxy: "no"
# 啟用 ceph
enable_ceph: "yes"
# 啟用 cinder
enable_cinder: "yes"
需要注意的地方:
kolla_internal_vip_address
必須填寫部署節點真實的私網地址docker_registry
必須配置為部署節點的 IP:4000- 不啟用
haproxy
,必須要先取消註釋,然後修改為"no"
配置 Ceph-OSD 磁碟
注意!警告! 下面的命令會清除所有資料,請謹慎操作!
參考文件,配置 Ceph-OSD 的儲存為 Bluestore
檢視儲存節點的盤:
# ansible -i multinode "storage*" -a "lsblk"
假設 所有儲存節點的盤都是 vdb
# ansible -i multinode "storage*" -a "parted /dev/vdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_BS 1 -1"
# ansible -i multinode "storage*" -a "parted /dev/vdb print"
繫結彈性網絡卡
在建立資源的時候為網路節點額外建立了 1 塊彈性網絡卡,不知道何故並沒有繫結到例項上。需要在阿里雲的頁面上把兩個彈性網絡卡繫結到網路節點例項上。
開始部署
整體的部署流程和命令和部署單節點是一樣的,唯一需要增加的地方是加一個 -i
選項,指定 inventory 檔案,也就是 multinode
這個檔案。
拉取映象
kolla-ansible -i multinode pull
因為這次節點數量比較多,所以映象拉取耗時會稍微長一點,可以耐心等待。
不同角色的節點拉取的映象是不一樣的,可以在部署節點另開一個 SSH 會話,用下面的命令檢視:
ansible -i multinode all -a "docker images"
部署命令 3 連
在部署節點依次執行下面 3 個命令即可:
kolla-ansible -i multinode prechecks
kolla-ansible -i multinode deploy
kolla-ansible -i multinode post-deploy
高可用架構
正常情況下的高可用架構會在網路節點安裝 HAProxy 和 Keepalived,這次演示並沒有。
API
OpenStack 所有模組的 API 服務都是無狀態的,所以橫向擴充套件搭配負載均衡即可實現高可用。
由於 Kolla-Ansible 中啟用負載均衡(HAProxy)的前提是要啟用 Keepalived,但是阿里雲又不支援,所以這次實驗其實 API 的負載均衡並沒有起效果,API 地址固定訪問了指定的第 1 個控制節點地址。
實際上,我們可以另外啟動一個外網浮動 IP,把這個浮動 IP 繫結到任意一個控制節點上,然後訪問 API,都是可以正常提供服務的。
此外阿里雲提供了現成的負載均衡服務,這裡應該可以直接對接阿里雲的負載均衡產品,不過並無必要,這次就不嘗試了。
網路服務
網路節點的高可用實際情況比較複雜,這裡不展開討論了。簡單展示一下網路服務:
塊儲存服務
MariaDB
叢集
資料庫採用的是 MariaDB Galera Cluster 叢集方案,登入後可以檢視:
RabbitMQ
RabbitMQ 的叢集狀態可以通過管理頁面檢視,不過要正常訪問,需要做以下操作:
- 在阿里雲的安全組中把
15672
埠放開 - 進入 rabbitmq 容器為 openstack 使用者授權
訪問 http://<控制節點外網IP>:15672
進入 RabbitMQ 管理頁面:
Ceph
Ceph 本身就是分散式的,這裡就不贅述了。
記得釋放例項!
別忘了最重要的事情,測試完成後別忘了去釋放例項,以免一直扣費。
搶佔式例項是保證例項有一個小時的穩定使用,不代表一個小時之後就會回收。如果供應比較大的情況下,系統可能會長期不回收你的例項,那就要一直扣費了!
記得釋放例項!
記得釋放例項!
記得釋放例項!
在 Cloud Shell 中一鍵清理本次實驗建立的資源:
cd ~/kolla-openstack/ansible
ansible-playbook destroy.yml
清理資源也可以通過網頁完成,最後務必檢查清理結果,以避免資源沒有釋放導致扣費。
注意,本次實驗還有云盤需要釋放!!
如果本文對你有幫助,請 點贊、 關注、分享 來一波