openstack2403-wallaby 双节点部署指南

环境准备

本次部署使用欧拉2403两台虚拟机部署。

机器准备

两台机器：

10.130.0.167 控制节点 controller

10.130.0.114 计算节点 compute

配置 24.03 LTS 欧拉 yum 源

[OS]

name=OS

baseurl=https://eulermaker.compass-ci.openeuler.openatom.cn/api/ems2/repositories/openEuler_24.03_LTS_Epol_Loongarch_Multi-Version_OpenStack_Wallaby/openEuler%3A24.03-LTS/loongarch64/

metadata_expire=1h

enabled=1

gpgcheck=0

priority=1

gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler

[everything]

name=everything

baseurl=https://eulermaker.compass-ci.openeuler.openatom.cn/api/ems3/repositories/openEuler-24.03-LTS-everything:loongarch/openEuler%3A24.03-LTS/loongarch64/

metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/everything&arch=$basearch

metadata_expire=1h

enabled=1

gpgcheck=0

priority=20

gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/everything/$basearch/RPM-GPG-KEY-openEuler

[EPOL]

name=EPOL

baseurl=https://eulermaker.compass-ci.openeuler.openatom.cn/api/ems2/repositories/openEuler-24.03-LTS-epol:loongarch/openEuler%3A24.03-LTS/loongarch64/

metadata_expire=1h

enabled=1

gpgcheck=0

priority=30

gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler

[edk2]

name=eedk2

baseurl=https://eulermaker.compass-ci.openeuler.openatom.cn/api/ems3/repositories/openEuler-24.03-LTS-everything:loongarch-extra/openEuler%3A24.03-LTS/loongarch64

#baseurl=https://eulermaker.compass-ci.openeuler.openatom.cn/api/ems3/repositories/openEuler-24.03-LTS-everything:loongarch/openEuler%3A24.03-LTS/loongarch64/

metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/everything&arch=$basearch

metadata_expire=1h

enabled=1

gpgcheck=0

priority=30

gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler

yum update

yum clean all && yum makecache
修改主机名及映射

控制节点

命令行执行：

hostnamectl set-hostname controller

/etc/hosts

10.130.0.167 controller

10.130.0.114 compute

sudo su

计算节点

命令行执行：

hostnamectl set-hostname compute

/etc/hosts

10.130.0.167 controller

10.130.0.114 compute

sudo su
关闭selinux服务

控制节点和计算节点都执行

临时关闭：

setenforce 0

永久关闭：

vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加

注意：要关闭selinux， 否则在设置了/etc/httpd/conf.d/wsgi-keystone.conf配置文件后启动httpd服务会报错：

7月 25 17:47:29 controller httpd[11520]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:5000

7月 25 17:47:29 controller httpd[11520]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:5000

关闭防火墙

控制节点和计算节点都执行

临时关闭：

sudo systemctl stop firewalld

sudo systemctl disable firewalld

永久关闭：

yum remove firewalld

备注：若不关闭防火墙，后面dashboard服务可能会出现无法登录，或者登录后虚拟机的控制台无法显示等问题。

配置时钟同步

控制节点

安装chrony:

yum install -y chrony

修改/etc/chrony.conf，追加以下内容：

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

# ip需要根据具体环境修改

allow 10.130.0.0/24

重启服务

systemctl restart chronyd

计算节点

安装chrony:

yum install -y chrony

修改/etc/chrony.conf，追加以下内容：

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

# 如果有 server XXXX iburst, 需要注掉

# 如果有 pool pool.ntp.org iburst, 需要注掉, 表示不从公网同步时钟。

server controller iburst

重启服务

systemctl restart chronyd
验证时钟同步

执行chronyc sources，返回结果类似以下内容，则表示从controller节点同步时钟成功：

chronyc sources

MS Name/IP address Stratum Poll Reach LastRx Last sample

===============================================================================

^? controller 0 6 0 - +0ns[ +0ns] +/- 0ns

密码设置

在下面部署过程中，最好将所有的密码都设置成同一个，这样方便记忆，在这里部署时将所有的密码都设置成了00000

安装SQL

控制节点执行

mariadb

mariadb是mysql数据库的一个开源分支，广泛用于存储和管理数据。mariadb在openstack中的作用：

