使用 devstack 部署 openstack zed

前言

最近我老師投資了一個教育平臺的專案,我需要負責具體的實施,其中包含了線上實訓模組,簡單來說就是為每個學生開設一臺雲電腦來完成實訓任務並收整合果來評分。這就要求平臺具有開設“雲電腦”的能力,也就是說需要有一個雲端計算叢集作為支撐。考慮到這個專案後續大機率會封裝成可私有化部署的產品賣給各個學校,所以這個雲端計算叢集也得能本地化部署才行,不能依賴阿里雲這樣的公有云服務,於是我只能悶頭研究下和我的專業相差略遠的 openstack 了。

老實說,像 devstack 這種一鍵安裝指令碼是不需要專門寫一篇文章來記錄如何使用的,但奈何天朝的網路環境各種的牆,導致這個指令碼我跑了好幾天,那種每走一步就碰見一個報錯的痛苦可能沒人會懂。

硬體準備

一臺空的 PC、一臺 x86 伺服器或者一臺 VMware 虛擬機器都可以。

如果是VMware虛擬機器的話記得開啟虛擬機器處理器的“虛擬化Intel VT-x/EPT 或 AMD-V/RVI(V)”功能。

作業系統

我使用的是 Ubuntu 22.04,這也是截至目前 zed 版官方推薦的作業系統。

新增 opentsack 使用者

需要建立一個專門的賬號來安裝和執行 openstak 服務

sudo useradd -s /bin/bash -d /opt/stack -m stack
sudo chmod +x /opt/stack
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
sudo -u stack -i # 切換到剛建立的使用者身份上以執行後續操作Code language: PHP (php)

前期準備

網上一些教程會讓換掉 Ubuntu 的軟體源和 Python 的 PIP 源,但是我並不建議這麼搞。第一是官方源目前在國內訪問速度非常不錯,第二是第三方源會出現各種莫名其妙的錯誤,比如說之前用華為的 PIP 源就會報各種依賴錯誤。

需要真正解決的網路訪問問題主要集中在以下兩塊:

  1. 從 GitHub 拉取倉庫
  2. 使用 wget 下載 GitHub 及其他被牆資源

我嘗試過很多解決方案,這裡就不羅列了,只說一下最根本的方案:為 git 和 wget 分別配置代理。

我採用的是在 PC 機上先使用 ShadowsocksR 配置 SSR 代理(這一塊不會配的就百度搜吧),然後在 ShadowsocksR 的“選項設定”中勾選“允許來自區域網的連線”。

之後在伺服器上執行以下四條命令讓 git 和 wget 命令可以使用 pc 機上配置的代理服務:

git config --global http.proxy 'socks5://192.168.0.197:1080' 
git config --global https.proxy 'socks5//192.168.0.197:1080'
export http_proxy=http://192.168.0.197:1080
export https_proxy=http://192.168.0.197:1080Code language: JavaScript (javascript)

之後分別進行測試:

wget https://google.com
git clone https://github.com/litepress/wp-china-yesCode language: PHP (php)

這兩條命令必須都成功執行才行,否則 devstack 的執行 100% 會報錯的,所以說如果測試不透過就回去研究為什麼出錯吧。

執行 devstack

解決網路問題後事情就很簡單了,這裡我直接把 openstack 官方的文件大段貼上來。

下載 devstack

git clone https://opendev.org/openstack/devstack
cd devstack
git checkout stable/zed  # 切換為 zed 版Code language: PHP (php)

建立配置檔案

在 devstack 目錄中建立名為 local.conf 的檔案,內容為:

[[local|localrc]]
ADMIN_PASSWORD=管理頁面的 admin 密碼
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

