基于 openEuler 22.09 的 OpenStack Yoga 部署

openEuler 虚拟化环境部署

使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机

|------------|-----------------|------|
| 主机 | IP | 作用 |
| Controller | 192.168.184.110 | 控制节点 |
| Compute | 192.168.184.111 | 计算节点 |
| Storage | 192.168.184.112 | 存储节 |

一 基础配置

1.1 配置 yum 源

由于 openEuler 22.09 系统已经停止维护了,所以我们需要修改 yum 源为官方 Archive 的 yum 源

打开 /etc/yum.repos.d/openEuler.repo 文件,将下面所有涉及到 http://repo.openeuler.org/ 的部分改成 https://archives.openeuler.openatom.cn/

在三台机器上

root@controller \~#

sed -i 's|http://repo.openeuler.org/\|https://archives.openeuler.openatom.cn/\|g' /etc/yum.repos.d/openEuler.repo

然后更新 yum 源

root@controller \~# dnf update

1.2关闭防火墙等

在三台机器上

关闭防火墙

root@controller \~# systemctl disable --now firewalld

关闭 SELinux

root@controller \~# vi /etc/selinux/config

修改以下内容

SELINUX=disabled

修改hosts

在三台机器上

root@controller \~# cat >> /etc/hosts << EOF

192.168.184.110 controller

192.168.184.111 compute

192.168.184.112 storage

EOF

此时最好重启一下机器,以便应用刚才关闭的 SELinux

1.3 时间同步

集群要求每个节点的时间要保持一致,一半由时间同步软件保证,这里使用 chrony 软件

Controller 节点

首先,安装 chrony 服务

root@controller \~# dnf install -y chrony

然后,修改 /etc/chrony.conf 配置文件,新增如下内容

表示允许哪些IP从本节点同步时钟

pool ntp.aliyun.com iburst

allow 192.168.184.0/24

然后重启服务

root@controller \~# systemctl restart chronyd

其他两个节点

首先一样,安装 chrony 服务

root@compute \~# dnf install -y chrony

修改 /etc/chrony.conf 配置文件,修改内容如下

root@compute \~# vi /etc/chrony.conf

pool pool.ntp.org iburst

↑ 注释掉这行

root@compute \~# echo "server 192.168.184.110 iburst" >> /etc/chrony.conf

然后重启服务

root@compute \~# systemctl restart chronyd

配置完成后,检查一下结果,在其他非controller节点执行

root@compute \~# chronyc sources

返回结果如下所示,表示成功从 controller 同步时间

1.4安装数据库

数据库需要安装在 Controller 节点,这里我们选用 MariaDB 作为我们的数据库

首先安装 MariaDB

root@controller \~# dnf install mysql-config mariadb mariadb-server python3-PyMySQL -y

新增配置文件 /etc/my.cnf.d/openstack.cnf 内容如下所示

root@controller \~# vi /etc/my.cnf.d/openstack.cnf

mysqld

bind-address = 192.168.184.110

default-storage-engine = innodb

innodb_file_per_table = on

max_connections = 4096

collation-server = utf8_general_ci

character-set-server = utf8

然后启动服务器

root@controller \~# systemctl start mariadb

然后初始化数据库

root@controller \~# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB

SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current

password for the root user. If you've just installed MariaDB, and

haven't set the root password yet, you should just press enter here.

这里输入密码,由于我们是初始化MariaDB,直接回车就行

Enter current password for root (enter for none):

OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody

can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

这里根据提示输入N

Switch to unix_socket authentication Y/n n

... skipping.

You already have your root account protected, so you can safely answer 'n'.

输入Y,修改密码

Change the root password? Y/n y

这里输入两次密码

New password:

Re-enter new password:

Password updated successfully!

Reloading privilege tables..

... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone

to log into MariaDB without having to have a user account created for

them. This is intended only for testing, and to make the installation

go a bit smoother. You should remove them before moving into a

production environment.

输入Y,删除匿名用户

Remove anonymous users? Y/n y

... Success!

Normally, root should only be allowed to connect from 'localhost'. This

ensures that someone cannot guess at the root password from the network.

输入Y,关闭root远程登录权限

Disallow root login remotely? Y/n y

... Success!

By default, MariaDB comes with a database named 'test' that anyone can

access. This is also intended only for testing, and should be removed

before moving into a production environment.

输入Y,删除test数据库

Remove test database and access to it? Y/n y

  • Dropping test database...

... Success!

  • Removing privileges on test database...

... Success!

Reloading the privilege tables will ensure that all changes made so far

