基于OpenStack官方的Ubuntu 22.04.3 LTS部署OpenStack-Bobcat教程(Neutron使用OVN)

基于OpenStack官方的Ubuntu 22.04.3 LTS部署OpenStack-Bobcat教程(Neutron使用OVN)

  • 注意事项
  • 机器详情
  • 基础配置
    • Controller节点
      • 设置主机名
      • 设置静态IP
      • 配置hosts
    • Compute节点
      • 设置主机名
      • 设置静态IP
      • 配置hosts
    • 验证配置
      • Controller节点 && Compute节点
  • 配置NTP
    • Controller节点 && Compute节点
      • 设置时区
      • 安装软件
      • 修改配置文件
      • 重启服务
      • 验证配置
  • 安装OpenStack packages
    • Controller节点 && Compute节点
  • 安装SQL database
    • Controller节点
      • 安装软件
      • 修改配置文件
      • 重启服务
      • 初始化数据库
  • 安装Message queue
    • Controller节点
      • 安装软件
      • 添加用户
      • 设置权限
  • 安装Memcached
    • Controller节点
      • 安装软件
      • 修改配置文件
      • 重启服务
  • 安装Etcd
    • Controller节点
      • 安装软件
      • 修改配置文件
      • 重启服务
  • 安装Keystone
    • Controller节点
      • 创建数据库
      • 安装组件
      • 配置组件
      • 填充数据库
      • 初始化密钥
      • 引导服务
      • 配置Apache
      • 重启Apache服务
      • 创建脚本文件
      • 创建domain
      • 创建project
      • 创建user
      • 创建role
      • 将role添加到project和user
      • 验证配置
  • 安装Glance
    • Controller节点
      • 创建数据库
      • 创建glance用户
      • 将glacne添加到admin中去
      • 创建glance服务实体
      • 创建Image服务API端点
      • 安装组件
      • 配置组件
      • 添加权限
      • 填充数据库
      • 重启Image服务
      • 验证配置
  • 安装Placement
    • Controller节点
      • 创建数据库
      • 创建placement用户
      • 将用户添加到admin
      • 创建placement服务实体
      • 创建API 服务端点
      • 安装组件
      • 配置组件
      • 填充数据库
      • 重启apache2服务
      • 验证配置
  • 安装Nova
    • Controller节点
      • 创建数据库
      • 创建nova用户
      • 添加到admin
      • 创建nova服务实体
      • 创建API服务端点
      • 安装组件
      • 配置组件
      • 填充数据库
      • 验证
      • 重启服务
    • Compute节点
      • 安装组件
      • 配置组件
      • 修改虚拟类型
      • 重启服务
    • 添加计算节点(Controller)
    • 验证配置(Controller)
  • 安装Neutron(使用的是OVN)
    • Controller节点
      • 创建数据库
      • 创建neutron用户
      • 添加到admin
      • 创建neutron服务实体
      • 创建API端点
      • 安装组件
      • 配置组件
      • 填充数据库
      • 重启服务
    • Compute节点
      • 安装组件
      • 配置组件
      • 重启服务
    • 配置验证(Controller)
    • 创建OVN网络
      • Controller节点 && Compute节点
      • Controller节点
  • 安装Dashboard
    • Controller节点
      • 安装组件
      • 配置组件
      • 如果不能正常访问
      • 重启服务
  • 基础的配置(也可以去dashboard上创建)
    • 创建实例的计算、内存和存储容量的大小
    • 密钥设置
    • 设置安全组

注意事项

本文所有涉及密码的部分我都设置为123456

机器详情

主机名网卡CPU内存
controller网卡1:ens33 192.168.46.172/24
网卡2:ens34 不分配IP地址
2C8G
compute1网卡1:ens33 192.168.46.173/24
网卡2:ens34 不分配IP地址
2C8G

基础配置

Controller节点

设置主机名

hostnamectl set-hostname controller

设置静态IP

vim /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:ethernets:ens33:dhcp4: nodhcp6: noaddresses:- 192.168.46.172/24routes:- to: defaultvia: 192.168.46.2nameservers:addresses:- 114.114.114.114- 8.8.8.8ens34:dhcp4: nodhcp6: noaddresses: []version: 2
netplan apply

配置hosts

vim /etc/hosts
192.168.46.172  controller
192.168.46.173  compute1

Compute节点

设置主机名

hostnamectl set-hostname compute1

设置静态IP

vim /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:ethernets:ens33:dhcp4: nodhcp6: noaddresses:- 192.168.46.173/24routes:- to: defaultvia: 192.168.46.2nameservers:addresses:- 114.114.114.114- 8.8.8.8ens34:dhcp4: nodhcp6: noaddresses: []version: 2
netplan apply

配置hosts

