在阅读本文前,先阐述下我安装私有云的目标。
- 环境隔离:单个 linux 系统无法隔离我的操作,不适合直接用作测试机器,最好是分为宿主机+虚拟机的形式,可以作为测试环境的同时,承担一定的家庭服务器工作。
- 网络互通:家里有个路由器,我需要虚拟机的的网络能够和路由器下的其他设备位于同一子网,这样方便测试,也方便路由器做端口映射工作。
- 稳定运行:私有云作为基础软件,配置好了后,我大概率不会随便升级,也不会随便对宿主机进行调整,除非有部分服务更适合配置在宿主机上。
- 外部访问:我家有动态的公网 IP,虽然不是强需求,但能够从外部访问也是极好的。
OpenStack
哦,对了,我打算安装的私有云是开源的 OpenStack,它是开源的云服务框架,甚至一些大公司的云平台也是基于它搭建的,架构图如下,我就不过多的介绍了。
- 朴实无华的官方介绍 https://docs.openstack.org/contributors/zh_CN/common/introduction.html
- 花里胡哨的知乎介绍(个人觉得讲的有些浮夸) https://zhuanlan.zhihu.com/p/35598437
安装历程
在工作之余,我的痛苦历程就开始了,从买服务器开始,到我把 OpenStack run 起来,花了一个多月。因为程序员的工作时间很长,只能晚上回到家折腾一会会,所以经常碰到 bug,要等到第二天、第三天才有时间去解决。
第一步,安装方法的选择
搭建 OpenStack,首先要选择合适的搭建方法,目前基本就两种方式:
- 手动安装:手动安装非常复杂,参照官方文档安装。 https://docs.openstack.org/install-guide/openstack-services.html
- Devstack 脚本安装:Devstack 基本是一键安装,运行脚本后,能够将必要服务配置好,官方说明文档 https://docs.openstack.org/devstack/latest/
作为一个懒人,而且自己仅有一台服务器,不需要整的很夸张,构建一个 devstack all-in-one架构就可以,我果断选择了 DevStack 方式,但 DevStack 也有很深的坑,主要是文档不全。。DevStack 方式似乎仅支持 centos 和 ubuntu,出于方便的因素,我安装的是 ubuntu 20.04 LTS 桌面版,勉强符合了要求。
第二步,运行安装脚本
参考官方安装方法,分为如下几个主要的步骤,但没有完全搞清楚 local.conf 的配置文件的含义,所以我也没办法和大家说什么样的配置文件更好。。。https://docs.openstack.org/devstack/latest/
第一步,创建一个新账户
sudo useradd -s /bin/bash -d /opt/stack -m stack
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
sudo -u stack -i
第二步,下载 devstack 的脚本。
这里实际有个问题,默认下载的是 master 的分支,不是发行的大版本,可能会出现过去未知的错误。但我下载了最近两个大版本,运行时也是会有七七八八的问题,最后还是用 master 分支应付了。
git clone https://opendev.org/openstack/devstack
cd devstack
第三步,编辑配置文件 local.conf。最小的配置文件如下:
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
# 使用国内镜像
GIT_BASE=http://git.trystack.cn
NOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.git
SPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.git
第四步,运行安装脚本:
./stack.sh
如果运气够好,你可以一次安装成功,如果运气不好,你会像我一样,碰到杂七杂八的问题。
开始解决 bug
以下所述的问题,是我在安装过程中碰到的问题及我的解决方案,具有特例,并且不一定是标准解决方案,只是能使 OpenStack 冒烟运行而已。
bug 0 安装速度极慢
这个没办法, OpenStack 服务器在国外,就是会出现很慢的问题,可以通过以下两步缓解以下:
- 第一步,先配置 apt 的国内镜像源,可以参考清华源ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
- 第二步,配置国内 git 镜像,在 local.conf 中可以配置,已经写在上面了。
bug 1 安装过程中提示有个 python 库冲突
原始日志已经被我清理掉了,这里只能复述一下,大概场景是莫名报错,网上翻一翻,是和一个 python 包有关,那个包貌似不是通过 pip 安装的,我到对应的路径清除了文件就通过了。
bug 2 ERROR Socket /var/run/openvswitch/ovnnb_db.sock not found
安装过程中报错,关键词是上述,我搜到了 stack overflow 上有人碰到过,需要修改 devstack 中的一行配置代码。
在修改代码前,先执行 ./unstack.sh
清理一下,防止重复安装时出现 bug。
文件位于/opt/stack/devstack/lib/ovn_agent
,修改文件约116行处,将OVS_RUNDIR=$OVS_PREFIX/var/run/openvswitch
替换为OVS_RUNDIR=$OVS_PREFIX/var/run/ovn
。
bug 3 安装后,重启后 devstack 无法运行
经过排查,我发现服务太多,有些服务启动失败,包括:etcd、cinder 等杂七杂八的。对应的服务手动重启一下就好了,cinder 是因为牵扯的 lvm 硬盘没有挂载,需要先将虚拟硬盘挂载,在 shell 中执行如下命令:
sudo losetup -f --show /opt/stack/data/stack-volumes-lvmdriver-1-backing-file
# 理论上只要重启没启动好的几个服务就可以了,实际操作上,我选择全部重启。。。
sudo systemctl restart "devstack@*"
Bug 4 创建实例碰到 no valid host was found
这个问题是我碰到的第二吐血的问题,我也尝试解了几天,但解决起来还算顺利。
首先,搜索关键词,知道需要先看服务是否起来openstack compute service list
;然后,在看是否发现了相关计算节点:openstack hypervisor list
;此时,我发现 openstack 并没有发现计算节点,就得进一步搜索。在 https://blog.csdn.net/avatar_2009/article/details/108072927 得知需要手动触发节点发现:nova-manage cell_v2 discover_hosts --verbose
,但一直报另一个错误:
stack@a-PowerEdge-R730:~$ nova-manage cell_v2 discover_hosts --verbose
/usr/lib/python3/dist-packages/secretstorage/dhcrypto.py:15: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead
from cryptography.utils import int_from_bytes
/usr/lib/python3/dist-packages/secretstorage/util.py:19: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead
from cryptography.utils import int_from_bytes
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 6812b249-6941-47e6-a3c7-8ab2d809543e
Found 0 unmapped computes in cell: 6812b249-6941-47e6-a3c7-8ab2d809543e
devstack 上安装的程序不是很好看错误日志,便先通过 systemctl status “devstack@n-*” 判断是哪个程序发生了错误,最终定位到是 “devstack@n-cpu”
通过 sudo journalctl -u devstack@n-cpu
查看具体的错误日志,发现是我自己之前安装的虚拟机。。。root 以外的用户没有读写权限,虽然我也不知道为什么 openstack 需要这个文件的读写权限,但是我给加上了之后就可以正常运行了。这说明了,最好在完全干净的环境下配置 devstack。
Bug 5 虚拟机分配不到 IP
这个问题是我碰到最恶心的问题,一直花了几个星期才算冒烟跑通。
第一次诊断:是否是 neutron 配置错误
网络不通,首先怀疑是网络服务配置不正确导致的,经过自己的摸索,发现这部分超出了自己的知识范围,于是看书、上网搜索,最后有了一点点浅薄的理解。
我的需求是虚拟机与宿主机位于同一子网,不需要 VLAN、VXLAN 等花里胡哨的配置,所以我的配置应该很简单。参考书介绍了 linux bridge 和 open vswitch 两种方案,于是我开始尝试调整配置文件重新安装。遗憾的是,我尝试了调整 local.conf 很多次,只要选择 linux bridge 和 open vswitch,连完整的部署都很难做到。。。
经过我在网络上的进一步调研,我发现 OpenStack 的网络虚拟化主要分为三种方案:
- Linux Bridge
- Open vSwitch
- Open Virtual Network
其中 OVN 是 devstack 中默认配置的虚拟化方案,所以另外两种无法成功部署,我只能怀疑是 devstack 的脚本不正确,故放弃当前思路。
第二次诊断:考虑如何使用 OVN 配置
目前我能配置配置 openstack 成功的只有基于 ovn 的 neutron,可能是网络的资料不够新,ovn 和 ovs 不是同样的概念,并且网络上 OVN 的信息极少,仅有官网少量提及。https://docs.ovn.org/en/latest/index.html
在探索中,我发现安装好 OVN 后,我的网卡没有被挂载到 OVN 的 bridge 上。按照 Flat 网络模型,我的网卡需要挂载到 br-ex 网桥,虚拟机会被挂载到 br-int 网桥,两个网桥会有 peer port 联通。
将网卡挂载到 br-ex 网桥,该操作可能导致断网,需要在服务器上直接操作,如果配置后无法访问网络,请及时撤销操作:
首先,禁用网口的 dhcp 功能,各系统的操作不同,ubuntu 20.04 使用 netplan 进行管理,参考官网 example:https://netplan.io/examples/#configuring-network-bridges
我的配置文件如下/etc/netplan/01-network-manager-all.yaml
,执行sudo netplan apply
使配置文件生效,生效后可能会断网。
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
eno1:
dhcp4: no
dhcp6: no
然后,将 ip 配置到 bridge,执行完成后,网络应当能够恢复连接。
sudo ip addr flush dev eno1
sudo ip addr add 192.168.128.5/24 dev br-ex
sudo ip link set br-ex up
但,虚拟机依旧没办法获得 ip,但此时,我给虚拟机配置了静态 IP,发现虚拟机已经可以联网,网络整体而言是通的,虚拟机内部可以访问外部,但外部还不能防伪虚拟机内部。
第三次诊断:安全组好像也会影响到虚拟机连通性
默认情况下,DevStack 安全组会丢弃传入流量,但为了以合理的方式测试网络,我们需要启用它。您只需要实际编辑一个特定的安全组,但 DevStack 会创建多个,并且很难确定哪一个是重要的,因为它们都被命名为“默认”。因此,以下添加了允许 SSH 和 ICMP 流量进入每个 安全组的规则:https://docs.ovn.org/en/latest/tutorials/ovn-openstack.html#setting-up-devstack
Bug 6 上传镜像后,一直显示排队中
我查看了服务的日志,发现是因为 devstack 给配置的默认 limit 太小了,glance 服务不允许继续。
https://docs.openstack.org/glance/latest/admin/quotas.html#total-image-size
openstack --os-cloud devstack-system-admin registered limit update \
--service glance --default-limit 5000 --region RegionOne image_size_total
openstack --os-cloud devstack-system-admin registered limit create \
--service glance --default-limit 1000000 \
--region RegionOne image_size_total
按照文档应该这么设置,但是,我的没能生效,所以我直接在 /etc/glance/glance-api.conf
中,把 use_keystone_limits
配置为了 False
,效果立竿见影。
[DEFAULT]
use_keystone_limits = False
worker_self_reference_url = http://127.0.0.1:60999
logging_exception_prefix = ERROR %(name)s %(instance)s
logging_default_format_string = %(color)s%(levelname)s %(name)s [-%(color)s] %(instance)s%(color)s%(message)s
logging_context_format_string = %(color)s%(levelname)s %(name)s [%(global_request_id)s %(request_id)s %(project_name)s %(user_name)s%(color)s] %(instance)s%(color)s%(message)s
logging_debug_format_suffix = {{(pid=%(process)d) %(funcName)s %(pathname)s:%(lineno)d}}
public_endpoint = http://192.168.31.11/image
Bug 7:ubuntu、debian 镜像无法登陆
从网上找了些云服务专用的系统镜像,像 ubuntu、debian 等,结果,安装上虚拟机后无法登陆,必须配置 key 才可以登录,我参考下面的一些文章,修改了镜像文件,给 root 账号配置了默认密码。
https://www.cxyzjd.com/article/liliang365/108833600
http://www.chenshake.com/openstack-mirror-and-password/
https://blog.csdn.net/hehj369986957/article/details/108381736
Bug 8:创建虚拟机时,报创建 volume 失败
在日志文件中,发现 cinder 服务的可用空间不够了。当时我就纳闷了,我买了个 8T 的硬盘,那么大的硬盘空间那去了呢?
11月 30 21:18:18 a-PowerEdge-R730 cinder-scheduler[25077]: DEBUG cinder.scheduler.host_manager [None req-22e02855-3c36-4691-8c1f-efe11eb2f19f admin None] Updating capabilities for a-PowerEdge-R730@lvmdriver-1 {'pool_name': 'lvmdriver-1', 'total_capacity_gb': 28.5, 'free_capacity_gb': 1.82, 'reserved_percentage': 0, 'location_info': 'LVMVolumeDriver:a-PowerEdge-R730:stack-volumes-lvmdriver-1:thin:0' 'QoS_support': False, 'provisioned_capacity_gb': 212.0, 'max_over_subscription_ratio': '20.0', 'thin_provisioning_support': True, 'thick_provisioning_support': False, 'total_volumes': 5, 'filter_function': None, 'goodness_function': None, 'multiattach': True, 'backend_state': 'up', 'allocated_capacity_gb': 212, 'cacheable': True, 'volume_backend_name': 'lvmdriver-1', 'storage_protocol': 'iSCSI', 'vendor_name':'Open Source', 'driver_version': '3.0.0', 'timestamp': datetime.datetime(2021, 11, 30, 13, 17, 27, 581924)} {{(pid=25077) update_from_volume_capability /disk1/stack/cinder/cinder/scheduler/host_manager.py:392}}
然后,又是一番上下求索,发现 devstack 创建了个文件,将文件挂载到了/dev/loopxx
然后将这个回环文件创建了个 vg 当做虚拟硬盘使用,但默认配置文件中只给创建了 30G。
# 30Gb default volume backing file size
VOLUME_BACKING_FILE_SIZE=${VOLUME_BACKING_FILE_SIZE:-30G}
我立马想到了四种解决方案,但奈何系统已经搞得差不多了,就先测试了新建一个 lvm backend,然后将旧的 lvm 硬盘删除,新建了个更大空间的 lvm。
- unstack.sh 重新修改 stackrc 配置文件,重新执行 stack.sh,创建 私有云;
- 删除旧的 lvm 磁盘,创建一个同名的,更大空间的;
- 新建一个 loop 文件,合并容量到 stack-volumes-lvmdriver-1
- 新建一个 lvm backend,后续虚拟机使用新的 backend,https://www.cnblogs.com/sammyliu/p/4159147.html
涉及到了如下必要命令。
# 查看虚拟硬盘
stack@a-PowerEdge-R730:~/data$ sudo lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
[lvol0_pmspare] stack-volumes-lvmdriver-1 ewi------- 32.00m
stack-volumes-lvmdriver-1-pool stack-volumes-lvmdriver-1 twi-aotz-- 28.50g 12.25 16.98
[stack-volumes-lvmdriver-1-pool_tdata] stack-volumes-lvmdriver-1 Twi-ao---- 28.50g
[stack-volumes-lvmdriver-1-pool_tmeta] stack-volumes-lvmdriver-1 ewi-ao---- 32.00m
volume-7ca20891-4e0a-4514-80c7-8fbf9a305d29 stack-volumes-lvmdriver-1 Vwi-aotz-- 100.00g stack-volumes-lvmdriver-1-pool 3.01
volume-a4a1a063-8595-436d-b825-50abda120e2c stack-volumes-lvmdriver-1 Vwi-aotz-- 160.00g stack-volumes-lvmdriver-1-pool volume-deaa27be-9c9f-4c49-8e90-418b39ec7fa4 1.64
volume-deaa27be-9c9f-4c49-8e90-418b39ec7fa4 stack-volumes-lvmdriver-1 Vwi-a-tz-- 3.00g stack-volumes-lvmdriver-1-pool volume-7ca20891-4e0a-4514-80c7-8fbf9a305d29 73.31
# sudo lsblk 用来查看 loop
➜ ~ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop14 7:14 0 30G 0 loop
├─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool_tmeta 253:0 0 32M 0 lvm
│ └─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool-tpool 253:2 0 28.5G 0 lvm
│ ├─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool 253:3 0 28.5G 1 lvm
│ ├─stack--volumes--lvmdriver--1-volume--7ca20891--4e0a--4514--80c7--8fbf9a305d29 253:8 0 100G 0 lvm
│ ├─stack--volumes--lvmdriver--1-volume--deaa27be--9c9f--4c49--8e90--418b39ec7fa4 253:9 0 3G 0 lvm
│ └─stack--volumes--lvmdriver--1-volume--a4a1a063--8595--436d--b825--50abda120e2c 253:10 0 160G 0 lvm
└─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool_tdata 253:1 0 28.5G 0 lvm
└─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool-tpool 253:2 0 28.5G 0 lvm
├─stack--volumes--lvmdriver--1-stack--volumes--lvmdriver--1--pool 253:3 0 28.5G 1 lvm
├─stack--volumes--lvmdriver--1-volume--7ca20891--4e0a--4514--80c7--8fbf9a305d29 253:8 0 100G 0 lvm
├─stack--volumes--lvmdriver--1-volume--deaa27be--9c9f--4c49--8e90--418b39ec7fa4 253:9 0 3G 0 lvm
└─stack--volumes--lvmdriver--1-volume--a4a1a063--8595--436d--b825--50abda120e2c 253:10 0 160G 0 lvm
sda 8:0 0 447.1G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 446.1G 0 part /
sdb 8:16 0 7.3T 0 disk /disk1
sdc 8:32 0 100G 0 disk
├─sdc1 8:33 0 2.1G 0 part
├─sdc14 8:46 0 4M 0 part
└─sdc15 8:47 0 106M 0 part
sdd 8:48 0 160G 0 disk
├─sdd1 8:49 0 2.1G 0 part
├─sdd14 8:62 0 4M 0 part
└─sdd15 8:63 0 106M 0 part
sde 8:64 0 100G 0 disk
├─sde1 8:65 0 2.1G 0 part
├─sde14 8:78 0 4M 0 part
└─sde15 8:79 0 106M 0 part
sr0 11:0 1 1024M 0 rom
# truncate 创建指定大小的文件
truncate -s 100G stack-volumes-lvmdriver-1-blocking-file
# 挂载 loop 文件
sudo losetup -f --show --direct-io=on stack-volumes-lvmdriver-1-blocking-file
// 返回 /dev/loopxx
# 创建 vg
sudo vgcreate stack-volumes-lvmdriver-1 /dev/loop13
# 使 lvm 生效
sudo vgchange -ay stack-volumes-lvmdriver-1
# 取消 vg
sudo vgremove stack-volumes-lvmdriver-1
# 卸载 loop 文件
sudo losetup -d /dev/loop13
sudo losetup -d /dev/loop14
Bug 9 外网无法访问
我在路由器上配置了端口映射,但外部打不开 OpenStack 的网址。上网一搜,需要配置 ServerAlias,参考别人的文档简单的配置一下就好了。 花生壳内网穿透访问OpenStack的Dashboard界面
Bug 10 外网访问不了 noVNC
发现 OpenStack 中的 vnc 是通过内网地址暴露出去的,是另一个端口 6080,需要将该端口一并暴露出去才行。
解 bug 过程中的一些 tips
Tip 0 每次想修改 local.conf 前先卸载
# 停止 devstack 的服务,从操作系统中卸载掉,但 mysql 等一些基础服务还在
./unstack.sh
# 卸载的更彻底,连 mysql 都一并卸载了
./clean.sh
# 有时候有些文件可能清除不干净,手动执行
sudo rm -rf /etc/libvirt/qemu/inst*
sudo virsh list | grep inst | awk '{print $1}'| xargs -n1 virsh destroy
没事不要在家里搭建 OpenStack - 知乎 (zhihu.com)
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/309067.html