will take effect immediately.

输入Y,重载配置

Reload privilege tables now? Y/n y

... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MariaDB

installation should now be secure.

Thanks for using MariaDB!

然后我们来验证一下

root@controller \~# mysql -uroot -p

输入密码

Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MariaDB connection id is 11

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB (none)>

1.5 安装消息队列

消息队列安装在 Controller 节点,这里使用 rabbitmq 作为消息队列

首先,来安装软件包

root@controller \~# dnf install rabbitmq-server -y

然后启动服务

root@controller \~# systemctl start rabbitmq-server

然后配置openstack用户,RABBIT_PASS是openstack服务登录消息队里的密码,需要和后面各个服务的配置保持一致

root@controller \~# rabbitmqctl add_user openstack 000000

root@controller \~# rabbitmqctl set_permissions openstack ".*" ".*" ".*"

这里面的 000000 是 RABBIT_PASS,可以自己改,但是一定要记住

1.6 安装缓存服务

消息队列安装在 Controller 节点,这里使用 Memcached

首先,安装软件包

root@controller \~# dnf install memcached python3-memcached -y

修改配置文件 /etc/sysconfig/memcached

root@controller \~# vi /etc/sysconfig/memcached

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS="-1 127.0.0.1,::1,controller"

然后启动服务

root@controller \~# systemctl start memcached

二 部署服务

2.1 Keystone

Keystone 是 OpenStack 的身份服务(Identity Service),它负责管理用户、角色、项目(租户)和域的认证和授权。Keystone 是 OpenStack 的核心组件之一,所有其他 OpenStack 服务都依赖于 Keystone 来进行用户身份验证和授权,必须安装。

Controller 节点

首先创建 Keystone 数据库并授权

root@controller \~# mysql -uroot -p

Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MariaDB connection id is 13

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB (none)> CREATE DATABASE keystone;