vim /etc/hosts
192.168.46.172  controller
192.168.46.173  compute1

验证配置

Controller节点 && Compute节点

ping -c 4 www.baidu.com
# Compute节点
ping -c 4 controller
# Controller节点
ping -c 4 compute1

配置NTP

Controller节点 && Compute节点

设置时区

timedatectl set-timezone Asia/Shanghai

安装软件

apt install chrony -y

修改配置文件

vim /etc/chrony/chrony.conf
# 把开头是pool的所有行注释掉
# 添加如下的阿里时间服务器
server ntp.aliyun.com iburst

重启服务

systemctl restart chrony && systemctl enable chrony

验证配置

chronyc sources
# 出现如下所示表示配置成功
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17    13  -2690us[-3632us] +/-   34ms

安装OpenStack packages

Controller节点 && Compute节点

add-apt-repository cloud-archive:bobcat
apt update
# Controller节点
apt install python3-openstackclient -y

安装SQL database

Controller节点

安装软件

apt install mariadb-server python3-pymysql -y

修改配置文件

vim /etc/mysql/mariadb.conf.d/99-openstack.cnf
[mysqld]
bind-address = 192.168.46.172 # Controller节点的IP地址default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

重启服务

systemctl restart mysql && systemctl enable mysql

初始化数据库

mysql_secure_installation

安装Message queue

Controller节点

安装软件

apt install rabbitmq-server -y

添加用户

rabbitmqctl add_user openstack RABBIT_PASS

RABBIT_PASS为设置的密码

设置权限

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

安装Memcached

Controller节点

安装软件

apt install memcached python3-memcache -y

修改配置文件

vim /etc/memcached.conf
-l 127.0.0.1
# 改为
-l Controller节点的IP地址

重启服务

systemctl restart memcached

安装Etcd

Controller节点

安装软件

apt install etcd -y

修改配置文件

vim /etc/default/etcd
# 如下IP地址均为Controller节点的IP地址
ETCD_NAME="controller"
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER="controller=http://192.168.46.172:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.46.172:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.46.172:2379"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.46.172:2379"

重启服务

systemctl restart etcd && systemctl enable etcd

安装Keystone

Controller节点

创建数据库

mysql
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'KEYSTONE_DBPASS';

KEYSTONE_DBPASS为要设置的密码

exit

安装组件

apt install keystone -y

配置组件

vim /etc/keystone/keystone.conf
[database]
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

KEYSTONE_DBPASS为创建keystone用户设置的数据库访问密码

[token]
provider = fernet

填充数据库

su -s /bin/sh -c "keystone-manage db_sync" keystone
# 出现如下的错误忽略即可,无影响
Exception ignored in: <function _removeHandlerRef at 0x7f285a6a83a0>
Traceback (most recent call last):File "/usr/lib/python3.10/logging/__init__.py", line 846, in _removeHandlerRefFile "/usr/lib/python3.10/logging/__init__.py", line 226, in _acquireLockFile "/usr/lib/python3.10/threading.py", line 164, in acquireFile "/usr/lib/python3/dist-packages/eventlet/green/thread.py", line 34, in get_ident
AttributeError: 'NoneType' object has no attribute 'getcurrent'

初始化密钥

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

引导服务

keystone-manage bootstrap --bootstrap-password ADMIN_PASS \--bootstrap-admin-url http://controller:5000/v3/ \--bootstrap-internal-url http://controller:5000/v3/ \--bootstrap-public-url http://controller:5000/v3/ \--bootstrap-region-id RegionOne

ADMIN_PASS为准备设置管理员用户的密码

配置Apache

vim /etc/apache2/apache2.conf
# 不存在则添加
ServerName controller

重启Apache服务

systemctl restart apache2

创建脚本文件

vim admin-openrc.sh
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

ADMIN_PASS为之前设置的管理员用户的密码

chmod +x admin-openrc.sh
source admin-openrc.sh

创建domain

openstack domain create --description "An Example Domain" example

创建project

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

创建user

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

创建role

openstack role create myrole

将role添加到project和user

openstack role add --project myproject --user myuser myrole

验证配置

source admin-openrc.sh
openstack --os-auth-url http://controller:5000/v3 \--os-project-domain-name Default --os-user-domain-name Default \--os-project-name admin --os-username admin token issue
# 正常应该输出类似如下的内容
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
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2024-03-31T08:23:06+0000                                                                                                                                                                |
| id         | gAAAAABmCQ9aC7KVhtUt0bIyFuTU-lMkFo0hoZ0Aijv319VmVLKuO-zqx_K2Gp_E7ctscBU8Vx4ESY3eI4WLXYMeyHhcZW6V9Ki2XehhCMSgx8cRBtZNOKu6at9P_W1SF75Z6qYjcZhHMMhA7FqM5Audwu4HLM1IWpkbX0vFeqaGhEqVJnKfjaY |
| project_id | 1c9ca3eb987f477c9abdbcff2f605a60                                                                                                                                                        |
| user_id    | 33d24fdc018a46aa830bfd43fd7e9a6f                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