# 這裡使將來 openstack 的虛擬路由器橋接伺服器物理網絡卡,這樣安裝後雲伺服器就可以上網了,並且只需要物理機有一個網絡卡即可。
PUBLIC_INTERFACE=ens6f0 # 要橋接到的物理機網絡卡
HOST_IP=192.168.0.242 # 物理的 IP
FLOATING_RANGE=192.168.0.0/24 # 物理機網絡卡的網段
PUBLIC_NETWORK_GATEWAY=192.168.0.254 # 物理機網絡卡的閘道器
Q_FLOATING_ALLOCATION_POOL=start=192.168.0.100,end=192.168.0.200 # 要為雲主機分配的地址範圍(之所以不全分配是因為網路裡還會存在其他裝置,為了防止衝突才專門規劃出一部分給雲主機用)
Code language: PHP (php)

開始安裝

./stack.sh

安裝完成

安裝指令碼應當一次性執行成功,成功後會在終端輸出類似如下內容:

This is your host IP address: 192.168.0.242
This is your host IPv6 address: ::1
Horizon is now available at http://192.168.0.242/dashboard
Keystone is serving at http://192.168.0.242/identity/
The default users are: admin and demo
The password: 你設定的管理頁面的 admin 密碼

Services are running under systemd unit files.
For more information see: 
https://docs.openstack.org/devstack/latest/systemd.html

DevStack Version: zed
Change: 211cc4c036b6cb13598b87e6e3bbc3c74538a902 Pin tox<4.0.0 for <=stable/zed branch testing 2022-12-09 02:54:44 +0000
OS Version: Ubuntu 22.04 jammy

2022-12-20 20:28:27.268 | stack.sh completed in 1738 seconds.
Code language: JavaScript (javascript)

切換儲存盤

很多伺服器系統盤是和磁碟陣列在作業系統內是兩塊裝置,openstack 預設會將系統盤作為儲存盤。

想切換儲存盤首先需要在新磁碟上建立 LVM 卷組,參見:CentOS 6中建立及管理LVM邏輯卷 – 壞蛋的部落格 (ibadboy.net)

之後編輯檔案:/etc/cinder/cinder.conf 檔案(openstack 卷服務的配置檔案)。

將儲存後端 lvmdriver-1(預設儲存後端)的卷組修改為剛建立的新卷組即可。修改完類似如下:

[lvmdriver-1]
image_volume_cache_enabled = True
volume_clear = zero
lvm_type = auto
target_prefix = iqn.2010-10.org.openstack:
target_port = 3260
target_protocol = iscsi
target_helper = lioadm
volume_group = data # data 就是新建立的卷組,只需要改這一行即可。
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = lvmdriver-1

Code language: PHP (php)

之後重啟伺服器即可生效。

常見問題

物理機重啟後無法建立雲伺服器,一直顯示“正在排程中”

該問題是由於 nova(openstack 中負責計算的元件)的部分服務沒設定開機自啟動導致的。執行以下命令即可:

sudo systemctl start devstack@n-sch.service
sudo systemctl start devstack@n-cpu.service
sudo systemctl enable devstack@n-sch.service
sudo systemctl enable devstack@n-cpu.serviceCode language: CSS (css)

物理機重啟後無法連線網路(僅能 ping 通自己,無法 ping 通閘道器)

這是由於 devstack 在安裝時會建立一個橋接網絡卡 br-ex,但該網絡卡的 IP 配置資訊並未寫到網絡卡配置檔案中,所以重啟後 IP 丟失,自然網就不通了。

這裡以 ubuntu 22.04 為例,編輯檔案:/etc/netplan/00-installer-config.yaml,最後效果如下:

# This is the network config written by 'subiquity'
network:
  ethernets:
    eno1:
      dhcp4: false
    eno2:
      dhcp4: false
    ens6f0: # 被橋接的物理網絡卡,一定要在配置檔案中寫出來,否則會被禁用。
      dhcp4: false
    ens6f1:
      dhcp4: false
    br-ex:  # 這裡是 devstack 建立的橋接網絡卡,按正常網絡卡那樣配置地址資訊即可。
      addresses:
      - 192.168.0.242/24
      routes:
      - to: default
        via: 192.168.0.254
      nameservers:
        addresses:
        - 114.114.114.114
        search: []
    
  version: 2
Code language: PHP (php)

應用網路更改:

sudo netplan apply

現在可以上網了。