存储服务状态和配置数据：openstack的许多组件(如keystone、nova、glance等）都需要存储大量的状态数据、配置信息和其他结构化数据，mariadb用来存储这些信息。

持久化数据库：openstack使用mariadb作为关系型数据库，以持久化存储这些数据。如nova使用mariadb来存储虚拟机的实例信息，keystone使用它来存储认证和授权信息，neutron使用它来存储网络配置等。

（1）安装

yum install mariadb mariadb-server python3-PyMySQL

（2）创建并编辑 /etc/my.cnf.d/openstack.cnf 文件:

vim /etc/my.cnf.d/openstack.cnf

[mysqld]

bind-address = 10.130.0.167

default-storage-engine = innodb

innodb_file_per_table = on

max_connections = 4096

collation-server = utf8_general_ci

character-set-server = utf8
其中，bind-address设置为控制节点管理的IP地址。

启动database服务，并为其配置开机自启动

systemctl enable mariadb.service

systemctl start mariadb.service

配置database默认密码（可选）

这一步的目的是为数据库设置密码，也可以不设置，此时密码为空，回车即可。

mysql_secure_installation
根据提示执行即可

rabbitmq

消息队列服务，用于异步通信和任务调度。在openstack中的用于各组件之间的消息传递和任务调度，确保它们能够异步且可靠地协同工作。

消息传递：openstack组件之间需要进行大量的通信，而这些通信大多是异步的，rabbitmq充当消息代理，帮助openstack各个组件之间传递消息和指令。

分布式系统中的通信：rabbitmq在分布式系统中非常关键，可以有效的管理跨组件的消息队列，确保消息的可靠传递和处理。如nova组件需要通知neutron配置网络，或通知cinder配置存储，这些通信通过rabbitmq来实现。

任务队列管理：rabbitmq还用于管理和调度长时间运行的任务。比如，nova可以通过消息队列来请求其他服务执行某些任务，并异步等待结果。

控制节点执行

执行如下命令，安装软件包

yum install rabbitmq-server -y

启动 RabbitMQ 服务，并为其配置开机自启动

systemctl enable rabbitmq-server.service

systemctl start rabbitmq-server.service

添加openstack用户

rabbitmqctl add_user openstack RABBIT_PASS
替换 RABBIT_PASS为 OpenStack 服务登录消息队列的密码，下文中各个服务都会用到，务必保持一致。

设置openstack权限，允许配置、写、读

rabbitmqctl set_permissions openstack ".*" ".*" ".*"
memcached

在openstack中，通常使用memcached作为keystone服务的缓存层，以提高身份验证和授权的性能和可扩展性。keystone服务需要频繁地访问数据库来验证用户身份和授权访问权限，使用memcached缓存可以减少对数据库的访问次数，从而提高keystone服务的性能和可靠性。

控制节点执行

（1）执行如下命令，安装依赖软件包。

yum install memcached python3-memcached

编辑 /etc/sysconfig/memcached 文件

可用以下内容直接替换：

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

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

执行如下命令，启动 Memcached 服务，并为其配置开机启动。

systemctl enable memcached.service

systemctl start memcached.service

服务验证

因为在/etc/hosts中已经设置了controller，因此可以直接使用controller：

memcached-tool controller stats
部署openstack

keystone

keystone是openstack的核心组件，用于身份认证和授权。它提供了一个中央身份管理系统，可以管理openstack的用户、角色和服务等。

部署在控制节点

安装软件包

yum install -y openstack-keystone httpd mod_wsgi

yum install -y python3-openstackclient
创建keystone数据库并授权

KEYSTONE_DBPASS替换为keystone数据库密码

mysql -u root -p

MariaDB [(none)]> CREATE DATABASE keystone;

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

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

MariaDB [(none)]> exit
备注：GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS'; 命令的作用：

GRANT ALL PRIVILEGES：授予用户所有权限，包括查询、插入、更新、删除、创建和删除表等。

ON keystone.*：指定权限应用与keystone数据库中的所有表。

TO 'keystone'@'localhost'：将这些权限授予用户keystone，该用户只能从localhost(本地机器)访问数据库。localhost限制了该用户只能从一个运行数据库的同一台机器上进行访问。

TO 'keystone'@'%'： 表示用户keystone可以从任何主机访问数据库。

配置keystone

在/etc/keystone/keystone.conf中替换以下内容：

[database]

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

[token]

provider = fernet
KEYSTONE_DBPASS替换为keystone数据库密码

（4）同步数据库

su -s /bin/sh -c "keystone-manage db_sync" keystone

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

2024-08-06 10:22:39.702 95011 INFO migrate.versioning.api [-] 66 -> 67...

2024-08-06 10:22:46.375 95011 INFO migrate.versioning.api [-] done

2024-08-06 10:22:46.377 95011 INFO migrate.versioning.api [-] 67 -> 68...

2024-08-06 10:22:46.385 95011 INFO migrate.versioning.api [-] done

2024-08-06 10:22:46.386 95011 INFO migrate.versioning.api [-] 68 -> 69...

2024-08-06 10:22:46.398 95011 INFO migrate.versioning.api [-] done

......

2024-08-06 10:23:12.997 95011 INFO migrate.versioning.api [-] done

"keystone-manage db_sync" keystone 表示在keystone用户的权限下同步keystone数据库，‘keystone-manage db_sync’是keystone服务的一个管理命令，用于同步keystone数据库的架构，这会根据当前的数据库迁移脚本（通常位于/usr/share/keystone/common/sql/migrate_repo/）

（5）初始化Fernet密钥仓库

keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

[root@controller ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

2024-08-06 10:25:02.381 95180 INFO keystone.common.utils [-] /etc/keystone/fernet-keys/ does not appear to exist; attempting to create it

2024-08-06 10:25:02.383 95180 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/fernet-keys/0.tmp

2024-08-06 10:25:02.384 95180 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/fernet-keys/0

2024-08-06 10:25:02.384 95180 INFO keystone.common.fernet_utils [-] Starting key rotation with 1 key files: ['/etc/keystone/fernet-keys/0']

2024-08-06 10:25:02.384 95180 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/fernet-keys/0.tmp

2024-08-06 10:25:02.384 95180 INFO keystone.common.fernet_utils [-] Current primary key is: 0

2024-08-06 10:25:02.385 95180 INFO keystone.common.fernet_utils [-] Next primary key will be: 1

2024-08-06 10:25:02.385 95180 INFO keystone.common.fernet_utils [-] Promoted key 0 to be the primary: 1

2024-08-06 10:25:02.385 95180 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/fernet-keys/0
keystone-manage fernet_setup命令会生成一组fernet密钥。fernet是一种对称加密工具，用于加密和解密openstack中的令牌(token)；

--keystone-user和--keystone-group用于确保生成的密钥文件和相关配置属于keystone用户和组，以确保keystone服务能够访问和使用这些密钥文件。

一旦密钥生成，keystone服务将使用这些密钥来加密和解密通过openstack系统传输的令牌。这些令牌用于认证和授权用户访问各种openstack服务。

keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

[root@controller ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

2024-08-06 10:25:27.370 95186 INFO keystone.common.utils [-] /etc/keystone/credential-keys/ does not appear to exist; attempting to create it

2024-08-06 10:25:27.373 95186 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/credential-keys/0.tmp

2024-08-06 10:25:27.373 95186 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/credential-keys/0

2024-08-06 10:25:27.374 95186 INFO keystone.common.fernet_utils [-] Starting key rotation with 1 key files: ['/etc/keystone/credential-keys/0']

2024-08-06 10:25:27.374 95186 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/credential-keys/0.tmp

2024-08-06 10:25:27.374 95186 INFO keystone.common.fernet_utils [-] Current primary key is: 0

2024-08-06 10:25:27.375 95186 INFO keystone.common.fernet_utils [-] Next primary key will be: 1

2024-08-06 10:25:27.375 95186 INFO keystone.common.fernet_utils [-] Promoted key 0 to be the primary: 1

2024-08-06 10:25:27.375 95186 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/credential-keys/0

（6）启动服务

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，为 admin 用户设置密码

（7）配置Apache HTTP server

在 /etc/httpd/conf/httpd.conf中添加以下内容：

ServerName controller

（8）创建软连接

ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
（9）启动Apache HTTP服务。

systemctl enable httpd.service

systemctl start httpd.service
注意：要关闭selinux服务

（10）设置环境变量

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=[REDACTED]

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

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

EOF

注意：替换 ADMIN_PASS 为 admin 用户的密码

（11）依次创建domain, projects, users, roles

1）导入环境变量

source ~/.admin-openrc

此时便可以使用openstack 命令查看相关信息，如下使用openstack查看相关domain信息：

[root@controller ~]# openstack domain list

+---------+---------+---------+--------------------+

| ID | Name | Enabled | Description |

+---------+---------+---------+--------------------+

| default | Default | True | The default domain |

+---------+---------+---------+--------------------+

创建project service，其中 domain default 在 keystone-manage bootstrap 时已创建

创建一个名为example的domain

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

+-------------+----------------------------------+

| Field | Value |

+-------------+----------------------------------+

| description | An Example Domain |

| enabled | True |

| id | 89402299222b4c77bd184a5bd40cee29 |

| name | example |

| options | {} |

| tags | [] |

如果上面的命令正常，则创建名为service的project

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

+-------------+----------------------------------+

| Field | Value |

+-------------+----------------------------------+

| description | Service Project |

| domain_id | default |

| enabled | True |

| id | 884a3183b16944a6aad317c058149efb |

| is_domain | False |

| name | service |

| options | {} |

| parent_id | default |

| tags | [] |

+-------------+----------------------------------+

创建（non-admin）project myproject，user myuser 和 role myrole，为 myproject 和 myuser 添加角色myrole

openstack project create --domain default --description "Demo Project" myproject

openstack user create --domain default --password-prompt myuser

openstack role create myrole

openstack role add --project myproject --user myuser myrole
注：上下文中遇到--password-prompt的步骤都需要用户来设置密码，部署过程中一定要保证这些密码与配置文件中的一致。

（12）验证

1）取消临时环境变量OS_AUTH_URL和OS_PASSWORD：

source ~/.admin-openrc

unset OS_AUTH_URL OS_PASSWORD

2）为admin用户请求token：

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

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

[REDACTED]

| Field | Value |

+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| expires | 2024-07-25T13:15:33+0000 |

| id | gAAAAABmokHlNZm5TM52H9RMTwd0YYRcZcgcE3ONdGy-ABUMWGrSx5s33uJf2YEXmgYZMOmIl4iJi__w3ti_lVLpaaymTAeZEC5MEbmjbWNg58U542lfQa15hC2LL5-oDKPyb6cHPnPgXy1FSR58ZOfEAU1Ntg2fLcrTjyqXKL5cxHvRAfvlcf4 |

| project_id | 18ea12acdac04560b40c5b42c98c0688 |

| user_id | 42fc42133ad24f74afb656b3e941249b |

+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

3）为myuser用户请求token：

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

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

[REDACTED]

| Field | Value |

+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| expires | 2024-07-25T13:16:10+0000 |

| id | gAAAAABmokIKi3az4-9rtVv0nZH1Pn3ZC7eFPMXwYvi_ahPA9WdTQ0DZbrcYKZcPl5bn--z4OuEs9zxunPCBD1kzXCx6rdrYwX7hr5bX2lFQn-0ttY8R-uXKkfhako9eWrLB64KuZ2Qkm42j2RWmKbAmZPKQVy_E1AySBbljxvx0vUiNiugO1kk |

| project_id | 2550492561a14881b4beccc952af9f17 |

| user_id | adf77fe621124c24a04b34115241a9e4 |

+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Glance

Glance是openstack的一个组件，提供了一个中央镜像管理系统，可以管理openstack中的虚拟机镜像。

部署在控制节点

安装软件

yum install -y openstack-glance

创建glance数据库并授权，需要替换GLANCE_DBPASS为glance数据库设置密码：

[REDACTED] -u root -p

MariaDB [(none)]> CREATE DATABASE glance;

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

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

MariaDB [(none)]> exit

创建用户

会提示设置GLANCE_PASS密码：

[REDACTED] ~/.admin-openrc

openstack user create --domain default --password-prompt glance

User Password:

[REDACTED] User Password:

添加glance用户到service project并指定admin的role

openstack role add --project service --user glance admin

创建glance服务实体

openstack service create --name glance --description "OpenStack 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配置文件

设置/etc/glance/glance-api.conf的内容如下，替换GLANCE_DBPASS为glance数据库密码，GLANCE_PASS为glance用户密码

[database]

connection = mysql+pymysql://glance:GLANCE_DBPASS@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 = [REDACTED]

[paste_deploy]

flavor = keystone

[glance_store]

stores = file,http

default_store = file

filesystem_store_datadir = /var/lib/glance/images/

同步数据库

su -s /bin/sh -c "glance-manage db_sync" glance

使能并启动服务

systemctl enable openstack-glance-api.service

systemctl start openstack-glance-api.service

上传镜像

本次部署使用欧拉2403镜像，在本地下载欧拉2403镜像，这里使用的qcow2格式

wget https://repo.openeuler.org/openEuler-24.03-LTS/virtual_machine_img/loongarch64/openEuler-24.03-LTS-loongarch64.qcow2.xz

xz -d openEuler-24.03-LTS-loongarch64.qcow2.xz

上传镜像

source ~/.admin-openrc

openstack image create --disk-format qcow2 --container-format bare \

--file openEuler-24.03-LTS-loongarch64.qcow2 --public eulerQcow

此时执行openstack命令便可以在镜像列表中看到上传的镜像：

[root@controller home]# openstack image list

+--------------------------------------+-----------+--------+

| ID | Name | Status |

+--------------------------------------+-----------+--------+

| 717ceda8-e97e-4e12-a5e0-976d8f06c08c | archlinux | active |

| 56820e9c-4694-4274-a0d0-1c2e6e7827bb | eulerQcow | active |

+--------------------------------------+-----------+--------+
上面结果显示两个，是因为在部署时上传了两个镜像。

Placement

placement是openstack的一个组件，它提供了一个中央资源管理系统，用于资源调度和分配，可以管理openstack中的计算、存储和网络资源。

部署在控制节点

安装软件包

yum install -y openstack-placement-api

创建placement数据库

替换PLACEMENT_DBPASS为placement数据库密码

mysql -u root -p

MariaDB [(none)]> CREATE DATABASE placement;

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

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

MariaDB [(none)]> exit

创建用户，这一阶段会提升设置PLACEMENT_PASS密码

source ~/.admin-openrc

openstack user create --domain default --password-prompt placement

User Password:

[REDACTED] User Password:

添加Placement用户到service project并指定admin的role

openstack role add --project service --user placement admin

创建placement服务实体

openstack service create --name placement --description "Placement API" placement

创建API端点

openstack endpoint create --region RegionOne placement public http://controller:8778

openstack endpoint create --region RegionOne placement internal http://controller:8778

openstack endpoint create --region RegionOne placement admin http://controller:8778

编辑配置文件

/etc/placement/placement.conf文件内容如下，替换 PLACEMENT_DBPASS 为 Placement 数据库密码，PLACEMENT_PASS 为 Placement 用户密码。

[placement_database]

connection = mysql+pymysql://placement:PLACEMENT_DBPASS@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 = [REDACTED]

同步数据库

su -s /bin/sh -c "placement-manage db sync" placement

重启httpd服务

systemctl restart httpd

验证

状态检查：

source ~/.admin-openrc

placement-status upgrade check

[root@controller openstack]# placement-status upgrade check

+----------------------------------------------------------------------+

| Upgrade Check Results |

+----------------------------------------------------------------------+

| Check: Missing Root Provider IDs |

| Result: Success |

| Details: None |

+----------------------------------------------------------------------+

| Check: Incomplete Consumers |

| Result: Success |

| Details: None |

+----------------------------------------------------------------------+

| Check: Policy File JSON to YAML Migration |

| Result: Failure |

| Details: Your policy file is JSON-formatted which is deprecated. You |

| need to switch to YAML-formatted file. Use the |

| ``oslopolicy-convert-json-to-yaml`` tool to convert the |

| existing JSON-formatted files to YAML in a backwards- |

| compatible manner: https://docs.openstack.org/oslo.policy/ |

| latest/cli/oslopolicy-convert-json-to-yaml.html. |

+----------------------------------------------------------------------+

验证API运行：

# 安装osc-placement插件

dnf install -y python3-osc-placement

列出可用的资源类别及特性：

openstack --os-placement-api-version 1.2 resource class list --sort-column name

openstack --os-placement-api-version 1.6 trait list --sort-column name
3.4 Nova

Nova是openstack的一个组件，提供了一个中央计算管理系统，用于管理计算资源。可以管理openstack中的虚拟机实例、网络和存储等资源。

在控制节点和计算节点都需要部署

控制节点

安装软件包

yum install -y openstack-nova-api openstack-nova-conductor \ openstack-nova-novncproxy openstack-nova-scheduler

创建nova数据库并授权

替换NOVA_DBPASS为NOVA数据库设置密码

mysql -u root -p

MariaDB [(none)]> CREATE DATABASE nova_api;

MariaDB [(none)]> CREATE DATABASE nova;

MariaDB [(none)]> CREATE DATABASE nova_cell0;

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

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

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

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

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

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

MariaDB [(none)]> exit

创建用户

会提示设置NOVA_PASS密码

source ~/.admin-openrc

openstack user create --domain default --password-prompt nova

User Password:

[REDACTED] User Password:

添加nova用户到service project并指定admin的role

openstack role add --project service --user nova admin

创建nova服务实体

openstack service create --name nova --description "OpenStack Compute" compute

创建Nova服务API端点

openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1

openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1

openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1

编辑配置文件

/etc/nova/nova.conf文件内容如下，注意将其中的my_ip地址替换为自己的controller ip地址，RABBIT_PASS为RabbitMQ服务库密码，NOVA_PASS为nova账户密码，NOVA_DBPASS为nova数据库密码，PLACEMENT_PASS为Placement用户密码。

[DEFAULT]

enabled_apis = osapi_compute,metadata

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

my_ip = 10.130.0.167

log_dir = /var/log/nova

[api_database]

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

[database]

connection = mysql+pymysql://nova:NOVA_DBPASS@controller/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 = [REDACTED]

[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 = [REDACTED]

数据库同步

1）同步nova-api数据库

su -s /bin/sh -c "nova-manage api_db sync" nova

备注：该命令是在openstack环境中对nova api数据库进行同步操作。这个命令会根据当前安装的nova版本，对API数据库中的表结构和数据进行迁移和升级，以确保数据库与nova代码中的最新数据模型保持一致。

数据库迁移：更新数据库的表结构，添加、修改或删除表、列等，以符合当前nova版本的要求。

数据迁移：在数据库表结构变化的同时，对已有的数据进行转换或迁移，确保现有数据能够在新的表结构下正常使用。

初始化数据库：在首次部署openstack时，nova-manage api_db sync会创建nova api数据库的初始表结构。

注册cell0数据库

将cell0注册到nova数据库：

su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

注意：下面的警告不影响

[root@controller noarch]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

2024-08-06 15:24:37.722 113735 WARNING oslo_policy.policy [req-ba266dc1-16e8-4d56-97b0-6c8a5f8622a8 - - - - -] JSON formatted policy_file support is deprecated since Victoria release. You need to use YAML format which will be default in future. You can use ``oslopolicy-convert-json-to-yaml`` tool to convert existing JSON-formatted policy file to YAML-formatted in backward compatible way: https://docs.openstack.org/oslo.policy/latest/cli/oslopolicy-convert-json-to-yaml.html.

2024-08-06 15:24:37.724 113735 WARNING oslo_policy.policy [req-ba266dc1-16e8-4d56-97b0-6c8a5f8622a8 - - - - -] JSON formatted policy_file support is deprecated since Victoria release. You need to use YAML format which will be default in future. You can use ``oslopolicy-convert-json-to-yaml`` tool to convert existing JSON-formatted policy file to YAML-formatted in backward compatible way: https://docs.openstack.org/oslo.policy/latest/cli/oslopolicy-convert-json-to-yaml.html.

备注：

《1》cell0是一个特殊的cell单元，用于保存未能成功调度到其他cell（如cell1等）的实例信息。通常，cell0只包含失败的实例，用于跟踪调度失败的情况。cell0本质上是一个垃圾桶cell，不需要数据库连接，因为不存储实际的实例数据。

nova-manage cell_v2 map_cell0 nova 会在nova的cell数据库中为cell0创建一条记录。这一步在多cell部署的初始化过程中是必须的，它将cell0关联到nova的cell数据库中。通过映射cell0，可以确保那些无法成功调度的实例仍然有记录保留，有助于调试和监控。

《2》cell v2是openstack nova中的cell v2架构。cell v2是openstack nova的一个架构模式。用于提高nova的可扩展性和管理能力，特别是在大规模部署中。以下是cell_v2的主要作用：

提高可扩展性：cell v2架构将一个大型的nova部署分割成多个较小的cell单元，每个cell运行自己的nova计算服务和数据库。这种分层结构使得管理和扩展nova变得更加容易和高效。

隔离故障：在cell v2中，每个cell都是相对独立的，一个cell的故障不会影响其他cell的运行，提高了系统的稳定性和可靠性。

调度和分发：有一个全局调度层，在这个层面上，nova可以决定在哪个cell中创建新的虚拟机实例。这种设计使得资源的分配和利用更加灵活。

层次化管理：cell v2提供了更好的层次化管理能力，使得运营团队可以分别管理不同的cells，并在需要时扩展新的cells，而不需要重构整个系统。

《2》cell v2与cell v1的区别

在openstack的早期版本中，存在cell v1架构，但它功能有限且负载，cell v2是对cell v1的重构和改进，解决了许多扩展性和管理上的问题。

创建cell1 cell

su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

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

--transport-url not provided in the command line, using the value [DEFAULT]/transport_url from the configuration file

--database_connection not provided in the command line, using the value [database]/connection from the configuration file

5c220aa6-1eac-48ea-992d-f601d6e954e2

该命令会在nova的cell数据库中为cell1注册一条记录，并存储必要的配置信息，如数据库连接信息和消息连接信息等，使nova知道该如何与这个cell进行交互。

创建新的cell是多cell架构中不可或缺的一部分。通过create_cell命令创建的cell可以被nova调度程序识别，并用于在其中创建和运行虚拟机实例。

同步nova数据库

su -s /bin/sh -c "nova-manage db sync" nova

验证cell0和cell1注册正确

su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

[root@controller noarch]# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+

| 名称 | UUID | Transport URL | 数据库连接 | Disabled |

+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+

| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@controller/nova_cell0 | False |

| cell1 | 5c220aa6-1eac-48ea-992d-f601d6e954e2 | rabbit://openstack:****@controller:5672/ | mysql+pymysql://nova:****@controller/nova | False |

+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+

使能并启动服务

systemctl enable \

openstack-nova-api.service \

openstack-nova-scheduler.service \

openstack-nova-conductor.service \

openstack-nova-novncproxy.service

systemctl start \

openstack-nova-api.service \

openstack-nova-scheduler.service \

openstack-nova-conductor.service \

openstack-nova-novncproxy.service

计算节点

（1）安装软件包

yum install -y openstack-nova-compute

编辑nova配置文件

/etc/nova/nova.conf文件内容如下：

替换my_ip为自己的controller地址；

替换 RABBIT_PASS 为 RabbitMQ 服务库密码

替换 NOVA_PASS 为 Nova 账户密码

替换 PLACEMENT_PASS 为 Placement 用户密码

[DEFAULT]

enabled_apis = osapi_compute,metadata

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

my_ip = 10.130.0.167

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 = [REDACTED]

[vnc]

enabled = true

server_listen = $my_ip

server_proxyclient_address = $my_ip

#如果自己的办公机是远程登录controller机器，那novncproxy_base_url中最好使用ip地址，因为当没有在自己的办公机/etc/hosts中设置”10.130.0.167 controller”

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

novncproxy_base_url = http://10.130.0.167: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 = [REDACTED]

[libvirt]

virt_type = qemu

备注：

上面的配置文件中指定了libvirt的类型为qemu，即使用qemu模式启动虚拟机。

若要使用kvm的方式来启动虚拟机，则在libvirt的配置中需要指定：

[libvirt]

virt_type=kvm

use_virtio_for_bridges = true

启动服务

systemctl enable libvirtd.service openstack-nova-compute.service

systemctl start libvirtd.service openstack-nova-compute.service

验证

在controller节点验证

添加计算节点到openstack集群

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

source ~/.admin-openrc

openstack compute service list --service nova-compute

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

su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

[root@controller openstack]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

Found 2 cell mappings.

Skipping cell0 since it does not contain hosts.

Getting computes from cell 'cell1': 36a94a92-df9e-4806-86bf-b8acfcb63778

Checking host mapping for compute host 'compute': 9123fedb-1532-484e-bf3a-75c8c52d605a

Creating host mapping for compute host 'compute': 9123fedb-1532-484e-bf3a-75c8c52d605a

Found 1 unmapped computes in cell: 36a94a92-df9e-4806-86bf-b8acfcb63778

该命令用于在openstack nova环境中自动发现和注册新的计算节点到已经配置的cells中。

当新的计算节点被添加到nova部署中时，discover_hosts命令会自动发现这些新节点，并将它们关联到合适的cell中，使得nova的调度程序可以将虚拟机实例调度到这些新节点上。

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

openstack compute service list

[root@controller openstack]# openstack compute service list

+----+----------------+------------+----------+---------+-------+----------------------------+

| ID | Binary | Host | Zone | Status | State | Updated At |

+----+----------------+------------+----------+---------+-------+----------------------------+

| 3 | nova-conductor | controller | internal | enabled | up | 2024-08-08T06:24:28.000000 |

| 7 | nova-scheduler | controller | internal | enabled | up | 2024-08-08T06:24:35.000000 |

| 11 | nova-compute | compute | nova | enabled | up | 2024-08-08T06:24:33.000000 |

+----+----------------+------------+----------+---------+-------+----------------------------+

列出身份服务中的API端点，验证与身份服务的连接

[root@controller openstack]# openstack catalog list

+-----------+-----------+-----------------------------------------+

| Name | Type | Endpoints |

+-----------+-----------+-----------------------------------------+

| placement | placement | RegionOne |

| | | internal: http://controller:8778 |

| | | RegionOne |

| | | public: http://controller:8778 |

| | | RegionOne |

| | | admin: http://controller:8778 |

| | | |

| glance | image | RegionOne |

| | | internal: http://controller:9292 |

| | | RegionOne |

| | | public: http://controller:9292 |

| | | RegionOne |

| | | admin: http://controller:9292 |

| | | |

| nova | compute | RegionOne |

| | | internal: http://controller:8774/v2.1 |

| | | RegionOne |

| | | public: http://controller:8774/v2.1 |

| | | RegionOne |

| | | admin: http://controller:8774/v2.1 |

| | | |

| keystone | identity | RegionOne |

| | | public: http://controller:5000/v3/ |

| | | RegionOne |

| | | internal: http://controller:5000/v3/ |

| | | RegionOne |

| | | admin: http://controller:5000/v3/ |

| | | |

+-----------+-----------+-----------------------------------------+

列出镜像服务中的镜像，验证与镜像服务的连接

[root@controller openstack]# openstack image list

+--------------------------------------+-----------+--------+

| ID | Name | Status |

+--------------------------------------+-----------+--------+

| 717ceda8-e97e-4e12-a5e0-976d8f06c08c | archlinux | active |

| 56820e9c-4694-4274-a0d0-1c2e6e7827bb | eulerQcow | active |

+--------------------------------------+-----------+--------+

检查cells是否成功运行

nova-status upgrade check

[root@controller openstack]# nova-status upgrade check

JSON formatted policy_file support is deprecated since Victoria release. You need to use YAML format which will be default in future. You can use ``oslopolicy-convert-json-to-yaml`` tool to convert existing JSON-formatted policy file to YAML-formatted in backward compatible way: https://docs.openstack.org/oslo.policy/latest/cli/oslopolicy-convert-json-to-yaml.html.

JSON formatted policy_file support is deprecated since Victoria release. You need to use YAML format which will be default in future. You can use ``oslopolicy-convert-json-to-yaml`` tool to convert existing JSON-formatted policy file to YAML-formatted in backward compatible way: https://docs.openstack.org/oslo.policy/latest/cli/oslopolicy-convert-json-to-yaml.html.

+-------------------------------------------+

| Upgrade Check Results |

+-------------------------------------------+

| Check: Cells v2 |

| Result: Success |

| Details: None |

+-------------------------------------------+

| Check: Placement API |

| Result: Success |

| Details: None |

+-------------------------------------------+

| Check: Cinder API |

| Result: Success |

| Details: None |

+-------------------------------------------+

| Check: Policy Scope-based Defaults |

| Result: Success |

| Details: None |

+-------------------------------------------+

| Check: Policy File JSON to YAML Migration |

| Result: Success |

| Details: None |

+-------------------------------------------+

| Check: Older than N-1 computes |

| Result: Success |

| Details: None |

+-------------------------------------------+

| Check: hw_machine_type unset |

| Result: Success |

| Details: None |

+-------------------------------------------+

3.5 Neutron

Neutron是openstack的一个组件，提供了一个中央网络管理系统，用于管理网络资源。可以管理openstack中的虚拟网络、子网、路由器和防火墙等资源。

部署在控制节点和计算节点

控制节点

安装软件包

yum install -y openstack-neutron openstack-neutron-linuxbridge \

iptables-nft ipset openstack-neutron-ml2

创建neutron数据库并授权

替换NEUTRON_DBPASS为Neutron数据库设置密码

mysql -u root -p

MariaDB [(none)]> CREATE DATABASE neutron;

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

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

MariaDB [(none)]> exit

创建用户

会提示设置neutron_pass密码

source ~/.admin-openrc

openstack user create --domain default --password-prompt neutron

User Password:

[REDACTED] User Password:

添加neutron用户到service project并指定admin的role

openstack role add --project service --user neutron admin

创建neutron服务实体

openstack service create --name neutron --description "OpenStack Networking" network

创建服务API端点

openstack endpoint create --region RegionOne network public http://controller:9696

openstack endpoint create --region RegionOne network internal http://controller:9696

openstack endpoint create --region RegionOne network admin http://controller:9696

编辑neutron配置文件

/etc/neutron/neutron.conf文件内容如下：

替换 NEUTRON_PASS 为 Neutron 用户密码

替换 NOVA_PASS 为 Nova 用户密码

替换 NEUTRON_DBPASS 为 Neutron 数据库密码

替换 RABBIT_PASS 为 RabbitMQ 服务密码

[database]

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

[DEFAULT]

core_plugin = ml2

service_plugins = router

allow_overlapping_ips = true

transport_url = rabbit://openstack:RABBIT_PASS@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 = [REDACTED]

[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 = [REDACTED]

[oslo_concurrency]

lock_path = /var/lib/neutron/tmp

配置ML2

/etc/neutron/plugins/ml2/ml2_conf.ini文件内容如下：

[root@controller openstack]# cat /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

备注：ML2插件是neutron的一个可扩展框架，支持多种网络技术(如VLAN、VXLAN、GRE等)和各种网络类型(如flat、local、VLAN等)的组合，该配置文件的主要作用：

定义网络类型驱动：在[ml2]部分可以配置支持的网络类型驱动，如type_drivers = flat,vlan,vxlan,gre定义了neutron可以使用的网络类型。

定义机制驱动：mechanism_drivers定义了neutron采用的机制驱动，如openvswitch、linuxbridge等。

配置网络类型的具体参数：ml2_type_vlan/gre/vxlan可以配置每种网络类型的具体参数，如VLAN ID范围、GRE ID范围。

外部网络配置：ml2_type_flat配置flat网络的外部网络支持

配置linuxbridge_agent.ini

/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件内容如下：

替换local_ip为自己的controller ip地址

替换provider后的enp1s0为当前环境上物理网络接口的名称

[root@controller openstack]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini

[linux_bridge]

physical_interface_mappings = provider:enp1s0

[vxlan]

enable_vxlan = true

local_ip = 10.130.0.167

l2_population = true

[securitygroup]

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
备注：该文件用于配置linux bridge代理的行为。Linux Bridge代理是neutron的一个网络插件，通过linux内核的桥接功能来管理虚拟机之间的网络流量。

该配置文件的主要作用包括：

物理网络映射：配置物理网络(如VLAN)的接口，指定物理网络如何映射到具体的网络接口。通过physical_interface_mappings参数来实现

VXLAN配置：配置虚拟扩展局域网，用于虚拟网络之间的隔离和通信。VXLAN是一种用于在大型云计算环境中扩展网络的技术。如vxlan_group, local_ip。

安全组配置：配置网络安全组，控制虚拟机的网络访问权限。通常包括启用/禁用安全组功能等。如enable_security_group。

配置layer-3代理

/etc/neutron/l3_agent.ini文件内容如下：

[DEFAULT]

interface_driver = linuxbridge
L3代理配置文件，主要用于配置和管理路由器、NAT(网络地址转换)、浮动IP等L3网络服务。

路由器调度器配置：L3代理可以调度和管理多个虚拟路由器，通过route_scheculer_driver参数指定路由器的调度策略。

外部网络配置：通过external_network_bridge参数指定在连接外部网络的桥接接口。如果设置为空，表示允许所有网络作为外部网络。

配置DHCP代理

/etc/neutron/dhcp_agent.ini文件内容如下：

[DEFAULT]

interface_driver = linuxbridge

dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq

enable_isolated_metadata = true
用于配置和管理DHCP（动态主机配置协议） 代理。DHCP代理为虚拟机动态分配IP地址和其他网络配置（如DNS服务器、网关等），以便虚拟机能够在网络中正常通信。

配置metadata代理

/etc/neutron/metadata_agent.ini 文件内容如下：

[DEFAULT]

nova_metadata_host = controller

# metadata_proxy_shared_secret = METADATA_SECRET

metadata_proxy_shared_secret = [REDACTED]

METADATA_SECRET为随机数，通过以下命令生成：

openssl rand -hex 10

4b810f9c26efe706b690

metadata_agent.ini是元数据代理配置文件，主要用于配置和管理元数据代理。元数据代理的作用是为虚拟机提供有关自身的元数据，如实例ID、主机名、网络配置等信息。虚拟机可以通过HTTP请求访问这些元数据，以便自动配置和管理。

通过该文件可以设置代理与nova之间的通信、元数据服务的端口、共享密钥以及其他元数据相关的参数。元数据代理的配置对于确保虚拟机能够正确获取元数据至关重要，这些数据在自动化配置和管理虚拟机时非常有用。合理配置这个文件，可以提高元数据服务的安全行、可靠性和性能。

配置nova服务

在/etc/nova/nova.conf文件中追加以下内容：

METADATA_SECRET与12中设置的值一致，NEUTRON_PASS为neutron用户密码

[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 = [REDACTED]

service_metadata_proxy = true

metadata_proxy_shared_secret = METADATA_SECRET

创建plugin.ini符号链接

ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

同步数据库

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

systemctl restart openstack-nova-api.service

启动网络服务

systemctl enable neutron-server.service neutron-linuxbridge-agent.service \

neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-agent.service

systemctl start neutron-server.service neutron-linuxbridge-agent.service \

neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-agent.service

计算节点

安装软件包

yum install -y openstack-neutron-linuxbridge ebtables ipset

编辑neutron配置文件

/etc/neutron/neutron.conf文件内容如下：

替换 NEUTRON_PASS 为 Neutron 用户密码

替换 RABBIT_PASS 为 RabbitMQ 服务密码

[DEFAULT]

transport_url = rabbit://openstack:RABBIT_PASS@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 = [REDACTED]

[oslo_concurrency]

lock_path = /var/lib/neutron/tmp

编辑linuxbirdge_agent.ini文件

/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件内容如下：

PROVIDER_INTERFACE_NAME替换为computer环境上物理网络接口的名称

local_ip替换为computer环境上物理网络接口的名称

[linux_bridge]

physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

[vxlan]

enable_vxlan = true

local_ip = 10.130.0.114

l2_population = true

[securitygroup]

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

配置nova服务

在/etc/nova/nova.conf文件中追加如下内容：

替换NEUTRUON_PASS为Neutron用户密码

[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 = [REDACTED]

重启nova-compute服务

systemctl restart openstack-nova-compute.service

使能并启动neutron linuxbridge agent服务

systemctl enable neutron-linuxbridge-agent

systemctl start neutron-linuxbridge-agent

验证

在controller节点执行

openstack network agent list

[root@controller openstack]# openstack network agent list

+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |

+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

| 2ad6f63b-2f18-4e34-aefa-736d828ff9a2 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent |

| 311d4d45-906c-470a-8b31-f181698c0cba | Linux bridge agent | controller | None | :-) | UP | neutron-linuxbridge-agent |

| 46dc327c-fb26-485c-a78a-68b5878749e8 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent |

| a3cd35b0-0396-48b6-9034-094b76f9b760 | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent |

| f25445e7-43fb-4d43-9147-6ad04c045bda | Linux bridge agent | compute | None | :-) | UP | neutron-linuxbridge-agent |

+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

3.6 Dashboard

Horizon提供了一个易于使用的web界面，用于管理openstack中的计算、存储、网络和安全等资源。

部署在controller节点

安装软件包

yum install -y openstack-dashboard

编辑horizon配置文件

在/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,

}
该文件用于配置和管理openstack dashboard的各种参数和行为。通过该文件，管理员可以控制horizon的行为、界面、认证方式、连接到openstack服务的方式、缓存机制、日志记录等。合理配置这个文件，可以确保horizon的安全性、易用性和高性能，为用户提供一个稳定的openstack管理界面。

重启httpd服务

systemctl restart httpd
打开浏览器，输入http://10.130.0.167/dashboard 打开horizon登录界面。

参考文档

（1）openeuler官方部署文档：https://openstack-sig.readthedocs.io/zh/latest/install/openEuler-24.03-LTS/OpenStack-wallaby/

（2）官方部署文档：https://docs.openstack.org/project-deploy-guide/tripleo-docs/wallaby/

（3）https://docs.opencloudos.org/OCS/Virtualization_and_Containers_Guide/OpenStack_UserGuide/