安装Glance

Controller节点

创建数据库

mysql
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \IDENTIFIED BY 'GLANCE_DBPASS';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \IDENTIFIED BY 'GLANCE_DBPASS';

GLANCE_DBPASS为要设置的密码

exit

创建glance用户

source admin-openrc.sh
openstack user create --domain default --password-prompt glance

将glacne添加到admin中去

openstack role add --project service --user glance admin
# 如果遇到如下的情况
No project with a name or ID of 'service' exists.# 先创建名字为service的project
openstack project create --domain default service# 在运行一下添加命令

创建glance服务实体

openstack service create --name glance \--description "OpenStack Image" image

创建Image服务API端点

openstack endpoint create --region RegionOne \image public http://controller:9292
openstack endpoint create --region RegionOne \image internal http://controller:9292
openstack endpoint create --region RegionOne \image admin http://controller:9292

安装组件

apt install glance -y

配置组件

vim /etc/glance/glance-api.conf
[database]
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

GLANCE_DBPASS为创建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 = GLANCE_PASS

GLANCE_PASS为openstack创建glance用户设置的密码

[paste_deploy]
flavor = keystone
[DEFAULT]
enabled_backends=fs:file
[glance_store]
default_backend = fs
[fs]
filesystem_store_datadir = /var/lib/glance/images/
[oslo_limit]
auth_url = http://controller:5000
auth_type = password
user_domain_id = default
username = glance
system_scope = all
password = GLANCE_PASS
endpoint_id = 3622d855ba414f15a4becbef8479d5bf
region_name = RegionOne

GLANCE_PASS为openstack创建glance用户设置的密码
endpoint_id为创建Image服务API端点中类型为public的id
可以通过如下的命令查看
openstack endpoint list

添加权限

openstack role add --user glance --user-domain Default --system all reader

填充数据库

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

重启Image服务

systemctl restart glance-api

验证配置

source admin-openrc.sh
wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
glance image-create --name "cirros" \--file /root/cirros-0.4.0-x86_64-disk.img \--disk-format qcow2 --container-format bare \--visibility=public
glance image-list
# 输出如下的内容表示组件成功运行
root@controller:~# glance image-list
+--------------------------------------+--------+
| ID                                   | Name   |
+--------------------------------------+--------+
| 8244fbc0-f798-44c5-b0f3-9e5566e7e345 | cirros |
+--------------------------------------+--------+

安装Placement

Controller节点

创建数据库

mysql
CREATE DATABASE placement;
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' \IDENTIFIED BY 'PLACEMENT_DBPASS';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' \IDENTIFIED BY 'PLACEMENT_DBPASS';

PLACEMENT_DBPASS为要设置的密码

exit

创建placement用户

source admin-openrc.sh
openstack user create --domain default --password-prompt placement

将用户添加到admin

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

安装组件

apt install placement-api -y

配置组件

vim /etc/placement/placement.conf
[placement_database]
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@controller/placement

PLACEMENT_DBPASS为创建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 = PLACEMENT_PASS

PLACEMENT_PASS为openstack创建placement用户设置的密码

填充数据库

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

重启apache2服务

systemctl restart apache2

验证配置

source admin-openrc.sh
placement-status upgrade check
# 输出如下的内容表示成功
root@controller:~# 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: Success                           |
| Details: None                             |
+-------------------------------------------+
openstack --os-placement-api-version 1.2 resource class list --sort-column name
# 输出如下的内容表示成功
root@controller:~# openstack --os-placement-api-version 1.2 resource class list --sort-column name
+----------------------------------------+
| name                                   |
+----------------------------------------+
| DISK_GB                                |
| FPGA                                   |
| IPV4_ADDRESS                           |
| MEMORY_MB                              |
| MEM_ENCRYPTION_CONTEXT                 |
| NET_BW_EGR_KILOBIT_PER_SEC             |
| NET_BW_IGR_KILOBIT_PER_SEC             |
| NET_PACKET_RATE_EGR_KILOPACKET_PER_SEC |
| NET_PACKET_RATE_IGR_KILOPACKET_PER_SEC |
| NET_PACKET_RATE_KILOPACKET_PER_SEC     |
| NUMA_CORE                              |
| NUMA_MEMORY_MB                         |
| NUMA_SOCKET                            |
| NUMA_THREAD                            |
| PCI_DEVICE                             |
| PCPU                                   |
| PGPU                                   |
| SRIOV_NET_VF                           |
| VCPU                                   |
| VGPU                                   |
| VGPU_DISPLAY_HEAD                      |
+----------------------------------------+
openstack --os-placement-api-version 1.6 trait list --sort-column name

