用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 種角色:

  1. control,控制節點
  2. network,網絡節點
  3. compute,計算節點
  4. storage,存儲節點
  5. 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 中遠程操作部署節點來執行部署任務,但是基於下面原因:

  1. 整個部署比較耗時,這個臨時虛機並不穩定
  2. 多節點部署也是比較靈活的,有些配置不可避免需要根據情況設置,再套一層 ansible 沒必要
  3. 即使針對一種場景寫 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,這次演示並沒有。

HA 架構

API

OpenStack 所有模塊的 API 服務都是無狀態的,所以橫向擴展搭配負載均衡即可實現高可用。

由於 Kolla-Ansible 中啟用負載均衡(HAProxy)的前提是要啟用 Keepalived,但是阿里雲又不支持,所以這次實驗其實 API 的負載均衡並沒有起效果,API 地址固定訪問了指定的第 1 個控制節點地址。

API 端口

實際上,我們可以另外啟動一個外網浮動 IP,把這個浮動 IP 綁定到任意一個控制節點上,然后訪問 API,都是可以正常提供服務的。

此外阿里雲提供了現成的負載均衡服務,這里應該可以直接對接阿里雲的負載均衡產品,不過並無必要,這次就不嘗試了。

網絡服務

網絡節點的高可用實際情況比較復雜,這里不展開討論了。簡單展示一下網絡服務:

網絡服務狀態

塊存儲服務

塊存儲服務

MariaDB 集群

數據庫采用的是 MariaDB Galera Cluster 集群方案,登錄后可以查看:

MariaDB 集群狀態

RabbitMQ

RabbitMQ 的集群狀態可以通過管理頁面查看,不過要正常訪問,需要做以下操作:

  • 在阿里雲的安全組中把 15672 端口放開
  • 進入 rabbitmq 容器為 openstack 用戶授權

RabbitMQ 給 openstack 用戶授權

訪問 http://<控制節點外網IP>:15672 進入 RabbitMQ 管理頁面:

RabbitMQ集群狀態

Ceph

Ceph 本身就是分布式的,這里就不贅述了。

查看 Ceph 狀態

記得釋放實例!

別忘了最重要的事情,測試完成后別忘了去釋放實例,以免一直扣費。

搶占式實例是保證實例有一個小時的穩定使用,不代表一個小時之后就會回收。如果供應比較大的情況下,系統可能會長期不回收你的實例,那就要一直扣費了!

記得釋放實例!

記得釋放實例!

記得釋放實例!

在 Cloud Shell 中一鍵清理本次實驗創建的資源:

cd ~/kolla-openstack/ansible
ansible-playbook destroy.yml

清理資源也可以通過網頁完成,最后務必檢查清理結果,以避免資源沒有釋放導致扣費。

注意,本次實驗還有雲盤需要釋放!!


如果本文對你有幫助,請 點贊關注分享 來一波。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM