前言
最近我老師投資了一個教育平臺的專案,我需要負責具體的實施,其中包含了線上實訓模組,簡單來說就是為每個學生開設一臺雲電腦來完成實訓任務並收整合果來評分。這就要求平臺具有開設“雲電腦”的能力,也就是說需要有一個雲端計算叢集作為支撐。考慮到這個專案後續大機率會封裝成可私有化部署的產品賣給各個學校,所以這個雲端計算叢集也得能本地化部署才行,不能依賴阿里雲這樣的公有云服務,於是我只能悶頭研究下和我的專業相差略遠的 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 源就會報各種依賴錯誤。
需要真正解決的網路訪問問題主要集中在以下兩塊:
- 從 GitHub 拉取倉庫
- 使用 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:
export https_proxy=http:
Code language: JavaScript (javascript)
之後分別進行測試:
wget https:
git clone https:
Code language: PHP (php)
這兩條命令必須都成功執行才行,否則 devstack 的執行 100% 會報錯的,所以說如果測試不透過就回去研究為什麼出錯吧。
執行 devstack
解決網路問題後事情就很簡單了,這裡我直接把 openstack 官方的文件大段貼上來。
下載 devstack
git clone https:
cd devstack
git checkout stable/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
PUBLIC_INTERFACE=ens6f0
HOST_IP=192.168.0.242
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:
Keystone is serving at http:
The default users are: admin and demo
The password: 你設定的管理頁面的 admin 密碼
Services are running under systemd unit files.
For more information see:
https:
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
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.service
Code language: CSS (css)
物理機重啟後無法連線網路(僅能 ping 通自己,無法 ping 通閘道器)
這是由於 devstack 在安裝時會建立一個橋接網絡卡 br-ex,但該網絡卡的 IP 配置資訊並未寫到網絡卡配置檔案中,所以重啟後 IP 丟失,自然網就不通了。
這裡以 ubuntu 22.04 為例,編輯檔案:/etc/netplan/00-installer-config.yaml,最後效果如下:
network:
ethernets:
eno1:
dhcp4: false
eno2:
dhcp4: false
ens6f0:
dhcp4: false
ens6f1:
dhcp4: false
br-ex:
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
現在可以上網了。