安装Nova

Controller节点

创建数据库

mysql
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \IDENTIFIED BY 'NOVA_DBPASS';

NOVA_DBPASS为要设置的密码

exit

创建nova用户

source admin-openrc.sh
openstack user create --domain default --password-prompt nova

添加到admin

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

创建nova服务实体

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

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

安装组件

apt install nova-api nova-conductor nova-novncproxy nova-scheduler -y

配置组件

vim /etc/nova/nova.conf
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api

NOVA_DBPASS为创建nova用户设置访问数据库的密码

[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova

NOVA_DBPASS为创建nova用户设置访问数据库的密码

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/
my_ip = 192.168.46.172

RABBIT_PASS为rabbitmqctl创建openstack设置的密码
my_ip为Controller节点的IP地址

[api]
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 = nova
password = NOVA_PASS

NOVA_PASS为openstack创建nova用户设置的密码

[service_user]
send_service_user_token = true
auth_url = http://controller:5000/v3
auth_strategy = keystone
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = NOVA_PASS

NOVA_PASS为openstack创建nova用户设置的密码

[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 = PLACEMENT_PASS

PLACEMENT_PASS为openstack创建placement用户设置的密码

填充数据库

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

验证

su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
# 输出类似如下的内容
root@controller:~# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
|  Name |                 UUID                 |              Transport URL               |               Database Connection               | Disabled |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 |                  none:/                  | mysql+pymysql://nova:****@controller/nova_cell0 |  False   |
| cell1 | e52327df-10e2-41e1-a1d2-5d7724a85688 | rabbit://openstack:****@controller:5672/ |    mysql+pymysql://nova:****@controller/nova    |  False   |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+

重启服务

systemctl restart nova-api nova-scheduler nova-conductor nova-novncproxy

Compute节点

安装组件

apt install nova-compute -y

配置组件

vim /etc/nova/nova.conf
[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
my_ip = 192.168.46.173

RABBIT_PASS为rabbit创建openstack用户设置的密码
my_ip为Compute节点的IP地址

[api]
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 = nova
password = NOVA_PASS

NOVA_PASS为openstack创建nova用户设置的密码

[service_user]
send_service_user_token = true
auth_url = http://controller:5000/v3
auth_strategy = keystone
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = NOVA_PASS

NOVA_PASS为openstack创建nova用户设置的密码

[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html

controller替换成Controller的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 = PLACEMENT_PASS

PLACEMENT_PASS为openstack创建placement用户设置的密码

修改虚拟类型

egrep -c '(vmx|svm)' /proc/cpuinfo

如果返回为0则需要修改

vim /etc/nova/nova-compute.conf
[libvirt]
virt_type = qemu

重启服务

systemctl restart nova-compute

添加计算节点(Controller)

source admin-openrc.sh
openstack compute service list --service nova-compute
# 输出如下的内容
root@controller:~# openstack compute service list --service nova-compute
+--------------------------------------+--------------+----------+------+---------+-------+----------------------------+
| ID                                   | Binary       | Host     | Zone | Status  | State | Updated At                 |
+--------------------------------------+--------------+----------+------+---------+-------+----------------------------+
| c9dd606c-0f31-4a9e-9c6f-bb40e33cf054 | nova-compute | compute1 | nova | enabled | up    | 2024-03-31T08:01:53.000000 |
+--------------------------------------+--------------+----------+------+---------+-------+----------------------------+
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
# 输出如下的内容
root@controller:~# 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': e52327df-10e2-41e1-a1d2-5d7724a85688
Checking host mapping for compute host 'compute1': 844b86c1-7310-4ddf-82cd-0b8f3350ef0d
Creating host mapping for compute host 'compute1': 844b86c1-7310-4ddf-82cd-0b8f3350ef0d
Found 1 unmapped computes in cell: e52327df-10e2-41e1-a1d2-5d7724a85688

验证配置(Controller)

openstack compute service list
# 输出如下的内容
root@controller:~# openstack compute service list
+--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+
| ID                                   | Binary         | Host       | Zone     | Status  | State | Updated At                 |
+--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+
| 2779af9c-cde5-41a6-87b2-5b6840d9b88b | nova-conductor | controller | internal | enabled | up    | 2024-03-31T08:03:07.000000 |
| b24be4f1-ea05-4ee3-a7eb-8402ff53f172 | nova-scheduler | controller | internal | enabled | up    | 2024-03-31T08:03:15.000000 |
| c9dd606c-0f31-4a9e-9c6f-bb40e33cf054 | nova-compute   | compute1   | nova     | enabled | up    | 2024-03-31T08:03:13.000000 |
+--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+
openstack catalog list
openstack image list
nova-status upgrade check

安装Neutron(使用的是OVN)

Controller节点

创建数据库

mysql
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \IDENTIFIED BY 'NEUTRON_DBPASS';

NEUTRON_DBPASS为要设置的密码

exit

创建neutron用户

source admin-openrc.sh
openstack user create --domain default --password-prompt neutron

添加到admin

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

安装组件

apt -y install neutron-server neutron-plugin-ml2 python3-neutronclient ovn-central openvswitch-switch

配置组件

vim /etc/neutron/neutron.conf
[DEFAULT]
bind_host = controller
bind_port = 9696
core_plugin = ml2
service_plugins = ovn-router
auth_strategy = keystone
state_path = /var/lib/neutron
allow_overlapping_ips = True
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
transport_url = rabbit://openstack:RABBIT_PASS@controller

RABBIT_PASS为rabbit创建openstack用户创建的密码

[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 = NEUTRON_PASS

NEUTRON_PASS为openstack创建neutron用户设置的密码

[database]
connection = mysql+pymysql://neutron:NEUTRON_PASS@controller/neutron

NEUTRON_PASS为创建neutron用户访问数据库设置的密码

[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 = NOVA_PASS

NOVA_PASS为openstack创建nova用户设置的密码

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
vim /etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
debug = false
[ml2]
type_drivers = flat,geneve
tenant_network_types = geneve
mechanism_drivers = ovn
extension_drivers = port_security
overlay_ip_version = 4
[ml2_type_geneve]
vni_ranges = 1:65536
max_header_size = 38
[ml2_type_flat]
flat_networks = *
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[ovn]
ovn_nb_connection = tcp:ControllerIP:6641
ovn_sb_connection = tcp:ControllerIP:6642
ovn_l3_scheduler = leastloaded
ovn_metadata_enabled = True

ControllerIP为Controller节点的IP地址

vim /etc/default/openvswitch-switch
OVS_CTL_OPTS="--ovsdb-server-options='--remote=ptcp:6640:127.0.0.1'"
vim /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 = NEUTRON_PASS
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_PASS
insecure = false

NEUTRON_PASS为openstack创建neutron用户设置的密码
METADATA_PASS为创建的密码

填充数据库

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

重启服务

systemctl restart nova-api
systemctl restart openvswitch-switch
ovs-vsctl add-br br-int 
systemctl restart ovn-central ovn-northd
ovn-nbctl set-connection ptcp:6641:ControllerIP -- set connection . inactivity_probe=60000
ovn-sbctl set-connection ptcp:6642:ControllerIP -- set connection . inactivity_probe=60000

ControllerIP为Controller节点的IP地址

systemctl restart neutron-server

Compute节点

安装组件

apt -y install neutron-common neutron-plugin-ml2 neutron-ovn-metadata-agent ovn-host openvswitch-switch

配置组件

vim /etc/neutron/neutron.conf
[DEFAULT]
core_plugin = ml2
service_plugins = ovn-router
auth_strategy = keystone
state_path = /var/lib/neutron
allow_overlapping_ips = True
transport_url = rabbit://openstack:RABBIT_PASS@controller

RABBIT_PASS为rabbit创建openstack设置的密码

[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 = NEUTRON_PASS

NEUTRON_PASS为openstack创建neutron用户设置的密码

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
vim /etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
debug = false
[ml2]
type_drivers = flat,geneve
tenant_network_types = geneve
mechanism_drivers = ovn
extension_drivers = port_security
overlay_ip_version = 4
[ml2_type_geneve]
vni_ranges = 1:65536
max_header_size = 38
[ml2_type_flat]
flat_networks = *
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[ovn]
ovn_nb_connection = tcp:ControllerIP:6641
ovn_sb_connection = tcp:ControllerIP:6642
ovn_l3_scheduler = leastloaded
ovn_metadata_enabled = True

ControllerIP为Controller节点的IP地址

vim /etc/neutron/neutron_ovn_metadata_agent.ini
[DEFAULT]
nova_metadata_host = controller
nova_metadata_protocol = http
metadata_proxy_shared_secret = METADATA_PASS

METADATA_PASS为设置的密码要与Controller的配置一样

[ovs]
ovsdb_connection = tcp:127.0.0.1:6640
[agent]
root_helper = sudo neutron-rootwrap /etc/neutron/rootwrap.conf
[ovn]
ovn_sb_connection = tcp:ControllerIP:6642

ControllerIP为Controller节点的IP地址

vim /etc/default/openvswitch-switch
OVS_CTL_OPTS="--ovsdb-server-options='--remote=ptcp:6640:127.0.0.1'"
vim /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 = NEUTRON_PASS
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_PASS
insecure = false

NEUTRON_PASS为openstack创建neutron用户设置的密码
METADATA_PASS为创建的密码

重启服务

systemctl restart openvswitch-switch ovn-controller ovn-host
systemctl restart neutron-ovn-metadata-agent
systemctl restart nova-compute
ovs-vsctl set open . external-ids:ovn-remote=tcp:ControllerIP:6642

ControllerIP为Controller节点的IP地址

ovs-vsctl set open . external-ids:ovn-encap-type=geneve
ovs-vsctl set open . external-ids:ovn-encap-ip=ComputeIP

ComputeIP为Compute节点的IP地址

配置验证(Controller)

source admin-openrc.sh 
openstack network agent list
# 输入如下的内容表示成功
root@controller:~# openstack network agent list
+--------------------------------------+----------------------+----------+-------------------+-------+-------+----------------------------+
| ID                                   | Agent Type           | Host     | Availability Zone | Alive | State | Binary                     |
+--------------------------------------+----------------------+----------+-------------------+-------+-------+----------------------------+
| e42ab135-4870-4bfd-8b90-47ad92732627 | OVN Controller agent | compute1 |                   | :-)   | UP    | ovn-controller             |
| 952c013f-c53d-54b8-89b4-d55930a40171 | OVN Metadata agent   | compute1 |                   | :-)   | UP    | neutron-ovn-metadata-agent |
+--------------------------------------+----------------------+----------+-------------------+-------+-------+----------------------------+

创建OVN网络

Controller节点 && Compute节点

# br-ens34你可以随便取名字
ovs-vsctl add-br br-ens34
# ens34为第二张网卡的名称
ovs-vsctl add-port br-ens34 ens34
# provider你可以随便取名字
ovs-vsctl set open . external-ids:ovn-bridge-mappings=provider:br-ens34

Controller节点

# 创建一个路由
openstack router create router# 创建selfservice
openstack network create selfservice --provider-network-type geneve# 创建selfservice子网
openstack subnet create --network selfservice \--dns-nameserver 8.8.8.8 --gateway 172.16.1.1 \--subnet-range 172.16.1.0/24 selfservice# 创建外部网络
openstack network create  --share --external \--provider-physical-network provider \--provider-network-type flat provider# 创建外部网络子网
openstack subnet create --network provider \--allocation-pool start=192.168.46.240,end=192.168.46.250 \--dns-nameserver 8.8.8.8 --gateway 192.168.46.2 \--subnet-range 192.168.46.0/24 provider# 给路由设置网关
openstack router set router --external-gateway provider# 给路由添加内部接口
openstack router add subnet router selfservice# 验证是否成功
openstack port list --router router# 输入如下的内容表示成功
root@controller:~# openstack port list --router router
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
| ID                                   | Name | MAC Address       | Fixed IP Addresses                                                            | Status |
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
| 56a061e8-f5b1-4df8-8dcb-347bb53ecead |      | fa:16:3e:28:2c:c3 | ip_address='172.16.1.1', subnet_id='df79d0ea-9548-486c-8c79-b9dfe9da35ff'     | ACTIVE |
| 6a5c3ba2-df0f-4552-91f1-8eafcdd65da0 |      | fa:16:3e:02:f7:16 | ip_address='192.168.46.249', subnet_id='d608e2b9-d2e2-423c-bfec-2a23a1516760' | ACTIVE |
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
# 也可以通过如下的命令查看
ovn-nbctl show# 输出如下的内容
root@controller:~# ovn-nbctl show
switch dc4e3afc-da27-4e73-b741-a1c8d57434f7 (neutron-43fe943c-fe1a-4dfe-9f3a-91dc7cdf823f) (aka provider)port 6a5c3ba2-df0f-4552-91f1-8eafcdd65da0type: routerrouter-port: lrp-6a5c3ba2-df0f-4552-91f1-8eafcdd65da0port dcd112c2-dd97-4f40-b7ba-f8d64bd68a5daddresses: ["fa:16:3e:16:bc:3a 192.168.46.246"]port provnet-3140ef3f-1dc0-4490-bfdb-134d1c611aectype: localnetaddresses: ["unknown"]port 201604e9-1146-4536-a56d-965e82e26d8etype: localportaddresses: ["fa:16:3e:5e:20:5b 192.168.46.240"]
switch e7a2f47f-0ea4-4587-bd18-d444a8f1b500 (neutron-31f3eb52-667f-4b5a-8ef3-3f1d048b29b3) (aka selfservice)port d47fb30d-6d47-4d57-bd4d-96f779f6e765type: localportaddresses: ["fa:16:3e:47:46:d8 172.16.1.2"]port d2183412-590a-4bc0-b992-7efaf8a8c9f1addresses: ["fa:16:3e:a0:e5:23 172.16.1.37"]port 56a061e8-f5b1-4df8-8dcb-347bb53eceadtype: routerrouter-port: lrp-56a061e8-f5b1-4df8-8dcb-347bb53ecead
router 715fc656-e8f8-4328-aa2d-82b994bcfe2d (neutron-43435b65-0e5e-4bc0-90fa-5a01c1aa89c2) (aka router)port lrp-56a061e8-f5b1-4df8-8dcb-347bb53eceadmac: "fa:16:3e:28:2c:c3"networks: ["172.16.1.1/24"]port lrp-6a5c3ba2-df0f-4552-91f1-8eafcdd65da0mac: "fa:16:3e:02:f7:16"networks: ["192.168.46.249/24"]gateway chassis: [e42ab135-4870-4bfd-8b90-47ad92732627]nat d4d704be-2102-437b-bc4a-0be5504824aaexternal ip: "192.168.46.249"logical ip: "172.16.1.0/24"type: "snat"
root@controller:~# 

安装Dashboard

Controller节点

安装组件

apt install openstack-dashboard -y

配置组件

vim /etc/openstack-dashboard/local_settings.py
OPENSTACK_HOST = "controller"
ALLOWED_HOSTS = ['*']
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': 'controller:11211',}
}
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = {"identity": 3,"image": 2,"volume": 3,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
vim /etc/apache2/conf-available/openstack-dashboard.conf
# 不存在则添加
WSGIApplicationGroup %{GLOBAL}

如果不能正常访问

python3 /usr/share/openstack-dashboard/manage.py compress

重启服务

systemctl reload apache2.service

基础的配置(也可以去dashboard上创建)

创建实例的计算、内存和存储容量的大小

openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano

密钥设置

ssh-keygen -q -N ""
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

设置安全组

openstack security group rule create --proto icmp default
openstack security group rule create --proto tcp --dst-port 22 default

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web蓝桥杯真题:输入搜索联想

代码及注释&#xff1a; <!-- TODO&#xff1a;请在下面实现需求 --> <span>搜索名字: </span> <input placeholder"输入要搜索的名字" v-model"searchQuery"/> //绑定值 <table><thead><tr> //分割…

结构体,联合体,枚举( 2 )

目录 2.联合体 2.1联合体类型的声明 2.2联合体的特点 2.3联合体的内存大小 3.枚举 3.1枚举类型的声明 3.2枚举类型的优点 3.3枚举类型的使用 2.联合体 联合体&#xff08;Union&#xff09;是另一种复合数据类型&#xff0c;它允许我们在同一内存位置存储不同的数据类型…

UE4_动画基础_ 瞄准偏移1D(Aim Offset Blend Space 1D)

瞄准偏移1D基本上可以完成角色的向左看向右看或者向上看向下看&#xff0c;像混合空间1D一样只有一个轴向可用。 操作步骤&#xff1a; 1、新建第三人称模板项目。 2、右键——动画——瞄准偏移1D 选取骨骼 双击打开 3、瞄准偏移混合的是姿势&#xff0c;我们需要创建姿势。 …

结合创新!多尺度特征融合+Transformer,参数和计算成本减半

通过多尺度特征融合&#xff0c;模型能够捕捉到不同层次的视觉细节&#xff0c;而Transformer的自注意力机制能够在这些不同层次的特征之间建立联系&#xff0c;有效地整合全局上下文信息&#xff0c;让模型能够应对多样化的视觉场景和变化。 这种结合策略充分利用了二者各自的…

Android 手机部署whisper 模型

Whisper 是什么? “Whisper” 是一个由OpenAI开发的开源深度学习模型,专门用于语音识别任务。这个模型能够将语音转换成文本,支持多种语言,并且在处理不同的口音、环境噪音以及跨语言的语音识别方面表现出色。Whisper模型的目标是提供一个高效、准确的工具,以支持自动字幕…

npm(Node Package Manager)

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的默认包管理器&#xff0c;它用于安装、更新、配置和移除 Node.js 应用程序中的包。以下是一些常用的 npm 命令&#xff1a; 1. 安装包 npm install <package> - 安装一个包到当前项目&#xff08;默认为 …

2024.4.3 controller+soem双进程调试

需要数据&#xff1a; 各关节减速器减速比&#xff08;符号与关节方向电机方向相关&#xff09;编码器位数17位131072、20位1048576&#xff0c;23位8388608&#xff08;与关节转角换算到电机端脉冲值有关&#xff09;DH参数&#xff08;主要是连杆长度&#xff0c;建立名义运…

库位电子标签可视化管理,让仓库更智能

一、工厂仓储的目前管理现状 目前工厂仓储管理存在诸多问题&#xff0c;如物料数量种类多&#xff0c;寻找困难且耗时&#xff1b;盘点人力成本高且速度慢&#xff1b;存储位置不清晰&#xff0c;常找不到物料&#xff0c;且多发、少发、错料现象时有发生&#xff1b;系统与库…

SSTI模板注入(jinja2)

前面学习了SSTI中的smarty类型&#xff0c;今天学习了Jinja2&#xff0c;两种类型都是flask框架的&#xff0c;但是在注入的语法上还是有不同 SSTI&#xff1a;服务器端模板注入&#xff0c;也属于一种注入类型。与sql注入类似&#xff0c;也是通过凭借进行命令的执行&#xff…

Qt-在QLabel上显示Mat数据

0. 写在前面 用于记录一下&#xff0c;在Qt上显示Mat的数据&#xff0c;记录代码如下&#xff1b; //QLabel中显示处理结果 void MainWindow::matToLabelShow(QLabel *label, Mat &mat) {cv::Mat Rgb;QImage Img;if (mat.channels() 3)//RGB Img{cv::cvtColor(mat, Rgb,C…

C++ 中的 vector 的模拟实现【代码纯享】

文章目录 C 中的 vector 模拟实现1. vector 的基本概念2. vector 的基本操作3. vector 的模拟实现4.代码纯享5. 总结 C 中的 vector 模拟实现 在 C 中&#xff0c;vector 是一个非常重要的容器&#xff0c;它提供了动态数组的功能。在本篇博客中&#xff0c;我们将尝试模拟实现…

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法&#xff1a;直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义&#xff1a;可以少传一个/多个参数给函数&…

防止推特Twitter账号被冻结,应该选什么代理类型IP?

在处理多个 Twitter 帐号时&#xff0c;选择合适的代理IP对于避免大规模帐户暂停至关重要。现在&#xff0c;问题出现了&#xff1a;哪种类型的代理是满足您需求的最佳选择&#xff1f;下面文章将为你具体讲解推特账号冻结原因以及重点介绍如何选择代理IP。 一、推特账号被冻结…

3个 JavaScript 字符串截取方法

在 JavaScript 中&#xff0c;可以使用 substr()、slice() 和 substring() 方法截取字符串. substring() substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集&#xff0c;或从开始索引直到字符串的末尾的一个子集。语法如下&#xff1a; str.substring(inde…

通信术语:初学者入门指南(二)

1.SAR&#xff1a;Synthetic Aperture Radar合成孔径雷达&#xff0c;是一种雷达系统&#xff0c;通常用于地球或行星的遥感成像。相较于传统的实孔径雷达&#xff0c;SAR 通过在相对较长的时间内&#xff0c;对来自同一地点的多个雷达反射信号进行综合处理&#xff0c;实现了更…

.Net 对象与对象之间的映射转换的6中方式以及性能对比

我们在.Net开发的过程中&#xff0c;经常会遇到一个实体对象与另一个实体对象之间的映射转换&#xff0c;接下来我们将依次去实现6个对象间映射转换的方式&#xff0c;并对他们进行性能测试&#xff0c;找出其中效率最高的方式。 通过对象Copy&#xff0c;通过new一个新的实体对…

el-table的复选框勾选整行变色

要实现el-table的复选框勾选整行变色&#xff0c;你可以使用element-ui提供的row-class-name属性结合scoped slot来完成。 首先&#xff0c;你需要为el-table组件添加 row-class-name 属性&#xff0c;并给它绑定一个方法。在这个方法中&#xff0c;你可以根据你的业务逻辑来判…

【C+ +】第一个C+ + 项目的创建及namespace命名空间解释C++中的输入输出

目录 1.创建第一个c项目 1.1项目创建 1.2 .cpp源文件建立 1.3 第一个c程序hello world对比c语言hello world 2.命名空间 2.1 C关键字 2.2 命名空间---解决c语言中的命名冲突 2.2.1 namespace命名空间用法 2.2.2 &#xff1a;&#xff1a; 预作用限定符 2.2.3 命名空间的嵌套…

【嵌入式智能产品开发实战】(七)—— 政安晨:通过ARM-Linux掌握基本技能【环境准备:树莓派】

目录 Raspberry Pi OS 下载系统镜像 使用SSH客户端登陆 升级更新 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正…

人工智能|深度学习——基于Xception实现戴口罩人脸表情识别

一、项目背景 近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;人脸表情识别已经成为了计算机视觉领域中的重要研究方向之一。然而&#xff0c;在当前的疫情形势下&#xff0c;佩戴口罩已经成为了一项必要的防疫措施&#xff0c;但是佩戴口罩会遮挡住人脸的部分区域&…