Devstack 簡介
DevStack 是一系列可擴展的腳本,用于基于 git master 的最新版本快速調出完整的 OpenStack 環境。devstack 以交互方式用作開發環境和 OpenStack 項目大部分功能測試的基礎。
- devstack 透過執行 stack.sh 腳本,搭建 openstack 環境,依據 local.conf 參數,決定提供哪些服務
- 使用 systemd 來管理 devstack 部署的 OpenStack DevStack 插件。支持額外的 Openstack
- 服務,以插件接口的概念,擴展 openstack 服務
官方文檔:
https://docs.openstack.org/devstack/latest/
項目地址:
https://opendev.org/openstack/devstack
https://github.com/openstack/devstack
devstack 安裝
從干凈且最小化的 Linux 系統安裝開始。 DevStack 嘗試支持 Ubuntu、Rocky Linux 和 openEuler的兩個最新 LTS 版本。如果您沒有偏好,Ubuntu 22.04 (Jammy) 是經過最多測試的,并且可能會是最流暢的。
參考文檔:
https://docs.openstack.org/devstack/latest/guides/single-machine.html
https://docs.openstack.org/contributors/zh_CN/code-and-documentation/devstack.html
網絡配置
確定用于將 OpenStack 云與現有網絡集成的接口上的網絡配置。例如,如果 DHCP 在您的網絡上給出的 IP 是 192.168.72.X - 其中 X 介于 100 和 200 之間,您將能夠使用 IP 201-254 作為浮動 ip。
devstack網絡設置支持兩種方式:
- Dedicated Guest Interface:主機需要雙網卡
- Shared Guest Interface:主機僅需單網卡
官方說明文檔:https://docs.openstack.org/devstack/latest/networking.html
注意:本次部署為單網卡模式,不要重啟devstack主機,否則主機SSH網絡連接將異常,建議部署后創建好快照。
節點規劃
基于 ubuntu 22.04 操作系統,使用 Devstack 部署工具搭建 all-in-one 的 OpenStack 開發環境。
主機名 | 節點IP | CPU | 內存 | 磁盤 | OS | 網卡 |
---|---|---|---|---|---|---|
devstack | 192.168.72.33 | 8C | 16G | 100G | Ubuntu 22.04 LTS | ens33 |
前置準備
系統更新
root@devstack:~# apt-get update && apt-get upgrade -y
配置主機名
hostnamectl set-hostname devstack
配置時間同步
apt install -y chrony
timedatectl set-timezone Asia/Shanghai
配置國內阿里APT源
cp /etc/apt/sources.list{,.bak}
sed -i 's#http://cn.archive.ubuntu.com/#http://mirrors.aliyun.com/#g' /etc/apt/sources.list
配置國內阿里PIP源,需要切換到stack用戶
mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/
EOF
由于眾所周知的原因,devstack 從 github 直接下載二進制文件時依然可能因為網絡原因失敗。最穩妥的辦法是通過下面的科技手段。
配置http代理(可選,需要科技)
cat >/etc/profile.d/proxy.sh<<EOF
export http_proxy="http://192.168.72.1:7890"
export https_proxy="http://192.168.72.1:7890"
EOF
source /etc/profile
配置apt代理(可選,需要科技)
cat >/etc/apt/apt.conf.d/proxy.conf<<EOF
Acquire::http::proxy "http://192.168.72.1:7890";
Acquire::https::proxy "http://192.168.72.1:7890";
EOF
添加 Stack 用戶
DevStack 應以啟用 sudo 的非 root 用戶身份運行(標準登錄云映像,例如“ubuntu”或“cloud-user”通常就可以)。
如果您不使用云映像,則可以創建一個單獨的stack用戶來運行 DevStack
root@devstack:~# sudo useradd -s /bin/bash -d /opt/stack -m stack
確保 stack
用戶的主目錄對所有人都具有可執行權限,因為基于 RHEL 的發行版使用 700
創建它,而 Ubuntu 21.04+ 使用 750
創建它,這可能會在運行期間導致問題部署。
sudo chmod +x /opt/stack
由于該用戶將對您的系統進行許多更改,因此它應該具有 sudo 權限:
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
sudo -u stack -i
下載 DevStack
stack@devstack:~$ git clone https://opendev.org/openstack/devstack
stack@devstack:~$ cd devstack
devstack
存儲庫包含一個用于安裝 OpenStack 和配置文件模板的腳本。
創建 local.conf
在 devstack git 存儲庫的根目錄下創建一個帶有四個預設密碼的 local.conf
文件。
cat >local.conf<<'EOF'
[[local|localrc]]
HOST_IP=192.168.72.33
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
DEST=/opt/stack## Neutron options
FLOATING_RANGE=192.168.72.0/24
Q_FLOATING_ALLOCATION_POOL=start=192.168.72.220,end=192.168.72.230
PUBLIC_INTERFACE=ens33
PUBLIC_NETWORK_GATEWAY=192.168.72.8
EOF
參數說明:
HOST_IP
: 本機IP地址ADMIN_PASSWORD
:OpenStack 用戶admin
和demo
的密碼DATABASE_PASSWORD
:MySQL 管理員用戶密碼RABBIT_PASSWORD
:RabbitMQ 密碼SERVICE_PASSWORD
:服務組件和 KeyStone 交互的密碼FLOATING_RANGE
:用于 GUEST VM 訪問外部網絡,并且可以通過向其分配FLOATING IP
來從外部網絡訪問GUEST VM。Q_FLOATING_ALLOCATION_POOL
:為devstack分配指定的外部IP地址范圍PUBLIC_INTERFACE
: 節點網卡名稱PUBLIC_NETWORK_GATEWAY
:外部網絡網關地址
在某些發行版中,您可能還需要設置 HOST_IP
。 是否需要這樣做將取決于操作系統中網絡接口使用的命名約定。
這是開始使用 DevStack 所需的最低配置。devstack 存儲庫中的sample目錄下有一個示例 local.conf
文件。
開始安裝
stack@devstack:~/devstack$ ./stack.sh
這將需要 15 - 30 分鐘,很大程度上取決于您的互聯網連接速度。在此過程中將安裝許多 git 樹和軟件包。
運行完成后日志如下,記錄訪問 Horizon 的URL地址及用戶密碼。
......
=========================
DevStack Component Timing(times are in seconds)
=========================
wait_for_service 14
async_wait 65
osc 190
apt-get 745
test_with_retry 4
dbsync 3
pip_install 182
apt-get-update 18
run_process 55
git_timed 141
-------------------------
Unaccounted time 331
=========================
Total runtime 1748=================Async summary
=================Time spent in the background minus waits: 279 secElapsed time: 1749 secTime if we did everything serially: 2028 secSpeedup: 1.15952Post-stack database query stats:
+------------+-----------+-------+
| db | op | count |
+------------+-----------+-------+
| keystone | SELECT | 35246 |
| keystone | INSERT | 93 |
| neutron | SELECT | 4668 |
| neutron | CREATE | 1 |
| neutron | SHOW | 4 |
| neutron | INSERT | 4112 |
| neutron | DELETE | 27 |
| neutron | UPDATE | 120 |
| placement | SELECT | 46 |
| placement | INSERT | 57 |
| placement | SET | 1 |
| nova_api | SELECT | 114 |
| nova_cell0 | SELECT | 73 |
| nova_cell1 | SELECT | 145 |
| nova_cell0 | INSERT | 5 |
| nova_cell0 | UPDATE | 5 |
| placement | UPDATE | 3 |
| nova_cell1 | INSERT | 4 |
| nova_cell1 | UPDATE | 19 |
| cinder | SELECT | 115 |
| cinder | INSERT | 5 |
| cinder | UPDATE | 1 |
| glance | SELECT | 49 |
| glance | INSERT | 6 |
| glance | UPDATE | 2 |
| nova_api | INSERT | 20 |
| nova_api | SAVEPOINT | 10 |
| nova_api | RELEASE | 10 |
| cinder | DELETE | 1 |
+------------+-----------+-------+This is your host IP address: 192.168.72.33
This is your host IPv6 address: ::1
Horizon is now available at http://192.168.72.33/dashboard
Keystone is serving at http://192.168.72.33/identity/
The default users are: admin and demo
The password: secretServices are running under systemd unit files.
For more information see:
https://docs.openstack.org/devstack/latest/systemd.htmlDevStack Version: 2024.1
Change: 57c685496f0ef8da0d6ebc50845f752caf29948a Merge "Drop nodesets with ubuntu-xenial" 2024-02-26 21:04:24 +0000
OS Version: Ubuntu 22.04 jammy2024-03-02 09:05:06.156 | stack.sh completed in 1749 seconds.
devstack 提供了一個環境文件,可以使用它通過 CLI 與openstack進行交互:
# source openrc file to load your environment with OpenStack CLI creds
stack@devstack:~/devstack$ . openrc
# list instances
openstack server list
openstack network list
openstack image list
安裝完成
您現在已經有了一個可以運行的 DevStack!恭喜!
- 您的 devstack 將安裝
keystone
、glance
、nova
、placement
、cinder
、neutron
。浮動IP將可用,guests 可以訪問外部世界。 - 您可以訪問 Horizo??n 來體驗 OpenStack 的 Web 界面,并從那里管理虛擬機、網絡、卷和映像。
- 您可以在 shell 中
source openrc
,然后使用openstack
命令行工具來管理您的 devstack。 - 您可以
cd /opt/stack/tempest
并運行已配置為與您的DevStack一起使用的Tempest測試。 - 您可以對 OpenStack 進行代碼更改并驗證它們。
通過瀏覽器訪問IP地址查看是否能訪問并登錄成功
http://192.166.66.18/dashboard
切換到demo項目,查看網絡拓撲圖
查看部署的systemd服務
stack@devstack:~$ systemctl list-units | grep -i devstackdevstack@c-api.service loaded active running Devstack devstack@c-api.servicedevstack@c-sch.service loaded active running Devstack devstack@c-sch.servicedevstack@c-vol.service loaded active running Devstack devstack@c-vol.servicedevstack@dstat.service loaded active running Devstack devstack@dstat.servicedevstack@etcd.service loaded active running Devstack devstack@etcd.servicedevstack@g-api.service loaded active running Devstack devstack@g-api.servicedevstack@keystone.service loaded active running Devstack devstack@keystone.servicedevstack@n-api-meta.service loaded active running Devstack devstack@n-api-meta.servicedevstack@n-api.service loaded active running Devstack devstack@n-api.servicedevstack@n-cond-cell1.service loaded active running Devstack devstack@n-cond-cell1.servicedevstack@n-cpu.service loaded active running Devstack devstack@n-cpu.servicedevstack@n-novnc-cell1.service loaded active running Devstack devstack@n-novnc-cell1.servicedevstack@n-sch.service loaded active running Devstack devstack@n-sch.servicedevstack@n-super-cond.service loaded active running Devstack devstack@n-super-cond.servicedevstack@placement-api.service loaded active running Devstack devstack@placement-api.servicedevstack@q-ovn-metadata-agent.service loaded active running Devstack devstack@q-ovn-metadata-agent.servicedevstack@q-svc.service loaded active running Devstack devstack@q-svc.servicesystem-devstack.slice loaded active active Slice /system/devstack
查看磁盤信息,devstack新建了一個loop設備。
root@devstack:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
......
loop6 7:6 0 30G 0 loop
├─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool_tmeta 253:1 0 32M 0 lvm
│ └─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool 253:3 0 28.5G 0 lvm
└─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool_tdata 253:2 0 28.5G 0 lvm └─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool 253:3 0 28.5G 0 lvm
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot/efi
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 96.9G 0 part └─ubuntu--vg-lv--0 253:0 0 96.9G 0 lvm /
查看邏輯卷,新建了 loop6
物理卷、stack-volumes-lvmdriver-1
卷組以及stack-volumes-lvmdriver-1-pool
邏輯卷。
root@devstack:~# pvsPV VG Fmt Attr PSize PFree/dev/loop6 stack-volumes-lvmdriver-1 lvm2 a-- <30.00g 1.43g/dev/sda3 ubuntu-vg lvm2 a-- <96.95g 0
root@devstack:~# vgsVG #PV #LV #SN Attr VSize VFreestack-volumes-lvmdriver-1 1 1 0 wz--n- <30.00g 1.43gubuntu-vg 1 1 0 wz--n- <96.95g 0
root@devstack:~# lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertstack-volumes-lvmdriver-1-pool stack-volumes-lvmdriver-1 twi-a-tz-- 28.50g 0.00 10.45 lv-0 ubuntu-vg -wi-ao---- <96.95g
項目服務都已在systemd中注冊。 每個服務都以 devstack@
為前綴。 因此,您可以通過systemd使用以下命令驗證Cinder Volume進程是否正在運行:
systemctl status devstack@c-vol.service
由于systemd接受通配符,因此與DevStack關聯的所有服務的狀態都可以顯示為:
systemctl status devstack@*
也可以通過systemd查看正在運行的服務的日志。 要顯示Cinder Volume服務的日志,可以使用以下命令:
journalctl -u devstack@c-vol.service
可以在 Using Systemd in DevStack 頁面上找到有關使用systemd與DevStack進行交互的更完整參考。
創建 cirros 虛擬機
在private網絡上基于cirros鏡像創建虛擬機,為了能夠讓cirros虛擬機解析外網域名,首先為private網絡配置DNS服務器。
切換到demo項目,點擊網絡–>private–>private-subnet,編輯子網:
點擊子網詳情,配置DNS服務器地址,這里以阿里云DNS服務器為例:
創建虛擬機實例
選擇private網絡
為實例綁定浮動IP
查看實例綁定的浮動IP
點擊實例名稱,進入實例控制臺,以ping github網站為例,測試訪問外網
配置安全組規則,入口方向放通ICMP協議及SSH協議,允許外網對實例進行ping和遠程ssh登錄
通過外網PING cirros實例浮動IP地址
C:\Users\pc>ping 192.168.72.221正在 Ping 192.168.72.221 具有 32 字節的數據:
來自 192.168.72.221 的回復: 字節=32 時間=4ms TTL=63
來自 192.168.72.221 的回復: 字節=32 時間=2ms TTL=63
來自 192.168.72.221 的回復: 字節=32 時間=1ms TTL=63
來自 192.168.72.221 的回復: 字節=32 時間=1ms TTL=63192.168.72.221 的 Ping 統計信息:數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):最短 = 1ms,最長 = 4ms,平均 = 2ms
通過外網SSH 登錄到cirros實例,默認密碼為gocubsgo
。
C:\Users\pc>ssh cirros@192.168.72.221
cirros@192.168.72.221's password:
$
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1442 qdisc pfifo_fast qlen 1000link/ether fa:16:3e:ae:ff:3b brd ff:ff:ff:ff:ff:ffinet 10.0.0.20/26 brd 10.0.0.63 scope global dynamic noprefixroute eth0valid_lft 42384sec preferred_lft 36984secinet6 fdaa:a0ad:306b:0:f816:3eff:feae:ff3b/64 scope global noprefixroute flags 100valid_lft forever preferred_lft foreverinet6 fe80::f816:3eff:feae:ff3b/64 scope linkvalid_lft forever preferred_lft forever
通過網絡拓撲圖查看創建的實例
創建 ubuntu 虛擬機
下載ubuntu cloud image
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
注意,在ubuntu cloud image中,默認登錄帳戶為ubuntu
,沒有密碼。
上傳ubuntu cloud image 到openstack
創建密鑰對,彈出私鑰文件sshkey.pem
下載到本地,去除后綴重命名為sshkey
。然后復制公鑰內容保存到本地sshkey.pub
文件。
$ cat sshkey.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSrYTk+s8mFWk/QennC7iL9cgwrQzElZRKOFBChykZEecfICQpXpNKDmHzdX7lNkPR69EGT/DTLk8S0IvsXktSH8/B4yVzzl9vfLm2c8GB/naHKSpXjO+gY8jcdTtKnn647GuEaGe7obChCFhiIfvgJQ7AZrJAQCtDLimO66yDfFaKOLSCtL4tIlRHp6U64JGdBc48ihsaHKrVJS4hlQkxGXPcsUvbQsnBTy9sR9CCxctXgr149JBwyQwBeBzLmHMvSYLkKe2uIeLghRZ6mZF2MZopZqA2FodVzxozq9U9KV7yV6k69Zw5UQJZwr157kh/GbwYC1uQu+cdl7N9Uj0h Generated-by-Nova
查看保存到本地的公鑰和私鑰文件
PS C:\Users\pc\Desktop> ls .\sshkeys\目錄: C:\Users\will\Desktop\sshkeysMode LastWriteTime Length Name
---- ------------- ------ -----a---- 2024/3/3 22:05 1675 sshkey
-a---- 2024/3/3 22:06 398 sshkey.pub
創建ubuntu實例,在源中ubuntu2204
鏡像,選擇綁定Key Pair。并綁定浮動IP地址。
獲取實例浮動IP,通過sshkey遠程連接到實例。SecureCRT工具配置示例:
實例連接后如下
ubuntu@ubuntu2204-demo:~$ sudo -i
root@ubuntu2204-demo:~#
root@ubuntu2204-demo:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1442 qdisc fq_codel state UP group default qlen 1000link/ether fa:16:3e:65:9d:f0 brd ff:ff:ff:ff:ff:ffaltname enp0s3inet 10.0.0.47/26 metric 100 brd 10.0.0.63 scope global dynamic ens3valid_lft 40531sec preferred_lft 40531secinet6 fdaa:a0ad:306b:0:f816:3eff:fe65:9df0/64 scope global mngtmpaddr noprefixroute valid_lft forever preferred_lft foreverinet6 fe80::f816:3eff:fe65:9df0/64 scope link valid_lft forever preferred_lft forever
root@ubuntu2204-demo:~#
root@ubuntu2204-demo:~# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
創建 rocky linux虛擬機
下載Rocky-9 cloud image
wget https://download.rockylinux.org/pub/rocky/9.3/images/x86_64/Rocky-9-GenericCloud.latest.x86_64.qcow2
注意,在rocky linux cloud image中,默認登錄帳戶為rocky
,沒有密碼。
實例創建流程類似,注意SSH連接時指定賬號為rocky
。
連接rocky實例后信息如下:
[rocky@rocky9-demo ~]$ sudo -i
[root@rocky9-demo ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1442 qdisc fq_codel state UP group default qlen 1000link/ether fa:16:3e:91:55:ea brd ff:ff:ff:ff:ff:ffaltname enp0s3altname ens3inet 10.0.0.45/26 brd 10.0.0.63 scope global dynamic noprefixroute eth0valid_lft 42526sec preferred_lft 42526secinet6 fdaa:a0ad:306b:0:f816:3eff:fe91:55ea/64 scope global noprefixroute valid_lft forever preferred_lft foreverinet6 fe80::f816:3eff:fe91:55ea/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@rocky9-demo ~]#
[root@rocky9-demo ~]# cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.3 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.3"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.3 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
SUPPORT_END="2032-05-31"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.3"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.3"
查看最終上傳的鏡像
查看最終創建的實例
查看網絡拓撲圖
刪除 DevStack
要關閉在節點上運行的DevStack實例,應使用以下命令:
./unstack.sh
此命令清除在節點上執行的OpenStack安裝。 這包括:
- 停止項目服務,mysql和rabbitmq
- 清理iSCSI卷
- 清除臨時LVM掛載
在DevStack運行失敗的情況下,首先要嘗試運行 unstack.sh
。 如果后續運行失敗,則可以使用以下命令更徹底地刪除DevStack組件:
./clean.sh
clean.sh
運行執行 unstack.sh
的步驟以及其他清理工作:
- 從/etc刪除項目的配置文件
- 刪除日志文件
- 清理Hypervisor
- 刪除.pyc文件
- 清理數據庫
- 等等