Query OK, 1 row affected (0.009 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '000000 ';

Query OK, 0 rows affected (0.013 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.002 sec)

MariaDB (none)> exit

Bye

然后安装软件包

root@controller \~# dnf install openstack-keystone httpd mod_wsgi -y

然后配置 Keystone 配置文件

root@controller \~# vi /etc/keystone/keystone.conf

配置数据库入口

database

connection = mysql+pymysql://keystone:000000@controller/keystone

配置token provider

token

provider = fernet

然后同步数据库

root@controller \~# su -s /bin/sh -c "keystone-manage db_sync" keystone

然后初始化 Fernet 密钥仓库

root@controller \~# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

root@controller \~# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

然后启动服务

root@controller \~# keystone-manage bootstrap --bootstrap-password 000000 \

--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

然后配置 Apache HTTP Server

打开 httpd.conf 文件配置

root@controller \~# vi /etc/httpd/conf/httpd.conf

修改以下项,如果没有则新添加

ServerName controller

然后创建软连接

root@controller \~# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

然后启动 Apache HTTP 服务

root@controller \~# systemctl enable --now httpd.service

root@controller \~# systemctl status httpd.service

然后创建环境变量配置

root@controller \~# cat << EOF >> ~/.admin-openrc

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=000000

export OS_AUTH_URL=http://controller:5000/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

EOF

然后一次创建 domain, projects, users, roles

但是首先需要安装 python3-openstackclient

root@controller \~# dnf install python3-openstackclient -y

然后导入环境

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

创建 Project Service,其中 Domain Default 在 Keystone-mange bootstrap 时已创建

root@controller \~# openstack domain create --description "An Example Domain" example

root@controller \~# openstack project create --domain default --description "Service Project" service

创建(non-admin)project myproject,user myuser 和 role myrole,为 myproject 和 myuser 添加角色myrole

root@controller \~# openstack project create --domain default --description "Demo Project" myproject

root@controller \~# openstack user create --domain default --password-prompt myuser

密码:000000

root@controller \~# openstack role create myrole

将角色 myrole 分配给用户 myuser,并关联到项目 myproject,并验证角色是否已成功分配

root@controller \~# openstack role add --project myproject --user myuser myrole

root@controller \~# openstack role assignment list --project myproject --user myuser

然后对此进行验证

取消临时环境变量 OS_AUTH_URL和OS_PASSWORD

root@controller \~# source ~/.admin-openrc

root@controller \~# unset OS_AUTH_URL OS_PASSWORD

为 admin 用户请求 token

root@controller \~# 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

Password: 000000

为 myuser 用户请求 token

root@controller \~# openstack --os-auth-url http://controller:5000/v3 \

--os-project-domain-name Default --os-user-domain-name Default \

--os-project-name myproject --os-username myuser token issue

Password: 000000

2.2 Glance

Glance 是 OpenStack 中的镜像服务(Image Service),负责管理和存储虚拟机镜像。它允许用户上传、下载、删除和查询虚拟机镜像,并支持多种镜像格式(如 QCOW2、RAW、VMDK 等)。Glance 是 OpenStack 计算服务(Nova)的核心组件之一,为虚拟机提供启动镜像,必须安装

Controller 节点

首先创建 glance 数据库并授权

root@controller \~# mysql -u root -p

Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MariaDB connection id is 30

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB (none)> CREATE DATABASE glance;

Query OK, 1 row affected (0.011 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY '000000 ';

Query OK, 0 rows affected (0.018 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.011 sec)

MariaDB (none)> exit

Bye

初始化 glance 资源对象

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

创建用户时,命令行会提示输入密码,请输入自定义的密码

root@controller \~# openstack user create --domain default --password-prompt glance

User Password: 000000

Repeat User Password: 000000

添加 glance 用户到 Service Project 并指定 admin 角色

root@controller \~# openstack role add --project service --user glance admin

创建 glance 服务实例

root@controller \~# openstack service create --name glance --description "OpenStack Image" image

创建 glance API 服务

root@controller \~# openstack endpoint create --region RegionOne image public http://controller:9292

root@controller \~# openstack endpoint create --region RegionOne image internal http://controller:9292

root@controller \~# openstack endpoint create --region RegionOne image admin http://controller:9292

然后安装软件包

root@controller \~# dnf install openstack-glance -y

然后修改 glance 配置文件

root@controller \~# vi /etc/glance/glance-api.conf

添加/修改 以下内容

database

connection = mysql+pymysql://glance:000000@controller/glance

keystone_authtoken

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = glance

password = 000000

paste_deploy

flavor = keystone

glance_store

stores = file,http

default_store = file

filesystem_store_datadir = /var/lib/glance/images/

启动数据库

root@controller \~# su -s /bin/sh -c "glance-manage db_sync" glance

然后启动服务

root@controller \~# systemctl enable --now openstack-glance-api.service

然后导入环境变量并验证

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

然后下载镜像

root@controller \~# wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

然后再向 Image 服务上传镜像

root@controller \~# openstack image create --disk-format qcow2 --container-format bare \

--file cirros-0.4.0-x86_64-disk.img --public cirros

确认镜像上传并验证属性

root@controller \~# openstack image list

2.3 Placement

Placement 是 OpenStack 中的一个核心服务,主要负责资源调度和分配。它是 OpenStack 计算服

务(Nova)的重要组成部分,用于管理计算节点的资源(如 CPU、内存、存储等),并确保资源的有效利用和负载均衡

Controller 节点

安装、配置Placement服务前,需要先创建相应的数据库、服务凭证和API endpoints

root@controller \~# mysql -u root -p

Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MariaDB connection id is 49

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB (none)> CREATE DATABASE placement;

Query OK, 1 row affected (0.010 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.055 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.005 sec)

MariaDB (none)> exit

Bye

然后配置用户和Endpoint

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

创建 placement 用户并设置用户密码

root@controller \~# openstack user create --domain default --password-prompt placement

User Password: 000000

Repeat User Password: 000000

添加placement用户到service project并指定admin角色

root@controller \~# openstack role add --project service --user placement admin

创建 plancement 服务实体

root@controller \~# openstack service create --name placement \

--description "Placement API" placement

创建 Plance API 服务 Endpoints

root@controller \~# openstack endpoint create --region RegionOne \

placement public http://controller:8778

root@controller \~# openstack endpoint create --region RegionOne \

placement internal http://controller:8778

root@controller \~# openstack endpoint create --region RegionOne \

placement admin http://controller:8778

然后安装相关软件包

root@controller \~# dnf install openstack-placement-api -y

编辑 /etc/placement/placement.conf配置文件

root@controller \~# vi /etc/placement/placement.conf

placement_database

connection = mysql+pymysql://placement:000000@controller/placement

api

auth_strategy = keystone

keystone_authtoken

auth_url = http://controller:5000/v3

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = placement

password = 000000

数据库同步,填充 Placement 数据库

root@controller \~# su -s /bin/sh -c "placement-manage db sync" placement

然后通过重启 httpd 服务来启动服务

root@controller \~# systemctl restart httpd

然后我们来验证一下

通过 source admin 凭证,以获取 admin 命令行权限

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

执行状态检查

root@controller \~# placement-status upgrade check

这里可以看到Policy File JSON to YAML Migration的结果为Failure

这是因为在Placement中,JSON格式的policy文件从Wallaby版本开始已处于deprecated状态

可以参考提示,使用oslopolicy-convert-json-to-yaml工具 将现有的JSON格式policy文件转化为YAML格式

root@controller \~# oslopolicy-convert-json-to-yaml --namespace placement \

--policy-file /etc/placement/policy.json \

--output-file /etc/placement/policy.yaml

root@controller \~# mv /etc/placement/policy.json{,.bak}

注:当前环境中此问题可忽略,不影响运行。

然后针对 placement API 运行命令

首先来安装 osc-placement 插件

root@controller \~# dnf install python3-osc-placement -y

然后列出可用的资源类别以及特性

root@controller \~# openstack --os-placement-api-version 1.2 resource class list --sort-column name

root@controller \~# openstack --os-placement-api-version 1.6 trait list --sort-column name

2.4 Nova

Nova 是 OpenStack 中的核心组件之一,负责管理虚拟机实例(VM)的生命周期

它提供了虚拟机的创建、调度、启动、停止、重启、删除等功能

Nova 依赖于其他 OpenStack 组件(如 Keystone 用于身份认证,Glance 用于镜像管理,Neutron 用于网络管理等)来完成其工作

Controller节点

安装、配置Placement服务前,需要先创建相应的数据库、服务凭证和API endpoints

root@controller \~# mysql -u root -p

Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MariaDB connection id is 24

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB (none)> CREATE DATABASE nova_api;

Query OK, 1 row affected (0.000 sec)

MariaDB (none)> CREATE DATABASE nova;

Query OK, 1 row affected (0.000 sec)

MariaDB (none)> CREATE DATABASE nova_cell0;

Query OK, 1 row affected (0.000 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> exit

Bye

然后配置用户和 Engpoints

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

创建nova用户并设置用户密码

root@controller \~# openstack user create --domain default --password-prompt nova

User Password:000000

Repeat User Password:000000

然后添加nova用户到service project并指定admin角色

root@controller \~# openstack role add --project service --user nova admin

创建nova服务实体

root@controller \~# openstack service create --name nova --description "OpenStack Compute" compute

创建NovaAPI服务endpoints

root@controller \~# openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1

root@controller \~# openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1

root@controller \~# openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1

然后安装及配置组件

root@controller \~# dnf install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler -y

编辑 /etc/nova/nova.conf 配置文件

root@controller\~# vi /etc/nova/nova.conf

DEFAULT

enabled_apis = osapi_compute,metadata

transport_url = rabbit://openstack:000000@controller:5672/

my_ip = 192.168.184.110

log_dir = /var/log/nova

api

auth_strategy = keystone

api_database

connection = mysql+pymysql://nova:000000@controller/nova_api

database

connection = mysql+pymysql://nova:000000@controller/nova

keystone_authtoken

auth_url = http://controller:5000/v3

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = nova

password = 000000

vnc

enabled = true/

server_listen = $my_ip

server_proxyclient_address = $my_ip

glance

api_servers = http://controller:9292

oslo_concurrency

lock_path = /var/lib/nova/tmp

placement

region_name = RegionOne

project_domain_name = Default

project_name = service

auth_type = password

user_domain_name = Default

auth_url = http://controller:5000/v3

username = placement

password = 000000

然后同步数据库

首先同步nova-api数据库

root@controller \~# su -s /bin/sh -c "nova-manage api_db sync" nova

注册 cell0数据库

root@controller \~# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

注册cell1 cell

root@controller \~# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

同步nova数据库

root@controller \~# su -s /bin/sh -c "nova-manage db sync" nova

验证cell0和cell1注册正确

root@controller \~# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

然后启动服务

root@controller \~# systemctl enable --now \

openstack-nova-api.service \

openstack-nova-scheduler.service \

openstack-nova-conductor.service \

openstack-nova-novncproxy.service

Compute节点

首先让我们来安装软件包

root@compute \~# dnf install openstack-nova-compute -y

编辑 /etc/nova/nova.conf 配置文件

root@compute \~# vi /etc/nova/nova.conf

DEFAULT

enabled_apis = osapi_compute,metadata

transport_url = rabbit://openstack:000000@controller:5672

/my_ip = 192.168.184.111

compute_driver = libvirt.LibvirtDriver

instances_path = /var/lib/nova/instances

log_dir = /var/log/nova

api

auth_strategy = keystone

keystone_authtoken

auth_url = http://controller:5000/v3

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = nova

password = 000000

vnc

enabled = true

server_listen = $my_ip

server_proxyclient_address = $my_ip

novncproxy_base_url = http://controller:6080/vnc_auto.html

glance

api_servers = http://controller:9292

oslo_concurrency

lock_path = /var/lib/nova/tmp

placement

region_name = RegionOne

project_domain_name = Default

project_name = service

auth_type = password

user_domain_name = Default

auth_url = http://controller:5000/v3

username = placement

password = 000000

根据情况需要可以省略的步骤

然后确认compute节点是否支持虚拟机硬件加速(x86_64-Intel)

处理器为x86_64架构时,可通过运行如下命令确认是否支持硬件加速:

root@compute \~# egrep -c '(vmx|svm)' /proc/cpuinfo

如果返回值为0则不支持硬件加速,需要配置libvirt使用QEMU而不是默认的KVM。编辑 /etc/nova/nova.conf 的 libvirt 部分:

root@compute \~# vi /etc/nova/nova.conf

libvirt

virt_type = qemu

如果返回值为1或更大的值,则支持硬件加速,不需要进行额外的配置。

确认计算节点是否支持虚拟机硬件加速(arm64-AMD)

处理器为arm64架构时,可通过运行如下命令确认是否支持硬件加速

root@compute \~# virt-host-validate

该命令由libvirt提供,此时libvirt应已作为openstack-nova-compute依赖被安装,环境中已有此命令

显示FAIL时,表示不支持硬件加速,需要配置libvirt使用QEMU而不是默认的KVM。

QEMU: Checking if device /dev/kvm exists: FAIL (Check that CPU and firmware supports virtualization and kvm module is loaded)

编辑/etc/nova/nova.conf的libvirt部分

root@compute \~# /etc/nova/nova.conf

libvirt

virt_type = qemu

显示PASS时,表示支持硬件加速,不需要进行额外的配置。

QEMU: Checking if device /dev/kvm exists: PASS

配置qemu(仅arm64)

仅当处理器为arm64架构时需要执行此操作。

编辑/etc/libvirt/qemu.conf

root@compute \~# vi /etc/libvirt/qemu.conf

nvram = ["/usr/share/AAVMF/AAVMF_CODE.fd: \

/usr/share/AAVMF/AAVMF_VARS.fd", \

"/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw: \

/usr/share/edk2/aarch64/vars-template-pflash.raw"]

编辑/etc/qemu/firmware/edk2-aarch64.json

root@compute \~# vi /etc/qemu/firmware/edk2-aarch64.json

{

"description": "UEFI firmware for ARM64 virtual machines",

"interface-types": [

"uefi"

],

"mapping": {

"device": "flash",

"executable": {

"filename": "/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw",

"format": "raw"

},

"nvram-template": {

"filename": "/usr/share/edk2/aarch64/vars-template-pflash.raw",

"format": "raw"

}

},

"targets": [

{

"architecture": "aarch64",

"machines": [

"virt-*"

]

}

],

"features": [

],

"tags": [

]}

继续步骤

启动服务

root@compute \~# systemctl enable --now libvirtd.service openstack-nova-compute.service

Controller节点

然后回到 Controller 节点,添加计算节点到 OpenStack 集群

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

确认 nova-compute 服务已识别到数据库中

root@controller \~# openstack compute service list --service nova-compute

发现计算节点,将计算节点添加到cell数据库

root@controller \~# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

然后验证一下

首先列出服务组件,验证每个流程都成功启动和注册

root@controller \~# openstack compute service list

然后列出身份服务中的API端点,验证身份服务的连接

root@controller \~# openstack catalog list

之后列出镜像服务中的镜像,验证与镜像服务的连接

root@controller \~# openstack image list

最后验证一下 cells 是否运作成功,以及其他必要条件是否已具备

root@controller \~# nova-status upgrade check

2.5 Neutron

Neutron 是 OpenStack 中的网络服务组件,负责为 OpenStack 环境提供网络连接和 IP 地址管理

它允许用户创建和管理虚拟网络、子网、路由器、安全组等网络资源,从而为虚拟机(VM)提供网络功能

Controller节点

首先创建 keystone 数据库并授权

root@controller \~# mysql -u root -p

Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MariaDB connection id is 61

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB (none)> CREATE DATABASE neutron;

Query OK, 1 row affected (0.000 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> exit

Bye

设置环境变量

root@controller \~# source ~/.admin-openrc

root@controller \~# env | grep OS_

创建用户和服务

root@controller \~# openstack user create --domain default --password-prompt neutron

User Password:000000

Repeat User Password:000000

root@controller \~# openstack role add --project service --user neutron admin

root@controller \~# openstack service create --name neutron --description "OpenStack Networking" network

部署Neutron API服务

root@controller \~# openstack endpoint create --region RegionOne network public http://controller:9696

root@controller \~# openstack endpoint create --region RegionOne network internal http://controller:9696

root@controller \~# openstack endpoint create --region RegionOne network admin http://controller:9696

之后安装软件包

root@controller \~# dnf install -y openstack-neutron openstack-neutron-linuxbridge ebtables ipset openstack-neutron-ml2 -y

配置Neutron

root@controller \~# vi /etc/neutron/neutron.conf

database

connection = mysql+pymysql://neutron:000000@controller/neutron

DEFAULT

core_plugin = ml2

service_plugins = router

allow_overlapping_ips = true

transport_url = rabbit://openstack:000000@controller

auth_strategy = keystone

notify_nova_on_port_status_changes = true

notify_nova_on_port_data_changes = true

keystone_authtoken

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = neutron

password = 000000

nova

auth_url = http://controller:5000

auth_type = password

project_domain_name = Default

user_domain_name = Default

region_name = RegionOne

project_name = service

username = nova

password = 000000

oslo_concurrency

lock_path = /var/lib/neutron/tmp

配置ML2,ML2,具体配置可以根据需求自行修改,这里使用的是provider network + linuxbridge**

修改/etc/neutron/plugins/ml2/ml2_conf.ini(直接添加)

root@controller \~# vi /etc/neutron/plugins/ml2/ml2_conf.ini

ml2

type_drivers = flat,vlan,vxlan

tenant_network_types = vxlan

mechanism_drivers = linuxbridge,l2population

extension_drivers = port_security

ml2_type_flat

flat_networks = provider

ml2_type_vxlan

vni_ranges = 1:1000

securitygroup

enable_ipset = true

修改/etc/neutron/plugins/ml2/linuxbridge_agent.ini(直接添加)

root@controller \~# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini

linux_bridge

physical_interface_mappings = provider:ens33

vxlan

enable_vxlan = true

local_ip = 192.168.184.110

l2_population = true

securitygroup

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

配置Layer-3代理

修改 /etc/neutron/l3_agent.ini

root@controller \~# vi /etc/neutron/l3_agent.ini

DEFAULT

interface_driver = linuxbridge

配置DHCP代理 修改 /etc/neutron/dhcp_agent.ini

root@controller \~# vi /etc/neutron/dhcp_agent.ini

DEFAULT

interface_driver = linuxbridge

dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq

enable_isolated_metadata = true

配置metadata代理

修改 /etc/neutron/metadata_agent.ini

root@controller \~# vi /etc/neutron/metadata_agent.ini

DEFAULT

nova_metadata_host = controller

metadata_proxy_shared_secret = METADATA_SECRET

配置nova服务使用neutron,修改 /etc/nova/nova.conf

root@controller \~# vi /etc/nova/nova.conf

neutron

auth_url = http://controller:5000

auth_type = password

project_domain_name = default

user_domain_name = default

region_name = RegionOne

project_name = service

username = neutron

password = 000000

service_metadata_proxy = true

metadata_proxy_shared_secret = METADATA_SECRET

创建 /etc/neutron/plugin.ini的符号链接

root@controller \~# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

然后同步数据库

root@controller \~# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

然后重启nova api服务

root@controller \~# systemctl restart openstack-nova-api

最后启动网络服务

root@controller \~# systemctl enable --now neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-agent.service

Compute节点

首先安装软件包

root@compute \~# dnf install openstack-neutron-linuxbridge ebtables ipset -y

然后配置Neutron

修改 /etc/neutron/neutron.conf

root@compute \~# vi /etc/neutron/neutron.conf

DEFAULT

transport_url = rabbit://openstack:000000@controller

auth_strategy = keystone

keystone_authtoken

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = neutron

password = 000000

oslo_concurrency

lock_path = /var/lib/neutron/tmp

修改 /etc/neutron/plugins/ml2/linuxbridge_agent.ini

root@compute \~# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini

linux_bridge

physical_interface_mappings = provider:ens33

vxlan

enable_vxlan = true

local_ip = 192.168.184.111

l2_population = true

securitygroup

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

配置nova compute服务使用neutron,修改 /etc/nova/nova.conf

root@compute \~# vi /etc/nova/nova.conf

neutron

auth_url = http://controller:5000

auth_type = password

project_domain_name = default

user_domain_name = default

region_name = RegionOne

project_name = service

username = neutron

password = 000000

然后重启nova-compute服务

root@compute \~# systemctl restart openstack-nova-compute.service

最后启动服务

root@compute \~# systemctl enable --now neutron-linuxbridge-agent

root@compute \~# systemctl status neutron-linuxbridge-agent

2.6 Cinder

Cinder 是 OpenStack 项目中的一个核心组件,负责块存储(Block Storage)服务。

它是 OpenStack 的存储服务模块,允许用户创建和管理持久化的块存储卷(volumes),这些卷可以附加到虚拟机(VMs)上,作为虚拟机的存储设备

Controller节点

首先创建cinder数据库

root@controller \~# mysql -u root -p

Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MariaDB connection id is 155

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB (none)> CREATE DATABASE cinder;

Query OK, 1 row affected (0.000 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY '000000';

Query OK, 0 rows affected (0.001 sec)

MariaDB (none)> exit

Bye

初始化Keystone资源对象

root@controller \~# source ~/.admin-openrc

root@controller \~# openstack user create --domain default --password-prompt cinder

User Password:000000

Repeat User Password:000000

root@controller \~# openstack role add --project service --user cinder admin

root@controller \~# openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3

root@controller \~# openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v3/%\\(project_id\\)s

root@controller \~# openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v3/%\\(project_id\\)s

然后安装软件包

root@controller \~# dnf install openstack-cinder-api openstack-cinder-scheduler -y

修改cinder配置文件 /etc/cinder/cinder.conf

root@controller \~# vi /etc/cinder/cinder.conf

DEFAULT

transport_url = rabbit://openstack:000000@controller

auth_strategy = keystone

my_ip = 192.168.184.110

database

connection = mysql+pymysql://cinder:000000@controller/cinder

keystone_authtoken

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = cinder

password = 000000

oslo_concurrency

lock_path = /var/lib/cinder/tmp

数据库同步

root@controller \~# su -s /bin/sh -c "cinder-manage db sync" cinder

修改nova配置 /etc/nova/nova.conf

root@controller \~# vi /etc/nova/nova.conf

cinder

os_region_name = RegionOne

启动服务

root@controller \~# systemctl restart openstack-nova-api

root@controller \~# systemctl enable --now openstack-cinder-api openstack-cinder-scheduler

root@controller \~# systemctl status openstack-cinder-api openstack-cinder-scheduler

Storage节点

Storage节点要提前准备至少一块硬盘,作为cinder的存储后端

下文默认storage节点已经存在一块未使用的硬盘,设备名称为 /dev/sdb

首先来安装软件包

root@storage \~# dnf install lvm2 device-mapper-persistent-data scsi-target-utils rpcbind nfs-utils openstack-cinder-volume openstack-cinder-backup -y

然后配置lvm卷组

root@storage \~# pvcreate /dev/sdb

root@storage \~# vgcreate cinder-volumes /dev/sdb

修改cinder配置 /etc/cinder/cinder.conf

root@storage \~# vi /etc/cinder/cinder.conf

DEFAULT

transport_url = rabbit://openstack:000000@controller

auth_strategy = keystone

my_ip = 192.168.184.112

enabled_backends = lvm

glance_api_servers = http://controller:9292

keystone_authtoken

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = default

user_domain_name = default

project_name = service

username = cinder

password = 000000

database

connection = mysql+pymysql://cinder:000000@controller/cinder

lvm

volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver

volume_group = cinder-volumes

target_protocol = iscsi

target_helper = lioadm

oslo_concurrency

lock_path = /var/lib/cinder/tmp

然后启动服务

root@storage \~# systemctl start openstack-cinder-volume target

root@storage \~# systemctl start openstack-cinder-backup

然后我们回到 Controller 节点验证一下是否正确

root@controller \~# source ~/.admin-openrc

root@controller \~# openstack volume service list

创建一个卷来验证配置是否正确

root@controller \~# openstack volume create --size 1 test-volume

root@controller \~# openstack volume list

2.7 Horizon

Horizon是OpenStack提供的前端页面,可以让用户通过网页鼠标的操作来控制OpenStack集群,而不用繁琐的CLI命令行。Horizon一般部署在控制节点。

在 Controller 节点进行操作

首先来安装软件包

root@controller \~# dnf install openstack-dashboard -y

然后修改配置文件 /etc/openstack-dashboard/local_settings

root@controller \~# vi /etc/openstack-dashboard/local_settings

OPENSTACK_HOST = "controller"

ALLOWED_HOSTS = '\*',

OPENSTACK_KEYSTONE_URL = "http://controller:5000/v3"

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',

'LOCATION': 'controller:11211',

}

}

OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"

OPENSTACK_KEYSTONE_DEFAULT_ROLE = "member"

WEBROOT = '/dashboard'

POLICY_FILES_PATH = "/etc/openstack-dashboard"

OPENSTACK_API_VERSIONS = {

"identity": 3,

"image": 2,

"volume": 3,

}

然后重启服务

root@controller \~# systemctl restart httpd

至此,Horizon服务的部署已全部完成,打开浏览器,输入http://192.168.184.110/dashboard,打开horizon登录页面。

点击"登入"按钮登陆 Dashboard 操作界面

功能验证
  1. 账户管理模块

在Dashboard操作界面中单击"身份管理→用户",单击右上角的"创建用户"按钮,进入创建用户界面,在输入对应参数之后,单击"创建用户"按钮,创建用户

返回主界面,在Dashboard操作界面的用户列表中可以查看到创建成功的用户

使用远程工具连接controller节点,可以查看到创建的用户列表

root@controller \~# openstack user list | grep GCX

可以使用openstack user show命令,查询openstack-test用户详细信息

root@controller \~# openstack user show GCX

  1. 镜像模块

在Dashboard操作界面中单击"管理员→计算→镜像→创建镜像",进入镜像创建界面,在创建镜像界面中,可以自定义镜像名称,并且添加本地镜像文件(cirros-0.3.4-x86_64-disk.img)

在设置镜像格式为QCOW2后,可以根据其他相应要求进行配置,最后单击"创建镜像"按钮来完成镜像的创建。

  1. 网络模块

在Dashboard操作界面中单击"网络",根据要求创建相应的网络"testnet"

下拉框选择项目"admin",勾选"共享的"以及"外部网络"选项,使云主机能够连通外网

然后单击"下一步"按钮,进入创建子网界面,填写子网名称testsubnet,网络地址192.168.184.115/24,网关IP为192.168.184.2

然后单击"下一步"按钮,进入最后的确认界面,单击"创建网络"按钮

  1. 云主机模块

为了顺利创建实例,还需要提前创建实例类型。

在Dashboard操作界面中单击"管理员→计算→实例类型",然后单击"创建实例类型"按钮,在弹出的窗口输入相应的属性参数,名称为"test",vCPU数量1,内存512M,根磁盘1GB

最后单击右下方"创建实例类型"按钮即可完成创建

在以上几个模块都完成之后,就可以创建实例来使用。如果缺少了上述任何一个操作,都可能使实例创建失败

在Dashboard操作界面中单击"项目→计算→实例"按钮,单击右方"创建实例"按钮,进入创建实例界面,输入实例名称"test-instance"

接下来依次选择上述模块创建的 "源*" "实例类型*" "网络",单击"创建实例"按钮,完成实例的创建

创建完成后,等待片刻,即可在云主机列表中看到云主机 "test-instance" 正在运行中

选择当前实例 "Actions" 下拉列表中的 "控制台" 选项,进入云主机控制台界面,按照提示输入正确的登录名及密码,即可成功登录云主机

相关推荐
前端程序猿i6 小时前
Nginx 教程:从入门到能上线
运维·nginx
AskHarries6 小时前
权限模型:Shell、Browser、文件读写的安全边界
服务器·前端·网络
木雷坞6 小时前
Qdrant Docker 部署教程:数据卷、API Key 和集合初始化
运维·docker·容器·知识图谱
团象科技6 小时前
外贸站选海外服务器 拆解跨境运营中常被忽略的核心性能细节
运维·服务器
Lv_沐曦7 小时前
银河麒麟桌面版安装、多屏配置、触摸校准
运维·docker·samba·vsftpd·银河麒麟·触控校准·多屏配置
AI帮小忙7 小时前
主机安全排查
linux·服务器·安全
半壶清水7 小时前
ubuntu下利用ns-3 + NetAnim搭建可视化路由选路过程的方法
linux·运维·ubuntu
程序员老舅8 小时前
从内核视角,看Linux文件读写过程
linux·服务器·c++·内核·linux内核·vfs·linux内存
李少兄8 小时前
Linux服务器IP地址查询
linux·服务器·tcp/ip
ting94520008 小时前
SellerClaw 全栈技术深度拆解:基于多智能体集群的跨境电商全链路自动化系统实现
运维·自动化