安装文档:https://docs.openstack.org/kolla-ansible/zed/user/quickstart.html
一、系统基本设置
系统要求:
单机部署最低配置:
- 2张网卡
- 8G内存
- 40G硬盘空间
主机系统:
- CentOS Stream 9
- Debian Bullseye (11)
- openEuler 22.03 LTS
- Rocky Linux 9
- Ubuntu Jammy (22.04)
本实验官方不再支持CentOS 7作为主机系统,这里使用的是Rocky Linux 9.1(最小化安装)。
Rocky Linux 下载地址:https://rockylinux.org/download
中文社区:https://www.rockylinux.cn/
Rocky Linux简介:
https://baike.baidu.com/item/Rocky%20Linux/61721664?fr=aladdin
本次实验环境:
VMware虚拟机,操作系统Rocky Linux 9最小化安装、单机部署最低配置:内存8G、硬盘50G(自动分区即可)、三网卡、CPU开启虚拟化支持。
1.关闭防火墙和selinux
关闭防火墙
# systemctl disable firewalld;systemctl stop firewalld
永久关闭selinux,需重启系统后生效
# vi /etc/selinux/config
SELINUX=disabled
临时关闭selinux:可使用如下命令将当前selinux设置为permissive,重启系统后失效
# setenforce 0
2.设置主机名、主机名列表
设置主机名
# hostnamectl set-hostname allinone-kolla
# exit #断开退出,重新连接
hosts文件是Linux系统上一个负责ip地址与域名快速解析的文件,设置本机IP与域名. 在部署机的hosts中添加需要部署的主机的主机名,后续会自动同步到所有节点。
# cat >> /etc/hosts << EOF
192.168.100.10 allinone-kolla
EOF
3.设置网卡,配置网卡信息
# cd /etc/NetworkManager/system-connections/
# vi ens33.nmconnection
//[ipv4]字段下修改或添加以下行:
method=manual #修改
address=192.168.100.10/24 #新增
# vi ens35.nmconnection
method=none #修改
重启网卡:
# nmcli c reload #加载配置文件
# nmcli c down ens33
# nmcli c up ens33 #重启网卡
# ip a #查看
# ping 8.8.8.8
4. 设置主机无密钥访问
# cd
# ssh-keygen
生成ssh公钥,默认设置即可,按三次回车。
# ssh-copy-id root@allinone-kolla
ssh-copy-id命令可以把本地的ssh公钥文件安装到远程主机对应的账户下。
选择yes,输入root用户 密码。
二、准备部署环境
1、安装基础依赖包
# dnf install -y git python3-devel libffi-devel gcc openssl-devel python3-libselinux
2、安装Ansible额外需要的包:
官方文档中没有说明,实际部署过程中,没有这两个包会无法使用pip安装的ansible。
# dnf install -y python3-resolvelib sshpass
3、设置Python-venv虚拟环境
为了防止与系统的python环境冲突,这里使用虚拟环境安装ansible与kolla-ansible
/path/to/venv是虚拟环境的目录,也可以自己指定。
# 创建虚拟环境
# python3 -m venv /path/to/venv
# 进入python虚拟环境
# source /path/to/venv/bin/activate
# 注:在虚拟环境中输入deactivate命令,即可退出虚拟环境
# 更换pip国内源,更新pip
# pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# pip install -U pip
4、安装ansible
Kolla-ansible需要ansible 5版本,这里需要指定版本安装
# pip install 'ansible>=4,<6'
三、安装Kolla-ansible
Kolla是OpenStack下用于自动化部署的一个项目,它基于docker和ansible来实现,其中docker主要负责镜像制作和容器管理,ansible主要负责环境的部署和管理。
Kolla实际上分为如下两部分:
Kolla部分提供了生产环境级别的镜像,涵盖了OpenStack用到的各个服务;Kolla为操作OpenStack云提供可生产的容器和部署工具。
Kolla-ansible部分提供了自动化的部署。Kolla-Ansible在Docker容器中部署OpenStack服务和基础设施组件。
1、安装kolla-ansible
# pip install git+https://opendev.org/openstack/kolla-ansible@stable/zed
2、获取Kolla配置文件
# 创建配置文件夹
# mkdir -p /etc/kolla
# chown $USER:$USER /etc/kolla
# 复制global.yml
与password.yml
到配置文件夹
# cp -r /path/to/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
3、获取Ansible清单文件
复制all-in-one与multinode两个清单文件,分别对应了单机部署与多节点部署
# cp /path/to/venv/share/kolla-ansible/ansible/inventory/* .
四、安装Ansible Galaxy依赖
# kolla-ansible install-deps
五、配置ansible,调优ansible
编辑/etc/ansible/ansible.cfg,如果没有则需要先创建,将下面的内容添加到配置文件中
# mkdir /etc/ansible/
# cat > /etc/ansible/ansible.cfg << EOF
[defaults]
host_key_checking=False
pipelining=True
forks=100
EOF
六、准备初始化配置
1、准备清单文件
单机部署时,使用all-in-one清单文件
多节点部署时,使用multinode清单文件
本实验采用单节点搭建,所以会用到在上一步复制到家目录的all-in-one配置文件。
#使用all-in-one清单文件
# vi all-in-one #在vi编辑环境中执行以下替换命令
:1,$s/localhost/allinone-kolla/
:1,$s/ansible_connection=local//
#测试Ansible的连通性
#配置完成后,使用下面的命令测试Ansible的连通性
# ansible -i all-in-one all -m ping
2、生成各个组件密码
# kolla-genpwd
#修改admin用户的密码
# vi /etc/kolla/passwords.yml
keystone_admin_password: 123456
3、配置global.yml
镜像选择:
Kolla可以选择多种镜像版本:
- CentOS Stream (centos)
- Debian (debian)
- Rocky (rocky)
- Ubuntu (ubuntu)
官方推荐新安装的使用rocky或ubuntu,这里使用和主机相同的rocky发行版。
#修改 /etc/kolla/globals.yml 文件:
# vi /etc/kolla/globals.yml #注意冒号:后有空格!
# 镜像仓库:访问国外quay.io可能比较慢,可以指定国内的quay.io源
docker_registry: "quay.nju.edu.cn"
# 管理接口ip,如果设置了高可用haproxy,此处为VIP(虚拟漂移IP),由keepalived提供高可用性,必须是管理网络中没有被使用的地址。这里使用ALLinOne配置,直接将ens33IP 写入即可。
kolla_internal_vip_address: "192.168.100.10"
# 内部网络,管理网络的网卡,也用于主机之间的通信
network_interface: "ens33"
# 外部网络接口,连接外部网络的网卡,需要一个开启的,没有配置IP的网卡
neutron_external_interface: "ens35"
# 关闭高可用haproxy
enable_haproxy: "no"
# 启用provider网络
enable_neutron_provider_networks: "yes"
# 设置虚拟化类型,这里为qemu,如果服务器支持硬件虚拟化请将此值改为kvm
nova_compute_virt_type: "qemu"
# cat /etc/kolla/globals.yml|grep -v ^#|grep -v ^$ #查看确认
注:以下项目为默认设置,可不用进行设置
# docker基础系统镜像默认
#kolla_base_distro: "rocky"
# openstack版本默认
#openstack_release: "zed"
# 设置网络插件为openvswitch 默认
#neutron_plugin_agent: "openvswitch"
七、开始部署
我这里采用单机部署,使用的是all-in-one清单文件,若为多节点部署请使用multinode清单文件。
1、引导服务器,部署前给节点安装依赖包
# kolla-ansible -i all-in-one bootstrap-servers
若报以下错误信息,则表明在尝试通过网络获取 GPG 密钥时,连接失败了,解决方法:检查网络连接,确保你的网络连接是活跃的,并且可以连接到互联网。或手动从提供 GPG 密钥的网站下载密钥,并导入它。
fatal: [allinone-kolla]: FAILED! => {"changed": false, "msg": "failed to fetch key at https://download.docker.com/linux/centos/gpg , error was: Request failed: <urlopen error _ssl.c:1112: The handshake operation timed out>"}
我这里并没有手动下载密钥,只是再次重新执行该命令就顺利通过了。
2、部署前检查
注意:以下kolla-ansible命令用于添加 ansible_python_interpreter 变量,用于指定 virtualenv 环境位置,否则执行可能报错:
# kolla-ansible -i all-in-one prechecks -e 'ansible_python_interpreter=/path/to/venv/bin/python'
#若报错:No module named 'docker',则执行以下安装:
# pip install 'docker==4.4.4'
# pip list #发现当前requests版本为2.30.0,本实验需要安装requests版本2.28.1才行,执行如下命令进行安装
……
pytz 2023.3
PyYAML 6.0
requests 2.30.0
resolvelib 0.5.4
rfc3986 2.0.0
……
# pip install 'requests==2.28.1'
然后再执行部署前检查:
# kolla-ansible -i all-in-one prechecks -e 'ansible_python_interpreter=/path/to/venv/bin/python'
3、开始部署
注:部署过程中会从quay.nju.edu.cn拉取30多个镜像,约5个多G,也许会很慢或失败,解决方法如下:
可以从已搭建好的私有镜像仓库拉取。
本次实验并没有搭建私有仓库,这里我把上次实验已拉取的镜像打包生成了zed.tar,如果不想拉取镜像,可把zed.tar提前上传到虚拟机,并执行命令docker load -i zed.tar,把镜像导入即可。
导入镜像:
# docker load -i zed.tar
# 开始部署
# kolla-ansible -i all-in-one deploy -e 'ansible_python_interpreter=/path/to/venv/bin/python'
部署成功,如下图所示:
八、使用OpenStack
1、命令行(OpenStack CLI)
# 安装openstack客户端,这里-c指定zed版本客户端所需要的依赖
# pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/zed
# 生成openrc文件
# kolla-ansible post-deploy
#使用openrc文件
# source /etc/kolla/admin-openrc.sh
接下来就可以使用OpenStack CLI了。如:查看用户列表:
# openstack user list
2、登录云平台(Horizon)
部署完成后,将allinone虚拟机第三个网卡ens35设置为:nat模式。
浏览器中访问kolla_internal_vip_address,输入账号密码即可。账号密码可在openrc文件中查看。即可访问dashboard:http://192.168.100.10,用户名及密码:admin、 123456
3、初始化OpenStack 如网络、安全组、实例类型等
以下两种方法二选一即可。
(1)方法一:通过init-runonce文件完成。
# cat /path/to/venv/share/kolla-ansible/init-runonce
首先,编辑init-runonce文件,注释掉 cirros镜像下载相关信息(下载速度特别慢)、设置外部网络相关等:
# vi /path/to/venv/share/kolla-ansible/init-runonce
# This EXT_NET_CIDR is your public network,that you want to connect to the internet via.
# 与外部连接网络 相关设置
ENABLE_EXT_NET=${ENABLE_EXT_NET:-1}
EXT_NET_CIDR=${EXT_NET_CIDR:-'192.168.200.0/24'}
EXT_NET_RANGE=${EXT_NET_RANGE:-'start=192.168.200.150,end=192.168.200.199'}
EXT_NET_GATEWAY=${EXT_NET_GATEWAY:-'192.168.200.2'
# 注释掉与镜像下载相关行
echo Checking for locally available cirros image.
# Let's first try to see if the image is available locally
# nodepool nodes caches them in $IMAGE_PATH
#if ! [ -f "${IMAGE_PATH}/${IMAGE}" ]; then #从此行开始注释掉以下12行
# IMAGE_PATH='./'
# if ! [ -f "${IMAGE_PATH}/${IMAGE}" ]; then
# echo None found, downloading cirros image.
# curl --fail -L -o ${IMAGE_PATH}/${IMAGE} ${IMAGE_URL}/${IMAGE}
# fi
#else
# echo Using cached cirros image from the nodepool node.
#fi
#echo Creating glance image.
#$KOLLA_OPENSTACK_COMMAND image create --disk-format qcow2 --container-format bare --public \
# --property os_type=${IMAGE_TYPE} --file ${IMAGE_PATH}/${IMAGE} ${IMAGE_NAME}
# cat /path/to/venv/share/kolla-ansible/init-runonce #查看确认
接下来,执行init-runonce,完成OpenStack初始化
# source /etc/kolla/admin-openrc.sh
# source /path/to/venv/share/kolla-ansible/init-runonce #只能执行一次!
#上传镜像:先上传镜像文件cirros-0.3.4-x86_64-disk.img到/root目录,然后再上传镜像
# openstack image create cirros --disk-format qcow2 --container-format bare <cirros-0.3.4-x86_64-disk.img
创建安全组test,放通22号端口
创建云主机,将安全组test绑定到所创建的云主机上,并为云主机绑定浮动IP
控制台登录到云主机,用户名:cirros、密码:cubswin:)
$ ip a
$ ping 8.8.8.8
(2)方法二:通过执行openstack命令或在图形化界面操作完成OpenStack初始化,如:
创建网络:络类型为:flat,物理网络physnet1,自定义外部网络名称,如public-test
上传镜像cirros:
# openstack image create cirros --disk-format qcow2 --container-format bare <cirros-0.3.4-x86_64-disk.img
创建云主机类型(实例类型):
内存:512MB
VCPU数量:1 VCPU
磁盘:1GB
创建安全组test,放通22号端口
创建云主机,将安全组test绑定到所创建的云主机上,并为云主机绑定浮动IP
Xshell或CRT连接云主机,用户名:cirros、密码:cubswin:)
# ping 8.8.8.8,测试连通性。
附录:
1、部署zed 版本的时候,遇到pip的版本问题,可以参考这个清单:
(venv) [root@allinone-kolla ~]# pip list
Package Version
---------------------- -----------
ansible 5.10.0
ansible-core 2.12.10
appdirs 1.4.4
attrs 22.1.0
autopage 0.5.1
certifi 2024.2.2
cffi 1.15.1
charset-normalizer 2.1.1
cliff 4.0.0
cmd2 2.4.2
cryptography 36.0.2
debtcollector 2.5.0
decorator 5.1.1
docker 4.4.4
dogpile.cache 1.1.8
hvac 2.1.0
idna 3.3
importlib-metadata 4.12.0
iso8601 1.0.2
Jinja2 3.1.3
jmespath 1.0.1
jsonpatch 1.32
jsonpointer 2.3
keystoneauth1 5.0.1
kolla-ansible 15.6.1.dev7
MarkupSafe 2.1.5
msgpack 1.0.4
munch 2.5.0
netaddr 0.8.0
netifaces 0.11.0
openstacksdk 0.101.0
os-service-types 1.7.0
osc-lib 2.6.2
oslo.config 9.0.0
oslo.i18n 5.1.0
oslo.serialization 5.0.0
oslo.utils 6.0.2
packaging 21.3
pbr 5.10.0
pip 24.0
prettytable 3.4.1
pycparser 2.21
pyparsing 3.0.9
pyperclip 1.8.2
python-cinderclient 9.1.1
python-keystoneclient 5.0.1
python-novaclient 18.1.0
python-openstackclient 6.0.1
pytz 2022.2.1
PyYAML 6.0
requests 2.28.1
requestsexceptions 1.4.0
resolvelib 0.5.4
rfc3986 1.5.0
setuptools 53.0.0
simplejson 3.17.6
six 1.16.0
stevedore 4.0.2
tzdata 2024.1
urllib3 1.26.12
wcwidth 0.2.5
websocket-client 1.7.0
wrapt 1.14.1
zipp 3.8.1
2、requests库概述
requests库是一个简洁且简单的处理HTTP请求的第三方库,它的最大优点是程序编写过程更接近正常URL访问过程。这个库建立在Python 语言的 urllib3库的基础上,类似这种在其他函数库之上再封装功能、提供更友好函数的方式在Python语言中十分常见。在Python生态圈里,任何人都有通过技术创新或体验创新发表意见和展示才华的机会。requests库支持非常丰富的链接访问功能,包括国际域名和URL获取、HTTP长连接和连接缓存、HTTP会话和Cookie保持、浏览器使用风格的SSL验证、基本的摘要认证、有效的键值对Cookie记录、自动解压缩、自动内容解码、文件分块上传、HTTP(S)代理功能、连接超时处理、流数据下载等。
3、docker镜像批量打包
由于在内网环境或网速较慢的时候,下载镜像比较慢,所以可以将镜像打包成文件进行拷贝。以下是一个批量打包镜像的语句,供参考。
批量打包镜像:
# docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o test.tar
将机器上的所有镜像打包到test.tar文件里面。
打包swift相关镜像:
# docker save $(docker images | grep swift | grep -v REPOSITORY |awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o swift.tar
加载镜像:
# docker load -i test.tar
4、安装OpenStack-Zed版报错解决方案
执行以下安装检查命令时报错如下:
# kolla-ansible -i all-in-one prechecks -e 'ansible_python_interpreter=/path/to/venv/bin/python'
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: docker.errors.DockerException: Error while fetching server API version: request() got an unexpected keyword argument 'chunked'
找出问题所在:requests版本不对
解决方法:
kolla-ansible部署zed 版本的时候,遇到pip的版本问题,可以参考这个清单:
通过观察两个pip list命令的结果发现,之所以报错是因为requests的版本问题,应该安装requests的2.28.1版本,执行命令如下:
# pip install 'requests==2.28.1'
然后接着向下执行命令就可以了。