docker 容器方式单机部署 openstack(arm64 环境)

背景

DevStak 是 OpenStack 官方文档中提供的一套用于快速部署 OpenStack 实验性环境的脚本。文档中提到 DevStack 可以部署在物理机、虚拟机甚至LXC Container中,笔者尝试按照文档描述使用 LXC Container 方式部署,结果遇到各种报错。由于笔者对 LXC 的操作不熟悉,解决报错很困难,于是决定改用比较流行Docker 容器来部署。  

环境

CPU: 飞腾2000+ 64核
内存: 256g
操作系统: CentOS Linux release 7.9.2009 (AltArch)
Docker版本: 19.03.8

部署过程

制作并启动基础容器

由于 DevStack 使用了 systemd ,需要在容器中安装 systemd,并使用 systemd 作为入口命令,构建一个安装 systemd的基础镜像,Dockerfile如下:

FROM fedora:35  # 当前 openstack 版本 zed ,最新支持fedora 35
RUN yum install systemd -y

构建基础镜像,在 Dockerfile 目录下执行

docker build -t devstack .

启动 devstack 容器

docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -it -v /lib/modules:/lib/modules -p 8029:80 -p 6080:6080 --sysctl=net.ipv6.conf.all.disable_ipv6=0 --cpuset-cpus '0-7' --cpuset-mems 0 --name devstack devstack /sbin/init

1、 使用了-p参数,这里由于当前环境原因没有使用 host network,使用host network会方便很多, 80端口是horizon web端口,6080是vnc端口
2、 --sysctl参数的使用是devstack部署过程中需要修改的sysctl相关参数,当然可以提前在宿主机上修改,就不用在容器中改动了
3、 --cpuset-cpus --cpuset-mems 绑核绑numa节点,提升点性能

DevStack安装

执行以下命令

docker exec -it devstack bash  #进入devstack容器
dnf install git sudo vi  #安装必须软件
useradd -s /bin/bash -d /opt/stack -m stack
chmod +x /opt/stack
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
su - stack # 切换stack用户
git clone https://opendev.org/openstack/devstack -b stable/zed #下载DevStack脚本
cd devstack
#创建local.conf文件
vi local.conf  #输入以下内容

[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

#执行安装脚本
./stack.sh

等待stack.sh脚本运行完成,脚本运行时间比较长,可能会遇到报错退出,解决报错后重新运行,只到运行成功结束。

处理报错

glance 接口返回503

脚本中的有一段逻辑是等待 http://xxx.xx.xx.xx/image 接口返回200,如果出现等待超时报错,一般重新glance服务可以恢复正常

# 可以将该命令加到脚本执行等待逻辑的前面
systemctl restart devstack@g-*

/var/run/openvswitch 目录已存在

由于报错在重复执行./stack.sh时,会出现创建/var/run/openvswitch软件链接失败的问题

systemctl stop openvswitch
rm -rf /var/run/ovn
rm -rf /var/run/openvswitch

nova compute 服务报错,非 custom的cpu_mode不能设置cpu_module

可能devstack的脚本对于arm64环境未做充分验证,在生产nova compute服务的配置文件时,出现了判断错误,修改脚本中生成nova compute配置文件的地方,去掉cpu_module即可。

cinder-volume服务报错

devstack脚本自动配置的lvmdriver-1 在容器环境中启动失败。
如果发现以下服务启动失败

system status stack-volumes-lvmdriver-1-backing-file.service

则执行 losetup -D,再restart一下服务即可。
在执行创建卷时,cinder-vol 服务仍然报错,查看日志,发现是创建lv失败了,可以尝试在/etc/lvm/lvm.conf文件中,修改:

udev_sync = 0
udev_rules = 0

创建卷成功,但在openstack执行绑定卷时失败了,提示 volume不是一个block device。
最终笔者放弃使用devstack脚本自动配置的lvmdriver-1,改用NfsDriver了,需外部再搭一个nfs服务。

云主机 vnc console访问不了

由于笔者没有使用host network网络,所以需要将vnc服务设置外网访问代理,修改 /etc/nova/nova-cpu.conf文件,添加novncproxy_base_url配置,设置为外网代理地址

[vnc]
novncproxy_base_url = http://10.1.3.111:10381/vnc_lite.html

总结

DevStack文档中提到的lxc container部署方式,在arm64环境下会出现各种报错,可能是 openstack版本更新太快,而DevStack的脚本更新并未跟上。笔者在使用docker部署devstack的过程,通过解决报错问题,加深了openstack各组件的理解。

你可能感兴趣的:(容器,docker,openstack,容器)