当前位置: 首页 > news >正文

基于 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” 下拉列表中的 “控制台” 选项,进入云主机控制台界面,按照提示输入正确的登录名及密码,即可成功登录云主机

    相关文章:

  1. Java 大视界 -- Java 大数据中的联邦学习激励机制设计与实践(111)
  2. Git 2.48.1 官方安装与配置全流程指南(Windows平台)
  3. Attentive Eraser论文笔记
  4. 神经机器翻译:联合学习对齐和翻译
  5. ThreadLocal在多线程中传递上下文InheritableThreadLocal
  6. IDEA 2025最新版2024.3.3软件安装、插件安装、语言设置
  7. Redis实战篇《黑马点评》8 附近商铺
  8. 网络编程 day01
  9. Linux基础使用和程序部署
  10. UI自动化框架介绍
  11. sass语法@import将被放弃???升级@use食用指南!
  12. 互联网时代如何保证数字足迹的安全,以防个人信息泄露?
  13. Jenkins与Flutter项目持续集成实战指南
  14. 洛谷————P1634 禽兽的传染病
  15. 前端开发的“速度与激情”:ScriptEcho 助力应对 AI 时代的知识焦虑
  16. C++(蓝桥杯常考点)
  17. 【Java项目】基于SpringBoot的CSGO赛事管理系统
  18. SpringMVC中的常用注解和用法
  19. 【Transformer优化】什么是稀疏注意力?
  20. vue实例
  21. 吴志朴当选福建德化县人民政府县长
  22. 临港迎来鸿蒙智行“尚界”整车及电池配套项目,首款车型今秋上市
  23. 中使馆:奉劝菲方有关人士不要在台湾问题上挑衅,玩火者必自焚
  24. 赛力斯拟赴港上市:去年扭亏为盈净利59亿元,三年内实现百万销量目标
  25. 大理杨徐邱再审上诉案宣判:驳回上诉,维持再审一审判决
  26. 地下管道密布成难题,道路修整如何破局?