openEuler 22.03 LTS SP4源码编译部署OpenStack-Dalmatian
openEuler 22.03 LTS SP4源码编译部署OpenStack-Dalmatian
- 说明
- 机器详情
- 安装操作系统注意事项
- 基础准备
-
- Controller节点 && Compute节点 && Block节点
-
- 关闭防火墙
- 关闭selinux
- 设置静态IP
- 更新
- 设置时区及时间同步
- 安装前准备
-
- Controller节点 && Compute节点 && Block节点
-
- 设置主机名
- 配置hosts
- 验证配置
- 安装 SQL DataBase
-
- Controller节点
-
- 安装软件包
- 编辑配置文件
- 启动服务
- 初始化配置
- 安装 RabbitMQ
-
- Controller节点
-
- 安装软件包
- 启动服务
- 添加openstack用户
- 设置openstack用户权限,允许进行配置、写、读
- 安装 Memcached
-
- Controller节点
-
- 安装软件包
- 编辑配置文件
- 启动服务
- 验证
- 安装Keystone
-
- Controller节点
-
- 下载源码包
- 创建数据库
- 安装httpd、mod_wsgi软件包
- 解压keystone-26.0.0.tar.gz
- 安装tox
- 安装postgresql-devel
- 安装openldap-devel
- 安装python3-devel
- 修改tox.ini
- 生成示例配置文件
- 安装所需依赖包
- 把SQLAlchemy的版本降为1.4.49
- 编译安装
- 降低bcrypt的版本
- 创建/etc/keystone文件夹
- 复制etc/目录下的内容到/etc/keystone
- 编辑keystone配置文件
- 创建keystone用户并提供sudo权限
- 同步数据库
- 初始化Fernet密钥仓库
- 启动服务
- 配置Apache HTTP server
- 重新启动Apache HTTP服务
- 创建脚本文件
- 下载openstackclient源码包
- 解压python-openstackclient-7.1.4.tar.gz
- 安装依赖包
- 编译安装
- 创建domain
- 创建project
- 创建user
- 创建role
- 将role添加到project和user
- 验证
- 安装Glance
-
- Controller节点
-
- 下载源码包
- 创建数据库
- 创建glance用户
- 将glacne添加到admin中去
- 创建glance服务实体
- 创建Image服务API端点
- 解压glance-29.0.0.tar.gz
- 修改tox.ini
- 生成示例配置文件
-
- 遇到的问题
- 原因
- 解决办法
- 安装依赖包
- 编译安装
- 创建/etc/glance文件夹
- 复制etc/文件夹下的内容到/etc/glance
- 创建并编辑glance配置文件
- 创建glance用户并提供sudo权限
- 同步数据库
- 编写servie并启动服务
- 验证
- 安装Placement
-
- Controller节点
-
- 下载源码包
- 创建数据库
- 创建placement用户
- 将用户添加到admin
- 创建placement服务实体
- 创建API 服务端点
- 解压openstack-placement-12.0.0.tar.gz
- 修改tox.ini
- 生成示例配置文件
- 安装依赖包
- 编译安装
- 创建/etc/placement文件夹
- 复制配置文件
- 编辑placement文件
- 创建placement用户并提供sudo权限
- 同步数据库
- 安装uwsgi
- 创建service并启动
- 重启httpd服务
- 验证1
- 下载osc-placement-4.5.0.tar.gz
- 解压osc-placement-4.5.0.tar.gz
- 安装依赖包
- 编译安装
- 验证2
- 安装Nova
-
- Controller节点
-
- 下载源码包
- 创建数据库
- 创建nova用户
- 添加到admin
- 创建nova服务实体
- 创建API服务端点
- 解压nova-30.0.0.tar.gz
- 修改tox.ini
- 生成示例配置文件
- 安装依赖包
- 编译安装
- 创建/etc/nova文件夹
- 复制etc/nova目录下的内容到/etc/nova
- 编辑nova配置文件
- 解压noVNC-1.5.0.tar.gz
- 复制到/usr/share/novnc
- 创建vnc_auto.html链接文件
- 创建nova用户并添加sudo权限
- 同步数据库
- 创建service并启动
- Compute节点
-
- 编译安装libvirt-7.0.0
- 安装dnsmasq
- 重启dnsmasq服务
- 下载源码包
- 解压nova-30.0.0.tar.gz
- 安装tox
- 修改tox.ini
- 生成示例配置文件
- 安装依赖包
- 降低SQLAlchemy的版本为1.4.49
- 编译安装
- 创建/etc/nova文件夹
- 复制etc/nova目录下的内容到/etc/nova
- 编辑nova配置文件
- 修改虚拟类型
- 安装libvirt-python
- 创建nova用户并提供sudo权限
- 编写service并启动
- 配置libvirted与nova的权限问题
- 验证(controller)
- 安装qemu-img(Controller && Compute && Block)
- 安装Neutron(使用的是OVN)
-
- 编译安装OVN(Controller节点 && Compute节点)
-
- 下载OVN源码包
- 解压
- 删除OVS空目录
- 解压OVS压缩包并移动到OVN目录下并重命名为OVS
- 进入ovs目录执行下面命令,对ovs进行编译安装
- 回到ovn目录执行下面命令对ovn进行编译安装
- Controller节点
-
- 下载源码包
- 创建数据库
- 创建neutron用户
- 添加到admin
- 创建neutron服务实体
- 创建API端点
- 解压neutron-25.1.0.tar.gz
- 修改tox.ini
- 生成示例配置文件
- 安装依赖包
- 编译安装
- 创建/etc/neutron文件夹
- 复制文件
- 编辑neutron配置文件
- 创建neutron用户并提供sudo权限
- 同步数据库
- 配置与启动OVS
- 编写service并启动
- 重启服务
- Compute节点
-
- 解压neutron-25.1.0.tar.gz
- 修改tox.ini
- 生成示例配置文件
- 安装依赖包
- 编译安装
- 创建/etc/neutron文件夹
- 复制文件
- 编辑neutron配置文件
- 配置与启动OVS
- 启动ovn-controller服务
- 设置OVN
- 创建neutron用户并提供sudo权限
- 编写服务并启动
- 配置验证(Controller)
- 配置OVN网络
-
- Controller节点 && Compute节点
- Controller节点
- 解决一个端口DOWN
- 安装Dashboard
-
- Controller节点
-
- 下载源码包
- 创建/etc/openstack_dashboard目录
- 解压horizon-25.1.0.tar.gz
- 安装依赖包
- 复制local_settings.py.example为local_settings.py并编辑
- 安装pymemcache
- 安装XStatic-Font-Awesome的版本为4.7.0.0
- 编译
- 收集静态资源
- 修改WEBROOT
- 生成horizon_wsgi.py
- 生成httpd的配置文件
- 修改生成的httpd的配置文件
- 修改权限
- 查询启动httpd的用户和组
- 重启httpd服务
- 安装Cinder
-
- Controller节点
-
- 下载源码包
- 创建数据库
- 创建cinder用户
- 添加到admin
- 创建 cinderv3 服务实体
- 创建API 端点
- 解压cinder-25.0.0.tar.gz
- 修改tox.ini
- 生成示例配置文件
- 安装依赖包
- 编译安装
- 创建/etc/cinder目录
- 移动文件到/etc/cinder目录
- 编辑/etc/cinder/cinder.conf
- 创建cinder用户并提供sudo权限
- 同步数据库
- 编写service并启动
- 验证
- Block节点
-
- 安装targetcli
- 解压cinder-25.0.0.tar.gz
- 修改tox.ini
- 安装tox
- 生成示例配置文件
- 安装依赖包
- 把SQLAlchemy的版本降为1.4.49
- 安装pymysql
- 编译安装
- 创建/etc/cinder目录
- 移动文件到/etc/cinder目录
- 编辑/etc/cinder/cinder.conf
- 编辑/etc/lvm/lvm.conf
- 创建cinder用户并提供sudo权限
- 编写service
- 创建volume group
- 启动服务
- Compute节点
-
- 修改/etc/nova/nova.conf
- 安装
- 重启服务
说明
本教程只用于学习,虽然能够成功运行,但是还有一些bug
机器详情
主机名 | IP | 磁盘 | CPU | 内存 |
---|---|---|---|---|
controller | ens160:192.168.46.31/24 ens192:不配置IP地址 |
100G | 2C | 8G |
compute1 | ens160:192.168.46.32/24 ens192:不配置IP地址 |
100G | 2C | 8G |
block1 | ens160:192.168.46.33/24 | sda:50G sdb:100G |
2C | 4G |
安装操作系统注意事项
安装操作只需注意的一步是Software Selection要勾选Development Tools
这会自动地帮我们安装一些基础的编译环境,如果你没有勾选,也无大碍,在编译安装时可能会遇到
报错说缺失一些编译环境,根据报错安装与之对应地编译环境即可解决
基础准备
Controller节点 && Compute节点 && Block节点
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
关闭selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
设置静态IP
nmtui
设置ens160网卡的IP地址为静态IP地址
设置ens192网卡不获取到IP地址(即设置为Disabled)
网卡配置生效命令
nmcli c reload
nmcli c up ens160
nmcli c up ens192
更新
dnf update -y && dnf -y upgrade
设置时区及时间同步
timedatectl set-timezone Asia/Shanghai
dnf -y install chrony
sed -i '/^pool/d' /etc/chrony.conf
echo "server ntp.aliyun.com iburst" >> /etc/chrony.conf
systemctl restart chronyd && systemctl enable chronyd
重启一下机器
安装前准备
Controller节点 && Compute节点 && Block节点
设置主机名
hostnamectl set-hostname controller
hostnamectl set-hostname compute1
hostnamectl set-hostname block1
配置hosts
vim /etc/hosts
192.168.46.31 controller
192.168.46.32 compute1
192.168.46.33 block1
验证配置
# Controller节点
ping -c 4 www.baidu.com
ping -c 4 compute1
ping -c 4 block1
# Compute节点
ping -c 4 www.baidu.com
ping -c 4 controller
ping -c 4 block1
# Block节点
ping -c 4 www.baidu.com
ping -c 4 controller
ping -c 4 compute1
安装 SQL DataBase
Controller节点
安装软件包
dnf install mariadb mariadb-server python3-PyMySQL -y
编辑配置文件
vim /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = Controller-IP
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
Controller-IP为Controller节点的IP地址
启动服务
systemctl restart mariadb.service && systemctl enable mariadb.service
初始化配置
mysql_secure_installation
安装 RabbitMQ
Controller节点
安装软件包
dnf install rabbitmq-server -y
启动服务
systemctl restart rabbitmq-server.service && systemctl enable rabbitmq-server.service
添加openstack用户
rabbitmqctl add_user openstack RABBIT_PASS
RABBIT_PASS为设置的密码
设置openstack用户权限,允许进行配置、写、读
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
安装 Memcached
Controller节点
安装软件包
dnf install memcached python3-memcached -y
编辑配置文件
vim /etc/sysconfig/memcached
OPTIONS="-l 127.0.0.1,::1,controller"
启动服务
systemctl restart memcached.service && systemctl enable memcached.service
验证
memcached-tool controller stats
安装Keystone
Controller节点
下载源码包
下载地址:https://releases.openstack.org/dalmatian/index.html#dalmatian-keystone
所需下载的源码包:keystone-26.0.0.tar.gz
创建数据库
mysql -u root -p
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
exit
KEYSTONE_DBPASS为要设置的密码
安装httpd、mod_wsgi软件包
dnf install httpd mod_wsgi -y
解压keystone-26.0.0.tar.gz
tar -xvf keystone-26.0.0.tar.gz
cd keystone-26.0.0/
安装tox
pip3 install tox -i https://mirrors.huaweicloud.com/repository/pypi/simple
安装postgresql-devel
dnf -y install postgresql-devel
安装openldap-devel
dnf -y install openldap-devel
安装python3-devel
dnf -y install python3-devel
修改tox.ini
vim tox.ini
deps =
-i https://mirrors.huaweicloud.com/repository/pypi/simple # 添加
生成示例配置文件
tox -egenconfig
tox -egenpolicy
安装所需依赖包
pip3 install -r requirements.txt -i https://mirrors.huaweicloud.com/repository/pypi/simple
把SQLAlchemy的版本降为1.4.49
pip3 install SQLAlchemy==1.4.49 -i https://mirrors.huaweicloud.com/repository/pypi/simple
编译安装
python3 setup.py install
降低bcrypt的版本
pip3 install bcrypt==4.0.1 -i https://mirrors.huaweicloud.com/repository/pypi/simple
创建/etc/keystone文件夹
mkdir /etc/keystone
复制etc/目录下的内容到/etc/keystone
cp -r etc/* /etc/keystone/
编辑keystone配置文件
cp /etc/keystone/keystone.conf.sample /etc/keystone/keystone.conf
cp /etc/keystone/keystone.policy.yaml.sample /etc/keystone/keystone.policy.yaml
vim /etc/keystone/keystone.conf
[database]
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
KEYSTONE_DBPASS为创建keystone用户设置的数据库访问密码
创建keystone用户并提供sudo权限
useradd -d /var/lib/keystone -s /usr/sbin/nologin -m keystone
visudo
keystone ALL=(ALL) NOPASSWD: ALL
同步数据库
su -s /bin/sh -c "keystone-manage db_sync" keystone
初始化Fernet密钥仓库
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
启动服务
keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
--bootstrap-admin-url http://controller:5000/v3/ \
--bootstrap-internal-url http://controller:5000/v3/ \
--bootstrap-public-url http://controller:5000/v3/ \
--bootstrap-region-id RegionOne
ADMIN_PASS为准备设置管理员用户的密码
配置Apache HTTP server
sed -i '/^#ServerName/s/#//' /etc/httpd/conf/httpd.conf && sed -i '/^ServerName/s/.*/ServerName controller/' /etc/httpd/conf/httpd.conf
cp /root/keystone-26.0.0/httpd/wsgi-keystone.conf /etc/httpd/conf.d/
mkdir /var/log/apache2/
重新启动Apache HTTP服务
systemctl restart httpd.service && systemctl enable httpd.service
创建脚本文件
vim admin-openrc.sh
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export OS_VOLUME_API_VERSION=3
ADMIN_PASS为启动Keystone服务设置的管理员用户的密码
chmod +x admin-openrc.sh
下载openstackclient源码包
下载地址:https://releases.openstack.org/dalmatian/index.html#dalmatian-python-openstackclient
所需下载的源码包:python-openstackclient-7.1.4.tar.gz
解压python-openstackclient-7.1.4.tar.gz
tar -xvf python-openstackclient-7.1.4.tar.gz
cd python-openstackclient-7.1.4/
安装依赖包
pip3 install -r requirements.txt -i https://mirrors.huaweicloud.com/repository/pypi/simple
编译安装
python3 setup.py install
创建domain
source admin-openrc.sh
openstack domain create --description "An Example Domain" example
创建project
openstack project create --domain default --description "Service Project" service
openstack project create --domain default --description "Demo Project" myproject
创建user
openstack user create --domain default --password-prompt myuser
创建role
openstack role create myrole
将role添加到project和user
openstack role add --project myproject --user myuser myrole
验证
source admin-openrc.sh
openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name admin --os-username admin token issue
安装Glance
Controller节点
下载源码包
下载地址:https://releases.openstack.org/dalmatian/index.html#dalmatian-glance
所需下载的源码包:glance-29.0.0.tar.gz
创建数据库
mysql -u root -p
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
IDENTIFIED BY 'GLANCE_DBPASS';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
IDENTIFIED BY 'GLANCE_DBPASS';
exit
GLANCE_DBPASS为要设置的密码
创建glance用户
source admin-openrc.sh
openstack user create --domain default --password-prompt glance
将glacne添加到admin中去
openstack role add --project service --user glance admin
创建glance服务实体
openstack service create --name glance --description "OpenStack Image" image
创建Image服务API端点
openstack endpoint create --region RegionOne image public http://controller:9292
openstack endpoint create --region RegionOne image internal http://controller:9292
openstack endpoint create --region RegionOne image admin http://controller:9292
解压glance-29.0.0.tar.gz
tar -xvf glance-29.0.0.tar.gz
cd glance-29.0.0/
修改tox.ini
vim tox.ini
deps =
-i https://mirrors.huaweicloud.com/repository/pypi/simple # 添加
生成示例配置文件
遇到的问题
[root@controller glance-29.0.0]# tox -e genconfig
.pkg: _optional_hooks> python /usr/local/lib/python3.9/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: get_requires_for_build_sdist> python /usr/local/lib/python3.9/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: get_requires_for_build_editable> python /usr/local/lib/python3.9/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: build_editable> python /usr/local/lib/python3.9/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
genconfig: install_package> python -m pip install -chttps://releases.openstack.org/constraints/upper/master --force-reinstall --no-deps /root/glance-29.0.0/.tox/.tmp/package/6/glance-29.0.0-0.editable-py3-none-any.whl
genconfig: commands[0]> oslo-config-generator --config-file etc/oslo-config-generator/glance-api.conf
Traceback (most recent call last):
File "/root/glance-29.0.0/.tox/genconfig/bin/oslo-config-generator", line 8, in <module>
sys.exit(main())
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_config/generator.py", line 831, in main
generate(conf)
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_config/generator.py", line 792, in generate
groups = _get_groups(_list_opts(conf.namespace))
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_config/generator.py", line 519, in _list_opts
loaders = _get_raw_opts_loaders(namespaces)
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_config/generator.py", line 459, in _get_raw_opts_loaders
mgr = stevedore.named.NamedExtensionManager(
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/stevedore/named.py", line 78, in __init__
extensions = self._load_plugins(invoke_on_load,
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/stevedore/extension.py", line 218, in _load_plugins
self._on_load_failure_callback(self, ep, err)
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/stevedore/extension.py", line 206, in _load_plugins
ext = self._load_one_plugin(ep,
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/stevedore/named.py", line 156, in _load_one_plugin
return super()._load_one_plugin(
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/stevedore/extension.py", line 240, in _load_one_plugin
plugin = ep.load()
File "/usr/lib64/python3.9/importlib/metadata.py", line 77, in load
module = import_module(match.group('module'))
File "/usr/lib64/python3.9/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "/root/glance-29.0.0/glance/opts.py", line 28, in <module>
import glance.api.middleware.context
File "/root/glance-29.0.0/glance/api/middleware/context.py", line 21, in <module>
from glance.api import policy
File "/root/glance-29.0.0/glance/api/policy.py", line 27, in <module>
from glance.domain import proxy
File "/root/glance-29.0.0/glance/domain/__init__.py", line 32, in <module>
CONF.import_opt('task_executor', 'glance.common.config', group='task')
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_config/cfg.py", line 2641, in import_opt
__import__(module_str)
File "/root/glance-29.0.0/glance/common/config.py", line 643, in <module>
policy.Enforcer(CONF)
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_policy/policy.py", line 542, in __init__
self.policy_file = policy_file or pick_default_policy_file(
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_policy/policy.py", line 377, in pick_default_policy_file
if conf.find_file(conf.oslo_policy.policy_file):
File "/root/glance-29.0.0/.tox/genconfig/lib/python3.9/site-packages/oslo_config/cfg.py", line 2780, in find_file
raise NotInitializedError()
oslo_config