爲展示 Kolla 的真正實力,我在阿里雲使用 Ansible 自動建立 10 臺虛機,部署一套多節點高可用 OpenStack 集羣!html
上次 Kolla 已經表示了要打 10 個的願望,此次咱們就知足它。node
經過本期內容,你將看到:git
本期內容仍然是乾貨滿滿,寫文章,調腳本,剪視頻,不但花時間,還要在 阿里雲 花錢租雲服務器,真的費了很多精力,因此若是本文對你有所幫助,請務必點贊支持!謝謝。github
操做過程仍可在 B站觀看視頻docker
一次性建立 10 臺虛機,從界面一個個的點就太無聊了。因此咱們要想辦法讓這個過程自動化地完成。shell
第一個念頭就是用 Python 去調用 API,因而直奔 開發者工具 頁面而去,卻發現阿里雲提供了網頁版的命令行工具:Cloud Shell,使用起來更加方便。數據庫
啓動 Cloud Shell 會自動爲你建立一個虛機,裏面不但內置了鏈接阿里雲的 CLI 工具,並且由於是登陸後啓動,它自動把認證也處理了。也就是說咱們直接就能夠開始使用了,很是方便。bootstrap
具體請參考官方文檔:什麼是雲命令行?api
不只如此,爲了讓你們更好地掌握這些工具的用法,還提供了交互式的 實驗教程,花上幾分鐘,也許再花上幾分錢,就能上手實驗。安全
在實驗了 使用 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"
參考上面的教程完成。
Kolla 在部署 OpenStack 階段,按職責分爲 5 種角色:
實際 1 個節點能夠有 1 個或多個角色。好比,All-In-One
安裝時,一個節點就充當了全部角色。
實際這裏的角色對應的是 Ansible 中的主機分組概念。
節點上最終會安裝哪些服務(也就是啓動哪些容器),最終由啓用的各個功能模塊綜合決定而成。例如,若是啓用了 cinder
,則 cinder-api
服務會安裝在全部的 control
控制節點上,而 cinder-volume
服務會安裝在全部的 storage
存儲節點上。
除此以外,還須要:
Kolla-Ansible
的節點在我提供的 ISO 光盤裏,系統安裝時選擇了 Deploy Node
就會自動安裝這些。
若是是日常部署,任選一個機器充當部署節點便可,部署節點自己也能夠是控制或計算或存儲。
此次在阿里雲上,咱們單首創建一個虛機來當部署節點。
10 個節點的角色分配狀況:
注意: 阿里雲上的虛機不支持 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 臺搶佔式實例,對應上面的規劃:
執行建立資源的劇本:
cd ~/kolla-openstack/ansible ansible-playbook create.yml
劇本完成後能夠在頁面上看到資源的建立狀況。
同時 ~/kolla-openstack/ansible
目錄下會生成一個 hosts
文件,記錄全部建立的實例的私網地址和 hostname
.
注意: 我本意是將此
hosts
文件直接複製到部署節點的/etc/hosts
.可是這裏遇到了阿里雲 ansible 模塊的一個 bug. 其影響就是沒有辦法在批量建立實例時按序生成
hostname
,例如:control01, control02, control03.因此
hosts
文件中同類型主機名都是同樣的,須要在後面手動修改。
在虛機資源建立完成後,首先須要配置的是部署節點。它是這批虛機中惟一默認建立了公有 IP 的,因此能夠直接在 Cloud Shell 中操做。其它節點只有私有網絡,必須經過它來操做。
由於每次建立虛機的時候 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
中設置
該劇本會完成如下任務:
/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 # 這下面的全部內容都不要動了!!
如下的操做都是在部署節點上執行
爲了方便 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:4000haproxy
,必需要先取消註釋,而後修改成 "no"
注意!警告! 下面的命令會清除全部數據,請謹慎操做!
參考文檔,配置 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 個命令便可:
kolla-ansible -i multinode prechecks kolla-ansible -i multinode deploy kolla-ansible -i multinode post-deploy
正常狀況下的高可用架構會在網絡節點安裝 HAProxy 和 Keepalived,此次演示並無。
OpenStack 全部模塊的 API 服務都是無狀態的,因此橫向擴展搭配負載均衡便可實現高可用。
因爲 Kolla-Ansible 中啓用負載均衡(HAProxy)的前提是要啓用 Keepalived,可是阿里雲又不支持,因此此次實驗其實 API 的負載均衡並無起效果,API 地址固定訪問了指定的第 1 個控制節點地址。
實際上,咱們能夠另外啓動一個外網浮動 IP,把這個浮動 IP 綁定到任意一個控制節點上,而後訪問 API,都是能夠正常提供服務的。
此外阿里雲提供了現成的負載均衡服務,這裏應該能夠直接對接阿里雲的負載均衡產品,不過並沒有必要,此次就不嘗試了。
網絡節點的高可用實際狀況比較複雜,這裏不展開討論了。簡單展現一下網絡服務:
MariaDB
集羣數據庫採用的是 MariaDB Galera Cluster 集羣方案,登陸後能夠查看:
RabbitMQ 的集羣狀態能夠經過管理頁面查看,不過要正常訪問,須要作如下操做:
15672
端口放開訪問 http://<控制節點外網IP>:15672
進入 RabbitMQ 管理頁面:
Ceph 自己就是分佈式的,這裏就不贅述了。
別忘了最重要的事情,測試完成後別忘了去釋放實例,以避免一直扣費。
搶佔式實例是保證明例有一個小時的穩定使用,不表明一個小時以後就會回收。若是供應比較大的狀況下,系統可能會長期不回收你的實例,那就要一直扣費了!
記得釋放實例!
記得釋放實例!
記得釋放實例!
在 Cloud Shell 中一鍵清理本次實驗建立的資源:
cd ~/kolla-openstack/ansible ansible-playbook destroy.yml
清理資源也能夠經過網頁完成,最後務必檢查清理結果,以免資源沒有釋放致使扣費。
注意,本次實驗還有云盤須要釋放!!
若是本文對你有幫助,請 點贊、 關注、分享 來一波。