使用 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

現在可以上網了。