在开始之前 …

什么是云计算 ?

 - 云计算是一种能够跨网络、按需提供基础架构、服务、平台和应用的交付方式。
 - 云是一种可以汇聚和共享整个网络中的可扩展资源的IT环境,属于一种方式和方法。
 - 云计算类型:公共云、私有云、混合云、多云。
 - 云计算提供一种计算的能力,在云环境中运行工作负载。

什么是云服务 ?

 - 云服务是指提供商托管的基础架构、平台或软件,以互联网的方式提供给最终用户使用;用户可以借助计算机、操作系统、互联网或者vpn即可访问云服务。
 - 云服务器类型:IaaS(基础架构服务)、PaaS(平台即服务)、SaaS(软件即服务)、FaaS(功能即服务)
	“IaaS:为用户提供计算、网络和存储等资源;
	 PaaS:提供一个可运行应用的平台,以及运行所需的所有IT基础架构;
	 SaaS:提供必备的云应用,应用运行平台;
	 FaaS:是一种时间驱动的执行模型,允许开发人员以功能的形式构建、运行和管理应用,无需维护基础架构。
	”

什么是云基础架构 ?

 - 云基础架构是由硬件、网络、存储、虚拟化等多个资源和工具构成。
 - 由虚拟化技术从物理硬件中抽象出多种资源汇聚到云端,然后利用自动化软件和管理工具负责分配资源并部署新的环境。
 - 有多个组件构成,每个组件都相互集成到一个支持业务运行的单一架构中,也主要是由各种技术整合而成的完整云计算系统。
 - 云架构和云基础架构的区别:
 	“云架构是把各种技术整合起来构建云计算环境的一个蓝图;
 	 云基础架构是构建云时所需要使用的资源和工具。
 	”

什么是OpenStack ?

 - OpenStack是一个利用虚拟资源池构建和管理私有云和公共云的平台。
 - OpenStack本身不会虚拟化资源,但会使用虚拟化资源来构建云,OpenStack也不执行命令,但会将命令转发到基础OS;OpenStack、虚拟化软件和基础操作系统必须协同工作。
 - OpenStack架构是由大量的开源项目组成,分别用于设置OpenStack的undercloud(系统管理员)和overcloud(云用户)使用。
 - 六个可靠的核心服务:NOVA(计算服务)、NEUTRON(网络服务)、KEYSTONE(身份服务)、SWIFT(对象存储服务)、CINDER(块存储服务)、GLANCE(镜像服务)- OpenStack可以用于构建公共云、私有云,也可以运行容器等。

接下来… 开始构建

物理架构
物理设备架构:硬件性能为10代i7,6核的物理CPU,32G内存和1TSSD固态硬盘
在这里插入图片描述

一、环境准备:
》主机网络
》网络时间同步(NTP)
》安装OpenStack软件包
》安装数据库(MariaDB)
》安装消息队列(RabbitMQ)
》安装缓存(Memcache)
》安装Etcd


》主机网络配置

环境所示控制节点和计算节点分别需要使用2个网卡(2NIC)、块存储节点使用1个网卡配置(1NIC);其中一个网卡1配置为管理网卡,对各组件和云平台进行管理使用,网卡2则需要一个网关,以便在OpenStack环境中提供对实例的Internet访问。
规划网络如下:

操作系统:
- Linux controller 4.18.0-305.12.1.el8_4.x86_64 #1 SMP Wed Aug 11 01:59:55 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
- CentOS Linux release 8.4.2105
网卡一:
管理网络:192.168.43.0/24,网关:192.168.43.1
该网络需要一个网关来为所有节点提供 Internet 访问,以用于管理目的,例如软件包安装、安全更新、DNS 和 NTP。
网卡二:
该网络需要一个网关来提供对 OpenStack 环境中实例的 Internet 访问;这个后续操作会着重提到。

》》控制节点配置

- hostname:controller
- ipaddress: 192.168.43.11
- netmask:255.255.255.0
- gateway:192.168.43.1
[root@localhost ~]# hostnamectl set-hostname controller
[root@localhost ~]# hostname
controller
[root@controller ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.43.11	controller
192.168.43.21	compute
192.168.43.31	block-storage
[root@controller ~]# nmcli connection modify ens33 ipv4.addresses 192.168.43.11/24 ipv4.gateway 192.168.43.1 ipv4.dns 114.114.114.114 ipv4.method manual
[root@controller ~]# nmcli connection up ens33 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/20)
[root@controller ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=c1dfe03f-cf42-4932-806d-5d895f755ba4
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.43.11
PREFIX=24
GATEWAY=192.168.43.1
DNS1=114.114.114.114

[root@controller ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens34
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens34
UUID=72944612-29be-4757-aa45-22b1fbcae515
DEVICE=ens34

配置完毕,保存退出!

》》计算节点配置

- hostname:compute
- ipaddress: 192.168.43.21
- netmask:255.255.255.0
- gateway:192.168.43.1
[root@localhost ~]# hostnamectl set-hostname compute
[root@localhost ~]# hostname
compute
[root@compute ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.43.11	controller
192.168.43.21	compute
192.168.43.31	block-storage
[root@compute ~]# nmcli connection modify ens33 ipv4.addresses 192.168.43.21/24 ipv4.gateway 192.168.43.1 ipv4.dns 114.114.114.114 ipv4.method manual
[root@compute ~]# nmcli connection up ens33 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
[root@compute ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=2e24b3c7-2da4-4299-b0ea-bc2badc8d067
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.43.21
PREFIX=24
GATEWAY=192.168.43.1
DNS1=114.114.114.114

[root@compute ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens34
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens34
UUID=8b2cc875-b6ee-4ef8-af80-ab3f8e9926c8
DEVICE=ens34

配置完毕,保存退出!

》》块存储节点配置

- hostname:block-storage
- ipaddress: 192.168.43.31
- netmask:255.255.255.0
- gateway:192.168.43.1
[root@localhost ~]# hostnamectl set-hostname block-storage
[root@localhost ~]# hostname
block-storage
[root@block-storage ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.43.11	controller
192.168.43.21	compute
192.168.43.31	block-storage
[root@block-storage ~]# nmcli connection modify ens33 ipv4.addresses 192.168.43.31/24 ipv4.gateway 192.168.43.1 ipv4.dns 114.114.114.114 ipv4.method manual
[root@block-storage ~]# nmcli connection up ens33 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
[root@block-storage ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=e0a05449-ccc0-435e-a935-cabd38723404
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.43.31
PREFIX=24
GATEWAY=192.168.43.1
DNS1=114.114.114.114

[root@block-storage ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens34
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens34
UUID=2626dd46-8af4-4b6f-82a0-0181d9a1825c
DEVICE=ens34

配置完毕,保存退出!

》网络时间同步(NTP)

让各个节点之间的时间和服务正确同步,可以安装chrony,以实现NTP的方式;本次由于在控制节点搭建NTP服务,所以各个节点的时间以控制节点为主同步(如果本地有物理部署的NTP服务器,最好可以以本地的NTP时间为主进行同步)
》》控制节点

[root@controller ~]# yum -y install chrony
[root@controller ~]# vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool controller iburst   # NTP服务器主机名,最好可以是本地的NTP

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
allow 192.168.0.0/16  # 允许所在网络访问NTP

# Serve time even if not synchronized to a time source.
#local stratum 10
[root@controller ~]# systemctl enable --now chronyd.service
[root@controller ~]# systemctl restart chronyd.service
[root@controller ~]# systemctl status chronyd.service
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor pres>
   Active: active (running) since Wed 2021-08-25 00:23:40 CST; 6s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 3513 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exi>
  Process: 3507 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCC>
 Main PID: 3511 (chronyd)
    Tasks: 1 (limit: 49190)
   Memory: 396.0K
   CGroup: /system.slice/chronyd.service
           └─3511 /usr/sbin/chronyd

Aug 25 00:23:39 controller systemd[1]: chronyd.service: Succeeded.

》》其它节点

[root@compute ~]# yum install chrony -y
[root@compute ~]# vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool controller iburst  # 其他所有节点以同步控制节点的时间

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
[root@compute ~]# systemctl enable chronyd.service
[root@compute ~]# systemctl restart chronyd.service
[root@compute ~]# systemctl status chronyd.service
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor pres>
   Active: active (running) since Wed 2021-08-25 00:36:30 CST; 11s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 3441 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exi>
  Process: 3436 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCC>
 Main PID: 3439 (chronyd)
    Tasks: 1 (limit: 49190)
   Memory: 400.0K
   CGroup: /system.slice/chronyd.service
           └─3439 /usr/sbin/chronyd

Aug 25 00:36:30 compute systemd[1]: chronyd.service: Succeeded.

》》验证以上操作

[root@compute ~]# chronyc sources -v   # 在每个节点执行,查看同步服务器
210 Number of sources = 1

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? controller                    0   6     0     -     +0ns[   +0ns] +/-    0ns

》安装OpenStack软件包

注意:OpenStack包需要在所有节点上完成同样操作,这里包含计算、控制和块存储节点。
在CentOS上,extras 存储库提供启用OpenStack存储库的RPM。CentOS默认包含extras存储库,因此只需要安装该软件包即可启用OpenStack存储库,对于CentOS8,还需要启用PowerTools存储库。
[root@controller ~]# yum install centos-release-openstack-victoria
Repository extras is listed more than once in the configuration
CentOS-8 - Base - repo.huaweicloud.com            21 kB/s | 3.9 kB     00:00    
CentOS-8 - AppStream - repo.huaweicloud.com       27 kB/s | 4.3 kB     00:00    
CentOS-8 - PowerTools - repo.huaweicloud.com      23 kB/s | 4.3 kB     00:00    
CentOS-8 - Extras - repo.huaweicloud.com         8.8 kB/s | 1.5 kB     00:00    
Dependencies resolved.
=================================================================================
 Package                                  Arch     Version        Repo      Size
=================================================================================
Installing:
 centos-release-openstack-victoria        noarch   1-2.el8        extras    10 k
#......
Installed:
  centos-release-advanced-virtualization-1.0-3.el8.noarch                        
  centos-release-ceph-nautilus-1.2-2.el8.noarch                                  
  centos-release-messaging-1-2.el8.noarch                                        
  centos-release-nfv-common-1-3.el8.noarch                                       
  centos-release-nfv-openvswitch-1-3.el8.noarch                                  
  centos-release-openstack-victoria-1-2.el8.noarch                               
  centos-release-rabbitmq-38-1-2.el8.noarch                                      
  centos-release-storage-common-2-2.el8.noarch                                   
  centos-release-virt-common-1-2.el8.noarch                                      

Complete!

[root@controller ~]# yum -y install yum-utils-4.0.18-4.el8.noarch
Repository extras is listed more than once in the configuration
Last metadata expiration check: 14:52:57 ago on Tue 24 Aug 2021 10:38:26 AM CST.
Dependencies resolved.
=================================================================================
 Package            Architecture    Version                Repository       Size
=================================================================================
Installing:
 yum-utils          noarch          4.0.18-4.el8           BaseOS           71 k

Transaction Summary
=================================================================================
Install  1 Package
......
Installed:
  yum-utils-4.0.18-4.el8.noarch                                                  

Complete!

[root@controller ~]# yum-config-manager --set-enabled PowerTools
# 完成最后的安装.....
[root@controller ~]# yum upgrade
[root@controller ~]# yum install python3-openstackclient
Repository extras is listed more than once in the configuration
Last metadata expiration check: 0:01:47 ago on Wed 25 Aug 2021 02:02:32 AM CST.
Dependencies resolved.
================================================================================
 Package                  Arch   Version        Repository                 Size
================================================================================
Installing:
 python3-openstackclient  noarch 5.4.0-2.el8    centos-openstack-victoria 1.1 M
......
  python3-wcwidth-0.2.5-2.el8.noarch                                            
  python3-wrapt-1.12.1-3.el8.x86_64                                             
  python3-zipp-0.5.1-2.el8.noarch                                               

Complete!
# 安装OpenStack-Selinux软件包,以实现自动管理OpenStack服务的安全策略;
# 可以关闭系统的防火墙和Selinux;
[root@controller ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@controller ~]# systemctl stop firewalld
[root@controller ~]# vim /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

[root@controller ~]# yum install openstack-selinux -y
Repository extras is listed more than once in the configuration
Last metadata expiration check: 0:07:34 ago on Wed 25 Aug 2021 02:02:32 AM CST.
Dependencies resolved.
================================================================================
 Package             Arch     Version         Repository                   Size
================================================================================
Installing:
 openstack-selinux   noarch   0.8.27-1.el8    centos-openstack-victoria   224 k
 Installed:
  openstack-selinux-0.8.27-1.el8.noarch                                         

Complete!

# 至此安装完毕,请注意所有节点均执行该过程!

》安装数据库(MariaDB)

大多数OpenStack服务都会使用SQL数据库来存储信息;数据库通常在控制节点上运行;本次安装过程根据CentOS的发行版使用MariaDB数据库

[root@controller ~]# yum install mariadb mariadb-server python2-PyMySQL
Repository extras is listed more than once in the configuration
Last metadata expiration check: 0:00:26 ago on Wed 25 Aug 2021 02:48:22 AM CST.
Dependencies resolved.
================================================================================
 Package         Arch   Version                                 Repo       Size
================================================================================
Installing:
 mariadb         x86_64 3:10.3.28-1.module_el8.3.0+757+d382997d AppStream 6.0 M
......
Installed:
  mariadb-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64                        
  mariadb-backup-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64                 
  mariadb-common-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64                 
  mariadb-connector-c-3.1.11-2.el8_3.x86_64                                     
  mariadb-connector-c-config-3.1.11-2.el8_3.noarch                              
  mariadb-errmsg-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64                 
  mariadb-gssapi-server-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64          
  mariadb-server-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64                 
  mariadb-server-utils-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64           
  perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64                     
  python2-2.7.18-4.module_el8.4.0+668+03e3490a.x86_64                           
  python2-PyMySQL-0.8.0-10.module_el8.4.0+642+1dc4fb01.noarch                   
  python2-libs-2.7.18-4.module_el8.4.0+668+03e3490a.x86_64                      
  python2-pip-9.0.3-18.module_el8.4.0+642+1dc4fb01.noarch                       
  python2-pip-wheel-9.0.3-18.module_el8.4.0+642+1dc4fb01.noarch                 
  python2-setuptools-39.0.1-13.module_el8.4.0+642+1dc4fb01.noarch               
  python2-setuptools-wheel-39.0.1-13.module_el8.4.0+642+1dc4fb01.noarch         

Complete!

# 创建并编辑/etc/my.cnf.d/openstack.cnf文件:
# 创建[mysqld]段,将bind-address键设置为controller节点的管理IP地址,允许其他节点通过管理网络访问;设置附加键以启用有用的选项和utf-8字符集。

[root@controller ~]# vim /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 192.168.43.11

default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
# 最后完成安装,并设置数据库服务为开机自启动。
[root@controller ~]# systemctl enable mariadb.service
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@controller ~]# systemctl restart mariadb.service
[root@controller ~]# systemctl status mariadb.service
● mariadb.service - MariaDB 10.3 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor pre>
   Active: active (running) since Wed 2021-08-25 02:58:56 CST; 13s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 7464 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, st>
  Process: 7328 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mariadb.service >
  Process: 7304 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, stat>
 Main PID: 7433 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 30 (limit: 49190)
   Memory: 88.3M
   CGroup: /system.slice/mariadb.service
           └─7433 /usr/libexec/mysqld --basedir=/usr
# 通过运行 mysql_secure_installation 脚本来保护数据库服务;为数据库root账户选择一个合适的密码。

[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
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password:     # 由于非生产环境,这里密码设置简单一点"123456"
Re-enter new password:     # 密码:"123456"
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.

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.

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.

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.

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!

# 至此数据库安装完毕,数据库服务在控制节点运行!

》安装消息队列(RabbitMQ)

OpenStack使用消息队列来协调服务之间的操作和状态信息。消息队列服务通常在控制节点上运行。OpenStack支持多中消息队列服务,包括RabbitMQ、Opid和ZeroMQ。但是,大多数打包OpenStack的发行版都支持特定的消息队列服务。本次安装主要实现了RabbitMQ消息队列服务,因为大多数发行版本都支持它。

[root@controller ~]# yum install rabbitmq-server
Repository extras is listed more than once in the configuration
Last metadata expiration check: 2:14:17 ago on Wed 25 Aug 2021 02:48:22 AM CST.
Dependencies resolved.
================================================================================
 Package                Arch     Version             Repository            Size
================================================================================
Installing:
 rabbitmq-server        x86_64   3.8.3-1.el8         centos-rabbitmq-38    11 M
......
Complete!
# 启动rabbitmq服务,并设置开机自启动!
[root@controller ~]# systemctl restart rabbitmq-server.service
[root@controller ~]# systemctl enable rabbitmq-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service → /usr/lib/systemd/system/rabbitmq-server.service.
[root@controller ~]# systemctl status rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ broker
   Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; ve>
   Active: active (running) since Wed 2021-08-25 05:04:33 CST; 29s ago
 Main PID: 10222 (beam.smp)
   Status: "Initialized"
    Tasks: 87 (limit: 49190)
   Memory: 76.2M
   CGroup: /system.slice/rabbitmq-server.service
           ├─10222 /usr/lib64/erlang/erts-10.7.2.1/bin/beam.smp -W w -A 64 -MBa>
           ├─10324 /usr/lib64/erlang/erts-10.7.2.1/bin/epmd -daemon
           ├─10465 erl_child_setup 1024
           ├─10514 inet_gethost 4
           └─10515 inet_gethost 4
# 添加OpenStack用户
[root@controller ~]# rabbitmqctl add_user openstack rabbit123  # “rabbit123” 为密码,请替换为合适的密码
Adding user "openstack" ...
# 允许OpenStack用户的配置、写入和读取访问权限
[root@controller ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/" ...

》安装缓存(Memcache)

身份服务的认证机制使用memcache来缓存令牌。memcache通常在控制节点上运行,对于生产部署,建议启用防火墙、身份验证和加密的组合来保护它。

[root@controller ~]# yum install memcached python3-memcached
Repository extras is listed more than once in the configuration
Last metadata expiration check: 2:26:24 ago on Wed 25 Aug 2021 02:48:22 AM CST.
Dependencies resolved.
================================================================================
 Package              Arch      Version           Repository               Size
================================================================================
Installing:
 memcached            x86_64    1.5.22-2.el8      AppStream               162 k
 python3-memcached    noarch    1.58-11.el8       centos-ceph-nautilus     44 k
......
Installed:
  memcached-1.5.22-2.el8.x86_64       python3-memcached-1.58-11.el8.noarch      

Complete!
# 编辑/etc/sysconfig/memcached文件;将服务配置为使用控制器节点的管理IP地址,允许其他节点通过网络进行访问
[root@controller ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1,controller"
# 完成安装,并设置开机自启动!
[root@controller ~]# systemctl restart memcached.service
[root@controller ~]# systemctl enable memcached.service
Created symlink /etc/systemd/system/multi-user.target.wants/memcached.service → /usr/lib/systemd/system/memcached.service.
[root@controller ~]# systemctl status memcached.service
● memcached.service - memcached daemon
   Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; vendor p>
   Active: active (running) since Wed 2021-08-25 05:21:43 CST; 20s ago
 Main PID: 12488 (memcached)
    Tasks: 10 (limit: 49190)
   Memory: 1.7M
   CGroup: /system.slice/memcached.service
           └─12488 /usr/bin/memcached -p 11211 -u memcached -m 64 -c 1024 -l 12>

》安装Etcd

OpenStack服务可能会使用Etcd,一种分布式可靠的键值存储,用于分布式密钥锁定、存储配置、跟踪服务实时性和其他场景。Etcd服务运行在控制节点上。

[root@controller ~]# yum install etcd
Repository extras is listed more than once in the configuration
Last metadata expiration check: 2:37:42 ago on Wed 25 Aug 2021 02:48:22 AM CST.
Dependencies resolved.
================================================================================
 Package   Arch        Version             Repository                      Size
================================================================================
Installing:
 etcd      x86_64      3.2.21-2.el8        centos-openstack-victoria       12 M
......
Installed:
  etcd-3.2.21-2.el8.x86_64                                                      

Complete!
# 编辑/etc/etcd/etcd.conf文件,设置ETCD_INITIAL_CLUSTER, ETCD_INITIAL_ADVERTISE_PEER_URLS, ETCD_ADVERTISE_CLIENT_URLS, ETCD_LISTEN_CLIENT_URLS为控制节点的管理IP地址,允许其他节点通过管理网络访问
[root@controller ~]# vim /etc/etcd/etcd.conf 
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.43.11:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.43.11:2379"
ETCD_NAME="controller"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.43.11:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.43.11:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.43.11:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new"
# 完成安装,并设置开机自启动!
[root@controller ~]# systemctl enable etcd
Created symlink /etc/systemd/system/multi-user.target.wants/etcd.service → /usr/lib/systemd/system/etcd.service.
[root@controller ~]# systemctl restart etcd
[root@controller ~]# systemctl status etcd
● etcd.service - Etcd Server
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset>
   Active: active (running) since Wed 2021-08-25 05:37:01 CST; 4s ago
 Main PID: 14379 (etcd)
    Tasks: 10 (limit: 49190)
   Memory: 16.5M
   CGroup: /system.slice/etcd.service
           └─14379 /usr/bin/etcd --name=controller --data-dir=/var/lib/etcd/def>

二、安装OpenStack服务

》Identity Installation 身份认证服务
》Image Installation 镜像服务
》Placement Installation 安置服务
》Nova Installation 计算服务
》Neutron Installation 网络服务
》Dashboard Installation 仪表板
》Block Storage Installation 块存储服务


OpenStack系统由几个单独安装的关键服务组成。这些服务根据云的需求协同工作,包括Compute,Identity,Networking,Image,Block Storage,Object Storage,Telemetry,Orchestration,Database services。可以单独安装这些项目中的任何一个,并将它们配置为独立的或连接的实体。本次安装主要以上几个核心服务为主。详情参考:https://docs.openstack.org/install-guide/openstack-services.html#minimal-deployment-for-victoria

》Identity Installation 身份认证服务

简述身份认证服务
	OpenStack Identity服务为管理身份认证、授权和服务目录提供了单点集成。
	身份服务通常是用户与之交互的第一个服务。通过身份验证后,最终用户可以使用他们的身份访问其他OpenStack服务。同样,其他OpenStack服务利用身份服务来确保用户是他们所说的人,并发现其他服务在部署中的位置。Identity服务还可以与一些外部用户管理系统(例如LDAP)集成。
	用户和服务可以使用由身份服务管理的服务目录来定位其他服务。顾名思义,服务目录是 OpenStack 部署中可用服务的集合。每个服务可以有一个或多个端点,每个端点可以是以下三种类型之一:管理、内部或公共。在生产环境中,出于安全原因,不同的端点类型可能位于向不同类型用户公开的不同网络上。例如,公共 API 网络可能从 Internet 上可见,因此客户可以管理他们的云。管理 API 网络可能仅限于组织内管理云基础架构的操作员。内部 API 网络可能仅限于包含 OpenStack 服务的主机。此外,OpenStack 支持多个区域以实现可扩展性。
身份服务包含以下组件:
	服务器
	集中式服务器使用 RESTful 接口提供身份验证和授权服务。
	驱动程序
	驱动程序或服务后端集成到中央服务器。它们用于访问 OpenStack 外部存储库中的身份信息,并且可能已经存在于部署 OpenStack 的基础设施中(例如,SQL 数据库或 LDAP 服务器)。
	模块
	中间件模块在使用身份服务的 OpenStack 组件的地址空间中运行。这些模块拦截服务请求,提取用户凭据,并将其发送到中央服务器进行授权。中间件模块和 OpenStack 组件之间的集成使用 Python Web 服务器网关接口。

在控制器节点上安装和配置代号为keystone的OpenStack Identity服务。出于可扩展性的目的,此配置部署Fernet令牌和Apache HTTP服务器来处理请求。
》》安装和配置

# 在安装和配置Identity服务前,必须先创建一个数据库
[root@controller ~]# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.000 sec)
# 授予对keystone数据库访问权限
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'key123';    # key123 为密码
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'key123';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> exit;
Bye
# 安装和配置组件
[root@controller ~]# yum install openstack-keystone httpd python3-mod_wsgi
Repository extras is listed more than once in the configuration
Last metadata expiration check: 0:06:32 ago on Wed 25 Aug 2021 09:10:11 PM CST.
Dependencies resolved.
===================================================================================================================
 Package                        Arch     Version                                 Repository                   Size
===================================================================================================================
Installing:
 httpd                          x86_64   2.4.37-39.module_el8.4.0+778+c970deab   AppStream                   1.4 M
 openstack-keystone             noarch   1:18.0.0-1.el8                          centos-openstack-victoria    83 k
 python3-mod_wsgi               x86_64   4.6.4-4.el8                             AppStream                   2.5 M
......
Complete!
# 编辑/etc/keystone/keystone.conf文件,完成以下操作
[database]
# ...
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

[token]
# ...
provider = fernet
# 同步身份服务至数据库
[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
如果有报错:
oslo_config.cfg.ConfigFilesPermissionDeniedError: Failed to open some config files: /etc/keystone/keystone.conf
则执行:
[root@controller ~]# chown -R keystone:keystone /etc/keystone/keystone.conf
[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
# 初始化Fernet密钥库
# --keystone-user 和 --keystone-group 用于指定将用于运行keystone的操作系统用户和组,主要是为了允许再另一个操作系统的用户和组下运行keystone。 
[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 ADMIN_PASS \  # 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

》》配置Apache HTTP server

# 编辑/etc/httpd/conf/httpd.conf文件并配置ServerName选项引用控制节点
[root@controller ~]# vim /etc/httpd/conf/httpd.conf
ServerName controller
# 创建指向/usr/share/keystone/wsgi-keystone.conf文件的链接
[root@controller ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
# 完成安装,启动apache http服务,并设置开机自启动
[root@controller ~]# systemctl restart httpd.service
[root@controller ~]# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@controller ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2021-08-25 21:46:24 CST; 15s ago
     Docs: man:httpd.service(8)
 Main PID: 15125 (httpd)
   Status: "Running, listening on: port 5000, port 80"
    Tasks: 233 (limit: 49190)
   Memory: 69.7M
   CGroup: /system.slice/httpd.service
           ├─15125 /usr/sbin/httpd -DFOREGROUND
           ├─15126 /usr/sbin/httpd -DFOREGROUND
           ├─15127 (wsgi:keystone- -DFOREGROUND
           ├─15128 (wsgi:keystone- -DFOREGROUND
           ├─15129 (wsgi:keystone- -DFOREGROUND
           ├─15130 (wsgi:keystone- -DFOREGROUND
           ├─15131 (wsgi:keystone- -DFOREGROUND
           ├─15132 /usr/sbin/httpd -DFOREGROUND
           ├─15133 /usr/sbin/httpd -DFOREGROUND
           └─15134 /usr/sbin/httpd -DFOREGROUND
# 设置环境变量来配置管理账户
# 下面使用到的值是从keystone-manage bootstrap创建的默认值
# 将ADMIN_PASS替换为keystone-install-configure-rdo中的keystone-manage bootstrap命令中使用的密码
[root@controller ~]# export OS_USERNAME=admin
[root@controller ~]# export OS_PASSWORD=ADMIN_PASS
[root@controller ~]# export OS_PROJECT_NAME=admin
[root@controller ~]# export OS_USER_DOMAIN_NAME=Default
[root@controller ~]# export OS_PROJECT_DOMAIN_NAME=Default
[root@controller ~]# export OS_AUTH_URL=http://controller:5000/v3
[root@controller ~]# export OS_IDENTITY_API_VERSION=3

》》创建域、项目、用户和角色
Identity服务为每个OpenStack服务提供身份验证服务。身份验证服务使用域、项目、用户和角色。

# 创建一个新域
[root@controller ~]# openstack domain create --description "An Example Domain" example
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | An Example Domain                |
| enabled     | True                             |
| id          | c28530b387984e0692ec33c501fcf43f |
| name        | example                          |
| options     | {}                               |
| tags        | []                               |
+-------------+----------------------------------+
# 创建服务项目
[root@controller ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 1c9f6e12b2bb4a2bbb94cc1736db2535 |
| is_domain   | False                            |
| name        | service                          |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
# 创建非特权项目和用户
[root@controller ~]# openstack project create --domain default --description "Demo Project" myproject
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 727bdf7d611d493c9a12211dca347d1d |
| is_domain   | False                            |
| name        | myproject                        |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+

[root@controller ~]# openstack user create --domain default --password-prompt myuser
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | e859f6a14cc141a8b9c03c5088b4b848 |
| name                | myuser                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
# 创建角色,并将角色添加到项目和用户中
[root@controller ~]# openstack role create myrole
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | None                             |
| domain_id   | None                             |
| id          | 69094970d2d84dec86d7b96321a9e0ec |
| name        | myrole                           |
| options     | {}                               |
+-------------+----------------------------------+

[root@controller ~]# openstack role add --project myproject --user myuser myrole
# 创建完成后,可以使用命令查看是否存在
[root@controller ~]# openstack project list
+----------------------------------+-----------+
| ID                               | Name      |
+----------------------------------+-----------+
| 1c9f6e12b2bb4a2bbb94cc1736db2535 | service   |
| 52f5c54c97dd40c7ab15699556d5f557 | admin     |
| 727bdf7d611d493c9a12211dca347d1d | myproject |
+----------------------------------+-----------+
[root@controller ~]# openstack user list
+----------------------------------+--------+
| ID                               | Name   |
+----------------------------------+--------+
| 3a519dd842e2454e888c809ba72044a2 | admin  |
| e859f6a14cc141a8b9c03c5088b4b848 | myuser |
+----------------------------------+--------+
[root@controller ~]# openstack role list
+----------------------------------+--------+
| ID                               | Name   |
+----------------------------------+--------+
| 4969ef4eddef42c28b898f45dcda5a16 | admin  |
| 687b653b6dcf42fd977fe5c7335fe044 | reader |
| 69094970d2d84dec86d7b96321a9e0ec | myrole |
| dde93555eba34ea997254bf392facff9 | member |
+----------------------------------+--------+

》》验证操作
在安装其它服务之前验证身份服务的操作

# 取消设置临时 OS_AUTH_URL 和 OS_PASSWORD 环境变量: 
[root@controller ~]# unset OS_AUTH_URL OS_PASSWORD
# 作为管理员用户,请求身份验证令牌
[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:
+------------+-----------------------------------------------------------------+
| Field      | Value                                                           |
+------------+-----------------------------------------------------------------+
| expires    | 2021-08-25T18:32:03+0000                                     |
| id         | gAAAAABWvi7_B8kKQD9wdXac8MoZiQldmjEO643d-e_j-XXq9AmIegIbA7UHGPv |
|            | atnN21qtOMjCFWX7BReJEQnVOAj3nclRQgAYRsfSU_MrsuWb4EDtnjU7HEpoBb4 |
|            | o6ozsA_NmFWEpLeKy0uNn_WeKbAhYygrsmQGA49dclHVnz-OMVLiyM9ws       |
| project_id | 343d245e850143a096806dfaefa9afdc                                |
| user_id    | ac3377633149401296f6c0d92d79dc16                                |
+------------+-----------------------------------------------------------------+
# 作为上一节创建的myuser,请求一个身份令牌
[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:
+------------+-----------------------------------------------------------------+
| Field      | Value                                                           |
+------------+-----------------------------------------------------------------+
| expires    | 2021-08-25T18:35:10+0000                                     |
| id         | gAAAAABWvi9bsh7vkiby5BpCCnc-JkbGhm9wH3fabS_cY7uabOubesi-Me6IGWW |
|            | yQqNegDDZ5jw7grI26vvgy1J5nCVwZ_zFRqPiz_qhbq29mgbQLglbkq6FQvzBRQ |
|            | JcOzq3uwhzNxszJWmzGC7rJE_H0A_a3UFhqv8M4zMRYSbS2YF0MyFmp_U       |
| project_id | ed0b60bf607743088218b0a533d5943f                                |
| user_id    | 58126687cbcc4888bfa9ab73a2256f27                                |
+------------+-----------------------------------------------------------------+

》》创建OpenStack客户端环境脚本
为了提高客户端操作的效率,OpenStack 支持简单的客户端环境脚本,也称为 OpenRC 文件。 这些脚本通常包含所有客户端的通用选项,但也支持独特的选项。
创建脚本
为管理和演示项目和用户创建客户端环境脚本。 此次安装的后续部分将参考这些脚本来加载客户端操作的适当凭据。

# 创建并编辑admin-openrc文件并添加以下内容
[root@controller ~]# vim 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=key456   # 替换为身份服务中为admin设置的密码
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
# 创建并编辑demo-openrc文件并添加以下内容
[root@controller ~]# vim demo-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=my123  # 替换为在身份服务中创建演示用户的密码
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

使用脚本
将客户端作为特定项目和用户运行,只需在运行它们之前加载关联的客户端环境脚本。

[root@controller ~]# . admin-openrc

[root@controller ~]# openstack token issue

+------------+-----------------------------------------------------------------+
| Field      | Value                                                           |
+------------+-----------------------------------------------------------------+
| expires    | 2021-08-25T18:58:50+0000                                     |
| id         | gAAAAABWvjYj-Zjfg8WXFaQnUd1DMYTBVrKw4h3fIagi5NoEmh21U72SrRv2trl |
|            | JWFYhLi2_uPR31Igf6A8mH2Rw9kv_bxNo1jbLNPLGzW_u5FC7InFqx0yYtTwa1e |
|            | eq2b0f6-18KZyQhs7F3teAta143kJEWuNEYET-y7u29y0be1_64KYkM7E       |
| project_id | 343d245e850143a096806dfaefa9afdc                                |
| user_id    | ac3377633149401296f6c0d92d79dc16                                |
+------------+-----------------------------------------------------------------+

》Image Installation 镜像服务

# 镜像服务概述
 - 镜像服务 (glance) 使用户能够发现、注册和检索虚拟机映像。 它提供了一个 REST API,使其能够查询虚拟机映像元数据并检索实际映像。 可以将通过 Image 服务提供的虚拟机映像存储在各种位置,从简单的文件系统到 OpenStack Object Storage 等对象存储系统。
 - 此安装过程介绍了配置 Image 服务以使用文件后端,该后端上传并存储在托管 Image 服务的控制器节点上的目录中。 默认情况下,此目录为 /var/lib/glance/images/
 - OpenStack Image 服务是基础设施即服务 (IaaS) 的核心。 它接受对磁盘或服务器映像的 API 请求,以及来自最终用户或 OpenStack Compute 组件的元数据定义。 它还支持在各种存储库类型(包括 OpenStack 对象存储)上存储磁盘或服务器映像。许多周期性进程在 OpenStack Image 服务上运行以支持缓存。 复制服务通过集群确保一致性和可用性。
OpenStack Image 服务包括以下组件:
1. glance-api
接收image API调用,用于image发现、检索和存储。
2. Database
存储image元数据,可以根据自己的喜好选择数据库。大多数部署使用MySQL或SQLite。
3. Storage repository for image files
支持各种存储库类型,包括普通文件系统(或安装在glance-api控制器节点上的任何文件系统)、对象存储、RADOS块设备、VMware数据存储和HTTP。注意,有些存储库只支持只读使用。
4. Metadata definition service
一个通用的API,供供应商、管理员、服务和用户有意义地定义他们自己的自定义元数据。这种元数据可以用于不同类型的资源,如images、artifacts、volumes、flavors和aggregates。定义包括新属性的键、描述、约束和它可以关联的资源类型。

》》安装和配置
在控制节点上安装和配置代码为glance的Image服务。此配置将映像存储在本地文件系统中。
在安装和配置 Image 服务之前,必须创建一个数据库、服务凭证和 API 端点。

[root@controller ~]# mysql -u root -p

MariaDB [(none)]> CREATE DATABASE glance;

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';   # 替换GLANCE_DBPASS为合适的密码
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';

MariaDB [(none)]> exit;
# 获取admin凭据以获得对admin-only CLI命令的访问权限
[root@controller ~]# . admin-openrc
# 创建glance用户
[root@controller ~]# openstack user create --domain default --password-prompt glance
User Password:     # 为glance user选择一个合适的密码
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 33ed1c7b2f6242d9b04be2020ab1050c |
| name                | glance                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
# 在glance用户和服务项目中添加管理员角色 
[root@controller ~]# openstack role add --project service --user glance admin
# 创建glance服务实体
[root@controller ~]# openstack service create --name glance --description "OpenStack Image" image
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image                  |
| enabled     | True                             |
| id          | f69896fa37c1424dba30c9b30fd533e9 |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+
# 创建图像服务API端点
[root@controller ~]# openstack endpoint create --region RegionOne image public http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 9fea12feb12b43f5818c8ca2720af131 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | f69896fa37c1424dba30c9b30fd533e9 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne image internal http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 52c69425ea0141d88df9f68e64d5fbf4 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | f69896fa37c1424dba30c9b30fd533e9 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne image admin http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | b6e5e360cf10491190843fe3d1ffd3c0 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | f69896fa37c1424dba30c9b30fd533e9 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+
# 安装和配置组件
[root@controller ~]# yum install openstack-glance
Repository extras is listed more than once in the configuration
Last metadata expiration check: 5:37:15 ago on Wed 25 Aug 2021 09:10:11 PM CST.
Dependencies resolved.
====================================================================================================================
 Package                         Arch     Version                                 Repository                   Size
====================================================================================================================
Installing:
 openstack-glance                noarch   1:21.0.0-1.el8                          centos-openstack-victoria    78 k
......
Complete!
# 编辑 /etc/glance/glance-api.conf 文件并完成以下操作 
"在[database]部分,配置数据库访问"
[database]
# ...
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance   # 使用为Image服务数据库选择的密码替换GLANCE_DBPASS

"在[keystone_authtoken]和[paste_deploy]节中,配置Identity服务访问"
[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替换为您在Identity服务中为glance用户选择的密码

[paste_deploy]
# ...
flavor = keystone

"在[glance_store]区域中,配置镜像文件的本地文件系统存储和位置"
[glance_store]
# ...
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
# 同步不Image服务至数据库
[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance
如果有报错:
oslo_config.cfg.ConfigFilesPermissionDeniedError: Failed to open some config files: /etc/glance/glance-api.conf
说明属主不对,给定glance用户属主即可
[root@controller ~]# chown -R glance:glance /etc/glance/glance-api.conf
[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance
.......
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
Database is synced successfully.
# 完成安装,并设置开启自启动
[root@controller ~]# systemctl enable openstack-glance-api.service
Created symlink /etc/systemd/system/multi-user.target.wants/openstack-glance-api.service → /usr/lib/systemd/system/openstack-glance-api.service.
[root@controller ~]# systemctl restart openstack-glance-api.service

》》校验操作
使用CirrOS验证image服务的运行情况,CirrOS是一个小型Linux映像,可以帮助测试OpenStack部署。

# 获取管理员凭据以访问仅限管理员的 CLI 命令
[root@controller ~]# . admin-openrc
# 下载image
[root@controller ~]# wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
# 使用 QCOW2 磁盘格式、裸容器格式和公开可见性将镜像上传到 Image 服务,以便所有项目都可以访问它
[root@controller ~]# glance image-create --name "cirros" \
> --file cirros-0.4.0-x86_64-disk.img \
> --disk-format qcow2 --container-format bare \
> --visibility=public
+------------------+----------------------------------------------------------------------------------+
| Property         | Value                                                                            |
+------------------+----------------------------------------------------------------------------------+
| checksum         | 443b7623e27ecf03dc9e01ee93f67afe                                                 |
| container_format | bare                                                                             |
| created_at       | 2021-08-26T09:40:26Z                                                             |
| disk_format      | qcow2                                                                            |
| id               | 40e4710c-fce3-49ee-86a8-deefea51ff53                                             |
| min_disk         | 0                                                                                |
| min_ram          | 0                                                                                |
| name             | cirros                                                                           |
| os_hash_algo     | sha512                                                                           |
| os_hash_value    | 6513f21e44aa3da349f248188a44bc304a3653a04122d8fb4535423c8e1d14cd6a153f735bb0982e |
|                  | 2161b5b5186106570c17a9e58b64dd39390617cd5a350f78                                 |
| os_hidden        | False                                                                            |
| owner            | 52f5c54c97dd40c7ab15699556d5f557                                                 |
| protected        | False                                                                            |
| size             | 12716032                                                                         |
| status           | active                                                                           |
| tags             | []                                                                               |
| updated_at       | 2021-08-26T09:40:27Z                                                             |
| virtual_size     | 46137344                                                                         |
| visibility       | public                                                                           |
+------------------+----------------------------------------------------------------------------------+
# 确认上传镜像并验证属性
[root@controller ~]# glance image-list
+--------------------------------------+--------+
| ID                                   | Name   |
+--------------------------------------+--------+
| 40e4710c-fce3-49ee-86a8-deefea51ff53 | cirros |
+--------------------------------------+--------+

》Placement Installation 安置服务

1、部署API服务
Placement 提供了一个placement-api WSGI 脚本,用于在Apache、nginx 或其他支持WSGI 的Web 服务器上运行服务。 根据用于部署 OpenStack 的打包解决方案,WSGI 脚本可能位于 /usr/bin 或 /usr/local/bin 中。

Placement-api 作为标准的 WSGI 脚本,提供了大多数 WSGI 服务器期望找到的模块级应用程序属性。 这意味着可以在许多不同的服务器上运行它,从而在面对不同的部署场景时提供灵活性。 常见场景包括:

  • apache2 with mod_wsgi
  • apache2 with mod_proxy_uwsgi
  • nginx with uwsgi
  • nginx with gunicorn

在所有这些场景中,应用程序的主机、端口和挂载路径(或前缀)是在web服务器的配置中控制的,而不是在放置应用程序的配置(placement.conf)中。

根据是否使用 TLS,DevStack 配置为在 http 或 https(80 或 443)的默认端口上的 /placement 托管放置。 使用默认端口是可取的。

默认情况下,放置应用程序将从 /etc/placement/placement.conf 获取其设置配置,例如数据库连接 URL。 可以通过在启动应用程序的进程的环境中设置 OS_PLACEMENT_CONFIG_DIR 来更改配置文件所在的目录。

2、同步数据库
placement服务使用自己的数据库,该数据库在配置的placement数据库部分中定义。 必须设置placement_database.connection 选项,否则服务将不会启动。 命令行工具placement-manage 可用于将数据库表迁移到正确的形式,包括创建它们。 连接选项描述的数据库必须已经存在并且定义了适当的访问控制。

同步的另一个选项是在配置中将placement_database.sync_on_startup 设置为True。 这将在placement Web 服务启动时执行任何丢失的数据库迁移。 选择自动同步还是使用命令行工具取决于您的环境和部署工具的限制。

3、创建帐户并更新服务目录
在 Keystone 中创建一个具有管理员角色的placement服务用户。

placement API 是一项单独的服务,因此应在服务目录中的placement服务类型下注册。 placement的客户端,例如 nova-compute 节点中的资源跟踪器,将使用服务目录来查找placement端点。

Devstack 使用 /placement 前缀而不是使用独立端口在默认 HTTP 端口 (80) 上设置placement服务。

》》安装
placement作为基于数据模型的 Web 服务运行。 安装包括创建必要的数据库以及安装和配置 Web 服务。 这是一个简单的过程,但是将placement与 OpenStack 云的其余部分集成在一起需要很多步骤。

注意:
其他一些 OpenStack 服务需要placement,特别是 nova,因此它应该安装在其他服务之前,但在 Identity(keystone)之后。 

》》创建数据库

[root@controller ~]# mysql -u root -p

MariaDB [(none)]> CREATE DATABASE placement;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'PLACEMENT_DBPASS';       # 将PLACEMENT_DBPASS替换为合适的密码
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'PLACEMENT_DBPASS';       # 将PLACEMENT_DBPASS替换为合适的密码
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> exit;

》》配置用户和端点

# 获取admin凭据以获得对admin-only CLI命令的访问权限
[root@controller ~]# . admin-openrc
# 使用选择的 PLACEMENT_PASS 创建 Placement 服务用户 
[root@controller ~]# openstack user create --domain default --password-prompt placement
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 63df1458d9e340148ef0a32490849876 |
| name                | placement                        |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
# 将Placement用户以admin角色添加到服务项目中
[root@controller ~]# openstack role add --project service --user placement admin
# 在服务目录中创建放置API条目
[root@controller ~]# openstack service create --name placement --description "Placement API" placement
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Placement API                    |
| enabled     | True                             |
| id          | 25f3b136c60c4fff85ab6e53b91050d8 |
| name        | placement                        |
| type        | placement                        |
+-------------+----------------------------------+
# 创建放置API服务端点
[root@controller ~]# openstack endpoint create --region RegionOne placement public http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 81720b07b8304dfabf3daa5e731908cc |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 25f3b136c60c4fff85ab6e53b91050d8 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne placement internal http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 3d26001084c9420199f60c8c7e03925b |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 25f3b136c60c4fff85ab6e53b91050d8 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne placement admin http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 8497c337215b412bae6e7ea596eef4ab |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 25f3b136c60c4fff85ab6e53b91050d8 |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

》》安装和配置组件
1.安装软件包

[root@controller ~]# yum install openstack-placement-api
Repository extras is listed more than once in the configuration
Last metadata expiration check: 2:47:23 ago on Thu 26 Aug 2021 06:02:14 PM CST.
Dependencies resolved.
==============================================================================================================
 Package                            Architecture  Version              Repository                        Size
==============================================================================================================
Installing:
 openstack-placement-api            noarch        4.0.0-1.el8          centos-openstack-victoria         12 k
......
Complete!

2.编辑/etc/placement/placement.conf文件,完成以下操作

# 在[placement_database]部分中,配置数据库访问
[placement_database]
# ...
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@controller/placement   # 用为placement数据库创建的密码替换PLACEMENT_DBPASS。
# 在[api]和[keystone_authtoken]部分,配置身份服务访问
[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替换为您为Identity服务中的placement用户选择的密码

3.同步placement数据库

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

完成安装

# 重启httpd服务
[root@controller ~]# systemctl restart httpd

》》验证安装

# 获取admin凭据以获得对admin-only CLI命令的访问权限
[root@controller ~]# . admin-openrc
# 执行状态检查以确保一切正常
[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                    |
+----------------------------------+
# 对placement API运行一些命令
[root@controller ~]# pip3 install osc-placement
# 列出可用的资源类和特性
[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

》Nova Installation 计算服务

》》什么是nova ?

Nova是OpenStack项目,它提供了一种提供计算实例(又称虚拟服务器)的方法。Nova支持创建虚拟机、裸机服务器(通过使用ironic),并且对系统容器的支持有限。Nova作为一组守护进程在现有Linux服务器上运行,以提供该服务。

》》计算服务概述

使用 OpenStack Compute 来托管和管理云计算系统。 OpenStack Compute 是基础设施即服务 (IaaS) 系统的主要部分。 主要模块是用 Python 实现的。

OpenStack Compute 与用于身份验证的 OpenStack Identity、用于资源库存跟踪和选择的 OpenStack Placement、用于磁盘和服务器映像的 OpenStack Image 服务以及用于用户和管理界面的 OpenStack Dashboard 交互。 镜像访问受项目和用户的限制; 每个项目的配额是有限的(例如实例数)。 OpenStack Compute 可以在标准硬件上水平扩展,并下载镜像以启动实例。

OpenStack计算由以下区域及其组件组成:

# nova-api service
 接受并响应最终用户计算 API 调用。 该服务支持 OpenStack Compute API。 它执行一些策略并启动大多数编排活动,例如运行实例。 
# nova-api-metadata service
 接受来自实例的元数据请求。
# nova-compute service
通过管理程序 API 创建和终止虚拟机实例的工作守护进程。 例如:
	- 用于 KVM 或 QEMU 的 libvirt 
	- 适用于 VMware 的 VMwareAPI 
处理过程相当复杂。基本上,守护进程接受来自队列的操作,并执行一系列系统命令,例如启动KVM实例并更新其在数据库中的状态。
# nova-scheduler service
 从队列中获取虚拟机实例请求并确定它在哪个计算服务器主机上运行。 
# nova-conductor module
 调解 nova-compute 服务和数据库之间的交互。 它消除了 nova-compute 服务对云数据库的直接访问。 nova-conductor 模块水平缩放。 但是,不要将其部署在 nova-compute 服务运行的节点上。
# nova-novncproxy daemon
 提供用于通过 VNC 连接访问正在运行的实例的代理。 支持基于浏览器的 novnc 客户端。
# nova-spicehtml5proxy daemon
提供用于通过 SPICE 连接访问正在运行的实例的代理。 支持基于浏览器的 HTML5 客户端。 
# The queue
在守护进程之间传递消息的中心枢纽。 通常使用 RabbitMQ 实现,但也可以使用其他选项。 
# SQL database
 存储云基础设施的大多数构建时和运行时状态,包括:
	- 可用实例类型 
	- 使用中的实例 
	- 可用网络 
	- 项目 
理论上,OpenStack Compute 可以支持 SQLAlchemy 支持的任何数据库。 常见的数据库有用于测试和开发工作的 SQLite3、MySQL、MariaDB 和 PostgreSQL。 

》》》安装和配置控制节点
1.在安装和配置Compute服务之前,必须创建数据库、服务凭据和API端点。

# 创建nova_api、nova和nova_cell0数据库
[root@controller ~]# mysql -u root -p

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

2.获取管理员凭据以获得对仅限admin的CLI命令的访问权

[root@controller ~]# . admin-openrc

3.创建Compute服务凭据

创建nova用户
[root@controller ~]# openstack user create --domain default --password-prompt nova
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 676b1a978d0947958ad4772fab906549 |
| name                | nova                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
# 为nova用户添加admin角色
[root@controller ~]# openstack role add --project service --user nova admin
# 创建nova服务实体
[root@controller ~]# openstack service create --name nova --description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute                |
| enabled     | True                             |
| id          | 5e761892164c450c8d4a99d463ab43e9 |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+
# 创建Compute API服务端点
[root@controller ~]# openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | e420f69ef2ac43ddb227f3e520f3243e |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 5e761892164c450c8d4a99d463ab43e9 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 6b5588b212c34cc5827ed54ed1423ea8 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 5e761892164c450c8d4a99d463ab43e9 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | b714dd6a6acb4087a73a09f01f8dddf2 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 5e761892164c450c8d4a99d463ab43e9 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+

》》安装和配置组件
1.安装软件包

[root@controller ~]# yum install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler

2.编辑/etc/nova/nova.conf文件,完成如下操作

# 在[DEFAULT]部分,只启用计算和元数据api
[DEFAULT]
# ...
enabled_apis = osapi_compute,metadata
# 在[api_database]和[database]部分,配置数据库访问
[api_database]
# ...
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api

[database]
# ...
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova
# 使用为Compute数据库创建的密码替换NOVA_DBPASS
# 在[DEFAULT]部分,配置RabbitMQ消息队列访问
[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/
# 使用RabbitMQ中openstack帐户的密码替换“RABBIT_PASS”
# 在[api]和[keystone_authtoken]部分中,配置Identity服务访问
[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
# 用您在Identity服务中为nova用户选择的密码替换NOVA_PASS
# 在[DEFAULT]部分,配置my_ip选项以使用控制节点的管理接口IP地址
[DEFAULT]
# ...
my_ip = 192.168.43.11

配置/etc/nova/nova.conf文件中的[neutron]章节

# 在“[vnc]”部分,配置vnc代理使用控制节点的管理接口IP地址
[vnc]
enabled = true
# ...
server_listen = $my_ip
server_proxyclient_address = $my_ip
# 在[glance]部分中,配置Image服务API的位置
[glance]
# ...
api_servers = http://controller:9292
# 在[oslo_concurrency]部分配置锁路径
[oslo_concurrency]
# ...
lock_path = /var/lib/nova/tmp
# 在[placement]部分中,配置对placement服务的访问
[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替换为安装placement时创建的放置服务用户选择的密码

3.同步nova-api数据库

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

4.注册cell0数据库

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

5.创建cell1单元格

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

6.同步nova数据库

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

7.检查nova cell0和cell1是否正确注册

[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 | 491bdda4-16d5-47f2-967e-8d0c897c4a96 | rabbit://openstack:****@controller:5672/ |    mysql+pymysql://nova:****@controller/nova    |  False   |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+

》》完成安装

# 启动Compute服务,并将其配置为系统启动时启动
[root@controller ~]# systemctl enable \
> openstack-nova-api.service \
> openstack-nova-scheduler.service \
> openstack-nova-conductor.service \
> openstack-nova-novncproxy.service

[root@controller ~]# systemctl start \
> openstack-nova-api.service \
> openstack-nova-scheduler.service \
> openstack-nova-conductor.service \
> openstack-nova-novncproxy.service

》》》安装和配置计算节点

如果需要配置其他计算节点,请以类似于示例架构一节中的第一个计算节点的方式准备它们。每个额外的计算节点需要一个唯一的IP地址。

》》安装和配置组件
1.安装软件包

[root@compute ~]# yum install openstack-nova-compute

2.编辑/etc/nova/nova.conf文件,完成如下操作

# 在[DEFAULT]部分,只启用计算和元数据api
[DEFAULT]
# ...
enabled_apis = osapi_compute,metadata
# 在“[DEFAULT]”中配置RabbitMQ消息队列访问
[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller
# 使用RabbitMQ中openstack帐户的密码替换“RABBIT_PASS”
# 在[api]和[keystone_authtoken]部分中,配置Identity服务访问
[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
# 用您在Identity服务中为nova用户选择的密码替换NOVA_PASS
# 在[DEFAULT]部分,配置my_ip选项
[DEFAULT]
# ...
my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
# 用计算节点上管理网络接口的IP地址替换MANAGEMENT_INTERFACE_IP_ADDRESS

配置/etc/nova/nova.conf文件中的[neutron]章节

# 在[vnc]部分中,启用和配置远程控制台访问
[vnc]
# ...
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
# 服务器组件监听所有IP地址,代理组件只监听计算节点的管理接口IP地址。base URL表示您可以使用web浏览器访问该计算节点上实例的远程控制台的位置。
# 在[glance]部分中,配置Image服务API的位置
[glance]
# ...
api_servers = http://controller:9292
# 在[oslo_concurrency]部分配置锁路径
[oslo_concurrency]
# ...
lock_path = /var/lib/nova/tmp
# 在[placement]部分中,配置placement API
[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替换为您为Identity服务中的放置用户选择的密码

》》完成安装
1.确定您的计算节点是否支持虚拟机硬件加速

[root@compute ~]# egrep -c '(vmx|svm)' /proc/cpuinfo
2
# 如果此命令返回一个或更大的值,则计算节点支持硬件加速,通常不需要额外配置。
# 如果该命令返回值为0,则说明计算节点不支持硬件加速,必须将libvirt配置为使用QEMU而不是KVM。
# 编辑/etc/nova/nova.conf文件中的[libvirt]部分
[libvirt]
# ...
virt_type = qemu

2.启动Compute服务,包括它的依赖项,并将它们配置为在系统启动时自动启动

[root@compute ~]# systemctl enable libvirtd.service openstack-nova-compute.service
[root@compute ~]# systemctl start libvirtd.service openstack-nova-compute.service
# 如果启动时报错,无法启动成功;查看启动日志/var/log/messages
[root@compute ~]# tail /var/log/messages
Aug 27 01:43:03 compute nova-compute[5711]: oslo_config.cfg.ConfigFilesPermissionDeniedError: Failed to open some config files: /etc/nova/nova.conf
Aug 27 01:43:03 compute systemd[1]: openstack-nova-compute.service: Main process exited, code=exited, status=1/FAILURE
Aug 27 01:43:03 compute systemd[1]: openstack-nova-compute.service: Failed with result 'exit-code'.
Aug 27 01:43:03 compute systemd[1]: Failed to start OpenStack Nova Compute Server.
Aug 27 01:43:03 compute systemd[1]: openstack-nova-compute.service: Service RestartSec=100ms expired, scheduling restart.
Aug 27 01:43:03 compute systemd[1]: openstack-nova-compute.service: Scheduled restart job, restart counter is at 5.
Aug 27 01:43:03 compute systemd[1]: Stopped OpenStack Nova Compute Server.
Aug 27 01:43:03 compute systemd[1]: openstack-nova-compute.service: Start request repeated too quickly.
Aug 27 01:43:03 compute systemd[1]: openstack-nova-compute.service: Failed with result 'exit-code'.
Aug 27 01:43:03 compute systemd[1]: Failed to start OpenStack Nova Compute Server.

注意:oslo_config.cfg.ConfigFilesPermissionDeniedError: Failed to open some config files: /etc/nova/nova.conf

然后执行:
[root@compute ~]# chown -R nova:nova /etc/nova/nova.conf
[root@compute ~]# systemctl start libvirtd.service openstack-nova-compute.service
[root@compute ~]# systemctl status libvirtd.service openstack-nova-compute.service

● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2021-08-27 01:42:57 CST; 3min 48s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 5618 (libvirtd)
    Tasks: 21 (limit: 32768)
   Memory: 68.6M
   CGroup: /system.slice/libvirtd.service
           ├─1632 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
           ├─1633 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
           └─5618 /usr/sbin/libvirtd --timeout 120

● openstack-nova-compute.service - OpenStack Nova Compute Server
   Loaded: loaded (/usr/lib/systemd/system/openstack-nova-compute.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-08-27 01:43:57 CST; 2min 47s ago
 Main PID: 5751 (nova-compute)
    Tasks: 22 (limit: 49190)
   Memory: 128.3M
   CGroup: /system.slice/openstack-nova-compute.service
           └─5751 /usr/bin/python3 /usr/bin/nova-compute

Aug 27 01:43:55 compute systemd[1]: Starting OpenStack Nova Compute Server...
Aug 27 01:43:57 compute systemd[1]: Started OpenStack Nova Compute Server.

》将计算节点添加到单元数据库

# 注意:此过程需要在控制节点执行

1.获取管理员凭据以启用仅限admin的CLI命令,然后确认数据库中有计算主机

[root@controller ~]# . admin-openrc
[root@controller ~]# openstack compute service list --service nova-compute
+----+--------------+---------+------+---------+-------+----------------------------+
| ID | Binary       | Host    | Zone | Status  | State | Updated At                 |
+----+--------------+---------+------+---------+-------+----------------------------+
|  6 | nova-compute | compute | nova | enabled | up    | 2021-08-26T17:50:44.000000 |
+----+--------------+---------+------+---------+-------+----------------------------+

2.发现计算主机

[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': 491bdda4-16d5-47f2-967e-8d0c897c4a96
Checking host mapping for compute host 'compute': a066e69b-2836-4bd8-ab24-ce9bd09c223b
Creating host mapping for compute host 'compute': a066e69b-2836-4bd8-ab24-ce9bd09c223b
Found 1 unmapped computes in cell: 491bdda4-16d5-47f2-967e-8d0c897c4a96
# 注意:新增计算节点时,需要在控制节点上执行nova-manage cell_v2 discover_hosts命令进行注册。或者,可以在/etc/nova/nova.conf中设置适当的时间间隔:
[scheduler]
discover_hosts_in_cells_interval = 300

》》校验操作

# 需要在控制节点执行,验证Compute服务的操作

1.获取admin凭据以获得对admin-only CLI命令的访问权限

[root@controller ~]# . admin-openrc

2.列出服务组件,以验证每个流程是否成功启动和注册

[root@controller ~]# openstack compute service list
+----+----------------+------------+----------+---------+-------+----------------------------+
| ID | Binary         | Host       | Zone     | Status  | State | Updated At                 |
+----+----------------+------------+----------+---------+-------+----------------------------+
|  1 | nova-conductor | controller | internal | enabled | up    | 2021-08-26T17:58:14.000000 |
|  5 | nova-scheduler | controller | internal | enabled | up    | 2021-08-26T17:58:15.000000 |
|  6 | nova-compute   | compute    | nova     | enabled | up    | 2021-08-26T17:58:14.000000 |
+----+----------------+------------+----------+---------+-------+----------------------------+
# 此输出应该指示控制节点上启用的两个服务组件和计算节点上启用的一个服务组件

3.列出Identity服务中的API端点,以验证与Identity服务的连接性

[root@controller ~]# openstack catalog list
+-----------+-----------+-----------------------------------------+
| Name      | Type      | Endpoints                               |
+-----------+-----------+-----------------------------------------+
| placement | placement | RegionOne                               |
|           |           |   internal: http://controller:8778      |
|           |           | RegionOne                               |
|           |           |   public: http://controller:8778        |
|           |           | RegionOne                               |
|           |           |   admin: http://controller:8778         |
|           |           |                                         |
| keystone  | identity  | RegionOne                               |
|           |           |   admin: http://controller:5000/v3/     |
|           |           | RegionOne                               |
|           |           |   public: http://controller:5000/v3/    |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:5000/v3/  |
|           |           |                                         |
| nova      | compute   | RegionOne                               |
|           |           |   internal: http://controller:8774/v2.1 |
|           |           | RegionOne                               |
|           |           |   admin: http://controller:8774/v2.1    |
|           |           | RegionOne                               |
|           |           |   public: http://controller:8774/v2.1   |
|           |           |                                         |
| glance    | image     | RegionOne                               |
|           |           |   internal: http://controller:9292      |
|           |           | RegionOne                               |
|           |           |   public: http://controller:9292        |
|           |           | RegionOne                               |
|           |           |   admin: http://controller:9292         |
|           |           |                                         |
+-----------+-----------+-----------------------------------------+

4.列出Image服务中的镜像,以验证与Image服务的连通性

[root@controller ~]# openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 40e4710c-fce3-49ee-86a8-deefea51ff53 | cirros | active |
+--------------------------------------+--------+--------+

5.检查Cells和placement API是否成功工作,以及其他必要的先决条件是否到位

[root@controller ~]# nova-status upgrade check
+-------------------------------------------+
| Upgrade Check Results                     |
+-------------------------------------------+
| Check: Cells v2                           |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Placement API                      |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Ironic Flavor Migration            |
| 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                             |
+-------------------------------------------+
# 注意:执行该过程如果有如下报错,请执行以下步骤,否则请忽略该信息
Error:
......
keystoneauth1.exceptions.http.Forbidden: Forbidden (HTTP 403)

# 解决办法为编辑/etc/httpd/conf.d/00-placement-api.conf,在文件末尾添加以下内容
<Directory /usr/bin>
   <IfVersion >= 2.4>
      Require all granted
   </IfVersion>
   <IfVersion < 2.4>
      Order allow,deny
      Allow from all
   </IfVersion>
</Directory>

》Neutron Installation 网络服务

》》网络服务概述

neutron (OpenStack network)支持创建和挂载其他OpenStack服务管理的接口设备到网络中。可实现插件以适应不同的组网设备和软件,为OpenStack架构和部署提供灵活性。
它包括以下组成部分:

# neutron-server
接受并将API请求路由到适当的OpenStack Networking插件以进行操作
# OpenStack Networking plug-ins and agents
插拔端口,创建网络或子网,并提供IP地址。这些插件和代理根据特定云中使用的供应商和技术而有所不同。OpenStack网络附带了Cisco虚拟和物理交换机、NEC OpenFlow产品、Open vSwitch、Linux桥接和VMware NSX产品的插件和代理
常见的代理有L3 (layer 3)、DHCP (dynamic host IP address)和插件代理
# Messaging queue
用于大多数OpenStack网络安装,在中子服务器和各种代理之间路由信息。还充当数据库,用于存储特定插件的网络状态

OpenStack network主要与OpenStack Compute进行交互,为其实例提供网络和连接

》》网络 (neutron) 的概念

OpenStack Networking (neutron) 管理虚拟网络基础设施 (VNI) 的所有网络方面以及 OpenStack 环境中物理网络基础设施 (PNI) 的访问层方面。 OpenStack Networking 使项目能够创建高级虚拟网络拓扑,其中可能包括防火墙和虚拟专用网络 (VPN) 等服务。

网络提供网络、子网和路由器作为对象抽象。 每个抽象都有模仿其物理对应物的功能:网络包含子网,路由器在不同的子网和网络之间路由流量。

任何给定的网络设置至少有一个外部网络。 与其他网络不同,外部网络不仅仅是一个虚拟定义的网络。 相反,它代表了在 OpenStack 安装之外可访问的物理外部网络的一部分的视图。 外部网络上的 IP 地址可以被外部网络上的任何人访问。

除了外部网络,任何网络设置都有一个或多个内部网络。 这些软件定义的网络直接连接到 VM。 只有任何给定内部网络上的虚拟机,或通过接口连接到类似路由器的子网上的虚拟机,才能直接访问连接到该网络的虚拟机。

对于外部网络访问虚拟机,反之亦然,网络之间需要路由器。 每个路由器有一个网关连接到外部网络和一个或多个接口连接到内部网络。 与物理路由器一样,子网可以访问连接到同一路由器的其他子网上的机器,机器可以通过路由器的网关访问外部网络。

此外,可以将外部网络上的 IP 地址分配给内部网络上的端口。 每当某物连接到子网时,该连接称为端口。 您可以将外部网络 IP 地址与端口关联到虚拟机。 这样,外部网络上的实体就可以访问 VM。

网络还支持安全组。 安全组使管理员能够在组中定义防火墙规则。 一台虚拟机可以属于一个或多个安全组,网络应用这些安全组中的规则来阻止或取消阻止该虚拟机的端口、端口范围或流量类型。

Networking 使用的每个插件都有自己的概念。 虽然对于操作 VNI 和 OpenStack 环境并不重要,但理解这些概念可以帮助设置网络。 所有网络安装都使用核心插件和安全组插件(或仅使用 No-Op 安全组插件)。 此外,还提供防火墙即服务 (FWaaS)。

》》》安装和配置控制节点

1.创建数据库

# 创建neutron数据库
[root@controller ~]# mysql -u root -p
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 'NEUTRON_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> exit;
Bye

2.获取管理员凭据以获得对仅限admin的CLI命令的访问权

[root@controller ~]# . admin-openrc

3.创建neutron用户,并赋予用户管理权限

[root@controller ~]# openstack user create --domain default --password-prompt neutron
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 3f58c350042b483d87bb5c1b874bb238 |
| name                | neutron                          |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

[root@controller ~]# openstack role add --project service --user neutron admin
# 创建neutron实体
[root@controller ~]# openstack service create --name neutron --description "OpenStack Networking" network
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Networking             |
| enabled     | True                             |
| id          | 7b4ea9da2b934fedb7c56c2c30cf08c8 |
| name        | neutron                          |
| type        | network                          |
+-------------+----------------------------------+

4.创建Networking服务API端点

[root@controller ~]# openstack endpoint create --region RegionOne network public http://controller:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | e8f49ccfca1a4db492626ce7195befd1 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 7b4ea9da2b934fedb7c56c2c30cf08c8 |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne network internal http://controller:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 7471bdf70b104cf3b2d97424bd743d0a |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 7b4ea9da2b934fedb7c56c2c30cf08c8 |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne network admin http://controller:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 352b0db3b5a1428fb508da5882a4877e |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 7b4ea9da2b934fedb7c56c2c30cf08c8 |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

》》配置网络选项
配置和部署自助服务网络,演示用户或其他无特权用户可以管理自助服务网络,包括在自助服务网络和提供商网络之间提供连接的路由器。此外,浮动IP地址提供从外部网络(如Internet)到使用自助网络的实例的连接。这里也可以部署提供商网络,注意的是自助服务网络中的实例也可以附加到提供商网络中,参考以下提供商网络链接:https://docs.openstack.org/neutron/victoria/install/controller-install-option1-rdo.html

自助服务网络通常使用覆盖网络。覆盖网络协议,如VXLAN,包括额外的头,增加开销和减少可用的负载或用户数据空间。在不了解虚拟网络基础设施的情况下,实例尝试使用缺省的1500字节的以太网最大传输单元(MTU)发送数据包。Networking服务通过DHCP自动提供正确的MTU值给实例。但是,有些云镜像不使用DHCP或忽略DHCP MTU选项,需要使用元数据或脚本进行配置。

》》自助网络配置

# 在控制节点上安装和配置组网组件

安装组件

[root@controller ~]# yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables

配置服务器组件
编辑/etc/neutron/neutron.conf文件,完成如下操作

# 在[database]部分,配置数据库访问
[database]
# ...
connection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron
# 用为数据库选择的密码替换NEUTRON_DBPASS
# 在[DEFAULT]部分,启用ML2 (Modular Layer 2)插件、路由器服务和重叠IP地址
[DEFAULT]
# ...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
# 在“[DEFAULT]”中配置RabbitMQ消息队列访问
[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller
# 使用RabbitMQ中openstack帐户的密码替换“RABBIT_PASS”
# 在[DEFAULT]和[keystone_authtoken]节中,配置Identity服务访问
[DEFAULT]
# ...
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 = NEUTRON_PASS
# 用在Identity服务中为neutron用户选择的密码替换NEUTRON_PASS
# 在[DEFAULT]和[nova]部分,配置Networking以通知Compute网络拓扑的变化
[DEFAULT]
# ...
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true

[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
# 用在Identity服务中为nova用户选择的密码替换NOVA_PASS
# 在[oslo_concurrency]部分配置锁路径
[oslo_concurrency]
# ...
lock_path = /var/lib/neutron/tmp

配置模块化层2 (ML2)插件
ML2插件使用Linux桥接机制为实例构建第2层(桥接和交换)虚拟网络基础设施。
编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件并完成以下操作

# 在[ml2]区域中启用平面网络、VLAN网络和VXLAN网络
[ml2]
# ...
type_drivers = flat,vlan,vxlan
# 在“[ml2]”中启用VXLAN自助服务网络
[ml2]
# ...
tenant_network_types = vxlan
# 在[ml2]部分中,启用Linux桥接和第二层填充机制
[ml2]
# ...
mechanism_drivers = linuxbridge,l2population
# 在[ml2]部分中,启用端口安全扩展驱动程序
[ml2]
# ...
extension_drivers = port_security
# 在[ml2_type_flat]部分中,将提供者虚拟网络配置为扁平网络
[ml2_type_flat]
# ...
flat_networks = provider
[ml2_type_vxlan]部分配置自助服务网络的VXLAN网络标识范围
# [ml2_type_vxlan]
# ...
vni_ranges = 1:1000
# 在“[securitygroup]”区域,开启ipset功能,提高安全组规则的效率
[securitygroup]
# ...
enable_ipset = true

配置Linux网桥代理
Linux桥接代理为实例构建第2层(桥接和交换)虚拟网络基础设施,并处理安全组。
编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件,完成以下操作

# 在[linux_bridge]部分中,将提供者虚拟网络映射到提供者物理网络接口
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME
# 将PROVIDER_INTERFACE_NAME替换为底层提供者物理网络接口的名称
# 在[vxlan]部分,启用vxlan覆盖网络,配置处理覆盖网络的物理网络接口的IP地址,并启用二层填充功能
[vxlan]
enable_vxlan = true
local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = true
#将OVERLAY_INTERFACE_IP_ADDRESS替换为处理覆盖网络的底层物理网络接口的IP地址。请将“OVERLAY_INTERFACE_IP_ADDRESS”替换为控制节点的管理IP地址。
# 在“[securitygroup]”区域开启安全组并配置Linux bridge iptables防火墙驱动
[securitygroup]
# ...
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
# 确保您的Linux操作系统内核支持网桥过滤器,通过验证以下sysctl的所有值都设置为1
[root@controller ~]# sysctl -n net.bridge.bridge-nf-call-iptables
1
[root@controller ~]# sysctl -n net.bridge.bridge-nf-call-ip6tables
1
# 注意:如果没有这两项,就需要手动加载br_netfilter,否则忽略该信息
[root@controller ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@controller ~]# modprobe br_netfilter
# 要启用网络桥接支持,通常需要加载br_netfilter内核模块。

配置三层代理
L3 (Layer-3) agent为自助虚拟网络提供路由和NAT服务。
编辑/etc/neutron/l3_agent.ini文件,完成如下操作

# 在“[DEFAULT]”中配置Linux桥接接口驱动
[DEFAULT]
# ...
interface_driver = linuxbridge

配置DHCP代理
DHCP代理为虚拟网络提供DHCP服务
编辑/etc/neutron/dhcp_agent.ini文件,完成如下操作

# 在“[DEFAULT]”中配置Linux桥接接口驱动、Dnsmasq DHCP驱动,并开启隔离元数据,使提供商网络上的实例可以通过网络访问元数据
[DEFAULT]
# ...
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true

》》配置元数据代理
元数据代理向实例提供凭证等配置信息。
编辑/etc/neutron/metadata_agent.ini文件,完成如下操作

# 在[DEFAULT]部分,配置元数据主机和共享秘密
[DEFAULT]
# ...
nova_metadata_host = controller
metadata_proxy_shared_secret = METADATA_SECRET
# 将METADATA_SECRET替换为元数据代理的合适秘密

》》配置Compute服务以使用Networking服务
编辑/etc/nova/nova.conf文件

# 在“[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 = NEUTRON_PASS
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET
# 用您在Identity服务中为neutron用户选择的密码替换NEUTRON_PASS
# 用为元数据代理选择的秘密替换METADATA_SECRET

》》完成安装
1.Networking服务初始化脚本需要一个符号链接/etc/neutron/plugin.ini指向ML2插件配置文件/etc/neutron/plugins/ml2/ml2_conf.ini。如果这个符号链接不存在,使用以下命令创建它。

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

2.同步数据库

[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
......
  OK

3.重启Compute API服务

[root@controller ~]# systemctl restart openstack-nova-api.service

4.启动Networking服务,并将它们配置为在系统启动时启动

[root@controller ~]# systemctl enable \
> neutron-server.service \
> neutron-linuxbridge-agent.service \
> neutron-dhcp-agent.service \
> neutron-metadata-agent.service

[root@controller ~]# systemctl start \
> neutron-server.service \
> neutron-linuxbridge-agent.service \
> neutron-dhcp-agent.service \
> neutron-metadata-agent.service

对于其他网络选项,也启用并启动三层服务

[root@controller ~]# systemctl enable neutron-l3-agent.service
[root@controller ~]# systemctl start neutron-l3-agent.service

》》》安装和配置计算节点

计算节点处理实例的连接和安全组。

》》安装组件

[root@compute ~]# yum install openstack-neutron-linuxbridge ebtables ipset

》》配置组件
Networking公共组件配置包括身份验证机制、消息队列和插件。
编辑/etc/neutron/neutron.conf文件

# 计算节点不直接访问数据库
# 在[DEFAULT]部分,配置RabbitMQ消息队列访问

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

# 使用RabbitMQ中openstack帐户的密码替换“RABBIT_PASS”
# 在[DEFAULT]和[keystone_authtoken]节中,配置Identity服务访问

[DEFAULT]
# ...
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 = NEUTRON_PASS

# 用您在Identity服务中为neutron用户选择的密码替换NEUTRON_PASS
# 在[oslo_concurrency]部分配置锁路径

[oslo_concurrency]
# ...
lock_path = /var/lib/neutron/tmp

》》配置网络选项

选择与为控制节点选择的相同的网络选项,以配置特定于控制节点的服务。

》》配置Linux网桥代理
Linux桥接代理为实例构建第2层(桥接和交换)虚拟网络基础设施,并处理安全组。
编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件

# 在[linux_bridge]部分中,将提供者虚拟网络映射到提供者物理网络接口

[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

# 将PROVIDER_INTERFACE_NAME替换为底层提供者物理网络接口的名称
# 在[vxlan]部分,启用vxlan覆盖网络,配置处理覆盖网络的物理网络接口的IP地址,并启用二层填充功能

[vxlan]
enable_vxlan = true
local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = true

# 将OVERLAY_INTERFACE_IP_ADDRESS替换为处理覆盖网络的底层物理网络接口的IP地址。请将“OVERLAY_INTERFACE_IP_ADDRESS”替换为计算节点的管理IP地址。
# 在“[securitygroup]”区域开启安全组并配置Linux bridge iptables防火墙驱动

[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
# 确保您的Linux操作系统内核支持网桥过滤器,请验证以下所有sysctl值都设置为1

[root@controller ~]# sysctl -n net.bridge.bridge-nf-call-iptables
1
[root@controller ~]# sysctl -n net.bridge.bridge-nf-call-ip6tables
1

# 注意:如果没有这两项,就需要手动加载br_netfilter,否则忽略该信息

[root@controller ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@controller ~]# modprobe br_netfilter

# 要启用网络桥接支持,通常需要加载br_netfilter内核模块。

》》配置Compute服务以使用Networking服务
编辑/etc/nova/nova.conf文件

# 在“[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 = NEUTRON_PASS
# 用您在Identity服务中为neutron用户选择的密码替换NEUTRON_PASS

》》完成安装

# 重启Compute服务

[root@compute ~]# systemctl restart openstack-nova-compute.service
# 启动Linux桥接代理,并将其配置为在系统引导时启动

[root@compute ~]# systemctl enable neutron-linuxbridge-agent.service
[root@compute ~]# systemctl start neutron-linuxbridge-agent.service

》》》校验安装

# 请在控制节点上执行
# 获取管理员凭据以获得对仅限admin的CLI命令的访问权

[root@controller ~]# . admin-openrc

# 列出加载的扩展扩展,以验证成功neutron-server服务器进程

[root@controller ~]# openstack extension list --network

+---------------------------+---------------------------+----------------------------+
| Name                      | Alias                     | Description                |
+---------------------------+---------------------------+----------------------------+
| Default Subnetpools       | default-subnetpools       | Provides ability to mark   |
|                           |                           | and use a subnetpool as    |
|                           |                           | the default                |
| Availability Zone         | availability_zone         | The availability zone      |
|                           |                           | extension.                 |
| Network Availability Zone | network_availability_zone | Availability zone support  |
|                           |                           | for network.               |
| Port Binding              | binding                   | Expose port bindings of a  |
|                           |                           | virtual port to external   |
|                           |                           | application                |
| agent                     | agent                     | The agent management       |
|                           |                           | extension.                 |
| Subnet Allocation         | subnet_allocation         | Enables allocation of      |
|                           |                           | subnets from a subnet pool |
| DHCP Agent Scheduler      | dhcp_agent_scheduler      | Schedule networks among    |
|                           |                           | dhcp agents                |
| Neutron external network  | external-net              | Adds external network      |
|                           |                           | attribute to network       |
|                           |                           | resource.                  |
| Neutron Service Flavors   | flavors                   | Flavor specification for   |
|                           |                           | Neutron advanced services  |
| Network MTU               | net-mtu                   | Provides MTU attribute for |
|                           |                           | a network resource.        |
| Network IP Availability   | network-ip-availability   | Provides IP availability   |
|                           |                           | data for each network and  |
|                           |                           | subnet.                    |
| Quota management support  | quotas                    | Expose functions for       |
|                           |                           | quotas management per      |
|                           |                           | tenant                     |
| Provider Network          | provider                  | Expose mapping of virtual  |
|                           |                           | networks to physical       |
|                           |                           | networks                   |
| Multi Provider Network    | multi-provider            | Expose mapping of virtual  |
|                           |                           | networks to multiple       |
|                           |                           | physical networks          |
| Address scope             | address-scope             | Address scopes extension.  |
| Subnet service types      | subnet-service-types      | Provides ability to set    |
|                           |                           | the subnet service_types   |
|                           |                           | field                      |
| Resource timestamps       | standard-attr-timestamp   | Adds created_at and        |
|                           |                           | updated_at fields to all   |
|                           |                           | Neutron resources that     |
|                           |                           | have Neutron standard      |
|                           |                           | attributes.                |
| Neutron Service Type      | service-type              | API for retrieving service |
| Management                |                           | providers for Neutron      |
|                           |                           | advanced services          |
| resources: subnet,        |                           | more L2 and L3 resources.  |
| subnetpool, port, router  |                           |                            |
| Neutron Extra DHCP opts   | extra_dhcp_opt            | Extra options              |
|                           |                           | configuration for DHCP.    |
|                           |                           | For example PXE boot       |
|                           |                           | options to DHCP clients    |
|                           |                           | can be specified (e.g.     |
|                           |                           | tftp-server, server-ip-    |
|                           |                           | address, bootfile-name)    |
| Resource revision numbers | standard-attr-revisions   | This extension will        |
|                           |                           | display the revision       |
|                           |                           | number of neutron          |
|                           |                           | resources.                 |
| Pagination support        | pagination                | Extension that indicates   |
|                           |                           | that pagination is         |
|                           |                           | enabled.                   |
| Sorting support           | sorting                   | Extension that indicates   |
|                           |                           | that sorting is enabled.   |
| security-group            | security-group            | The security groups        |
|                           |                           | extension.                 |
| RBAC Policies             | rbac-policies             | Allows creation and        |
|                           |                           | modification of policies   |
|                           |                           | that control tenant access |
|                           |                           | to resources.              |
| standard-attr-description | standard-attr-description | Extension to add           |
|                           |                           | descriptions to standard   |
|                           |                           | attributes                 |
| Port Security             | port-security             | Provides port security     |
| Allowed Address Pairs     | allowed-address-pairs     | Provides allowed address   |
|                           |                           | pairs                      |
| project_id field enabled  | project-id                | Extension that indicates   |
|                           |                           | that project_id field is   |
|                           |                           | enabled.                   |
+---------------------------+---------------------------+----------------------------+

可以使用neutron-sanity-check命令行客户端对网络进行进一步测试

#  列出加载的扩展扩展,以验证成功neutron-server陈工启动

[root@controller ~]# openstack network agent list
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host       | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| 0ae18972-7b24-4a16-be70-ff86cc15bafc | Metadata agent     | controller | None              | :-)   | UP    | neutron-metadata-agent    |
| 1059d1e0-35e4-49b4-be7d-a7aed7872484 | L3 agent           | controller | nova              | :-)   | UP    | neutron-l3-agent          |
| 24445b9f-2aaf-48d3-a640-c9cb4e45748b | DHCP agent         | controller | nova              | :-)   | UP    | neutron-dhcp-agent        |
| 25c83d80-cca6-42cb-b1ec-19062030b56f | Linux bridge agent | compute    | None              | :-)   | UP    | neutron-linuxbridge-agent |
| 525cf831-f7a5-49f9-b8c4-6f284ddfaa86 | Linux bridge agent | controller | None              | :-)   | UP    | neutron-linuxbridge-agent |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

# 输出应该表明控制节点上有四个代理,每个计算节点上有一个代理。

》Dashboard Installation 仪表板

在控制节点安装和配置dashboard,仪表板所需的唯一核心服务是Identity服务。可以将仪表板与其他服务(如Image服务、Compute和Networking)结合使用。还可以在具有独立服务(如Object Storage)的环境中使用仪表板。
本安装使用Apache HTTP服务器和Memcached服务正确安装、配置和操作Identity服务。

》》安装和配置

1.安装软件包

[root@controller ~]# yum install openstack-dashboard

2.编辑/etc/openstack-dashboard/local_settings文件

# 配置dashboard使用控制节点OpenStack服务
OPENSTACK_HOST = "controller"
# 允许您的主机访问仪表板
ALLOWED_HOSTS = ['*']
# ALLOWED_HOSTS也可以是[' * ']接受所有主机。这可能对开发工作有用,但可能不安全,不应该在生产中使用。
# 配置memcached会话存储服务
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {
    'default': {
         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
         'LOCATION': 'controller:11211',
    }
}
# 启用Identity API版本3
OPENSTACK_KEYSTONE_URL = "http://%s/identity/v3" % OPENSTACK_HOST
# 启用对域的支持
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
# 配置API版本
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 3,
}
# 将Default配置为您通过仪表板创建的用户的默认域
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"
# 将user配置为你通过仪表板创建的用户的默认角色
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
# 可以选择配置时区
TIME_ZONE = "TIME_ZONE"
# 用适当的时区标识符替换TIME_ZONE

3.编辑文件/etc/httpd/conf.d/openstack-dashboard.conf

[root@controller ~]# vim /etc/httpd/conf.d/openstack-dashboard.conf

WSGIDaemonProcess dashboard
WSGIProcessGroup dashboard
WSGISocketPrefix run/wsgi
WSGIApplicationGroup %{GLOBAL}

WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
Alias /dashboard/static /usr/share/openstack-dashboard/static

<Directory /usr/share/openstack-dashboard/openstack_dashboard/wsgi>
  Options All
  AllowOverride All
  Require all granted
</Directory>

<Directory /usr/share/openstack-dashboard/static>
  Options All
  AllowOverride All
  Require all granted
</Directory>

4.编辑以下文件,并找到WEBROOT=‘/’ ,改为WEBROOT=‘/dashboard’

[root@controller ~]# vim /usr/share/openstack-dashboard/openstack_dashboard/defaults.py
[root@controller ~]# vim /usr/share/openstack-dashboard/openstack_dashboard/test/settings.py

》》完成安装

# 重启web服务器和会话存储服务
[root@controller ~]# systemctl restart httpd.service memcached.service

》》验证安装

验证dashboard的操作。
使用浏览器访问dashboard http://controller/dashboard
使用管理员admin或演示用户demo和默认域default凭据进行身份验证。

在这里插入图片描述

在这里插入图片描述

》Block Storage Installation 块存储服务

》》配置和安装

块存储服务(cinder)为来宾实例提供块存储设备。 供应和使用存储的方法由块存储驱动程序或在多后端配置情况下的驱动程序决定。 有多种可用的驱动程序:NAS/SAN、NFS、iSCSI、Ceph 等。

块存储 API 和调度程序服务通常在控制器节点上运行。 根据使用的驱动程序,卷服务可以在控制器节点、计算节点或独立存储节点上运行。

》》Cinder Block存储服务概述

OpenStack Cinder为虚拟机添加持久化存储。块存储提供卷管理的基础设施,并与OpenStack计算交互,为实例提供卷。该服务还支持卷快照和卷类型的管理。

块存储服务由以下组件组成:
# cinder-api
接受API请求,并将它们路由到cinder-volume进行操作。

# cinder-volume
直接与块存储服务和进程(如cinder-scheduler)交互。它还通过消息队列与这些进程交互。cinder-volume服务响应向块存储服务发送的读写请求,以维持状态。它可以通过驱动程序架构与各种存储提供商进行交互。

# cinder-scheduler daemon
选择要在其上创建卷的最佳存储提供程序节点。与nova-scheduler类似的组件。

# cinder-backup daemon
cinder-backup服务为备份存储提供商提供任意类型的备份卷。与cinder-volume服务一样,它可以通过驱动程序架构与各种存储提供商进行交互。

# Messaging queue
块存储进程之间的路由信息。

》》将Cinder添加到OpenStack环境

# 本配置只引用一个本地块存储设备为空的存储节点。指令使用/dev/sdb,可以根据实际环境为特定的节点替换一个不同的值。
# 该服务使用LVM驱动程序在该设备上提供逻辑卷,并通过iSCSI传输将它们提供给实例。

》》安装和配置控制节点

# 在控制节点上安装和配置块存储服务(cinder)。该服务需要至少一个额外的存储节点为实例提供卷。

1.创建数据库

# 创建cinder数据库,并为数据库设置访问权限

[root@controller ~]# mysql -u root -p

MariaDB [(none)]> CREATE DATABASE cinder;

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

MariaDB [(none)]> flush privileges;

MariaDB [(none)]> exit;

2.获取管理员凭据以获得对仅限admin的CLI命令的访问权

[root@controller ~]# . admin-openrc

3.创建服务凭据

# 创建cinder用户

[root@controller ~]# openstack user create --domain default --password-prompt cinder
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | dd53b13df6474c3cbfac179b4197221c |
| name                | cinder                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
# 为cinder用户添加admin角色

[root@controller ~]# openstack role add --project service --user cinder admin
# 创建cinderv2和cinderv3服务实体

[root@controller ~]# openstack service create --name cinderv2 --description "Openstack Block Storage" volumev2
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Openstack Block Storage          |
| enabled     | True                             |
| id          | b4889e444d1b4334a1ef8468fb62b918 |
| name        | cinderv2                         |
| type        | volumev2                         |
+-------------+----------------------------------+

[root@controller ~]# openstack service create --name cinderv3 --description "Openstack Block Storage" volumev3
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Openstack Block Storage          |
| enabled     | True                             |
| id          | 2a455dc52bd54f28bef18abdaafcdd28 |
| name        | cinderv3                         |
| type        | volumev3                         |
+-------------+----------------------------------+

4.创建块存储服务API端点

[root@controller ~]# openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(project_id\)s
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | a8268982fefd4a74919d848246e21033         |
| interface    | public                                   |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | b4889e444d1b4334a1ef8468fb62b918         |
| service_name | cinderv2                                 |
| service_type | volumev2                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(project_id\)s
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | a9d714dc490e4361af397e2080b02441         |
| interface    | internal                                 |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | b4889e444d1b4334a1ef8468fb62b918         |
| service_name | cinderv2                                 |
| service_type | volumev2                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(project_id\)s   
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | cb9cd29faa4a4b0b832b1ba8a3ab3cec         |
| interface    | admin                                    |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | b4889e444d1b4334a1ef8468fb62b918         |
| service_name | cinderv2                                 |
| service_type | volumev2                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+


[root@controller ~]# openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v2/%\(project_id\)s
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | dacb59a475ba4a8cb318ee9a843d8e2c         |
| interface    | public                                   |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | 2a455dc52bd54f28bef18abdaafcdd28         |
| service_name | cinderv3                                 |
| service_type | volumev3                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v2/%\(project_id\)s
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 140b1b71c5c1433f9d59d0969ce10c70         |
| interface    | internal                                 |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | 2a455dc52bd54f28bef18abdaafcdd28         |
| service_name | cinderv3                                 |
| service_type | volumev3                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne volumev3 admin http://controller:8776/v2/%\(project_id\)s   
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 67b721d4608c4d3b91a6ac803818c023         |
| interface    | admin                                    |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | 2a455dc52bd54f28bef18abdaafcdd28         |
| service_name | cinderv3                                 |
| service_type | volumev3                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+

》》安装和配置组件

1.安装软件包

[root@controller ~]# yum install openstack-cinder

2.编辑/etc/cinder/cinder.conf文件,完成如下操作

# 在[database]部分,配置数据库访问

[database]
# ...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

# 将CINDER_DBPASS替换为为块存储数据库选择的密码
# 在“[DEFAULT]”中配置RabbitMQ消息队列访问

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

# 使用RabbitMQ中openstack帐户的密码替换“RABBIT_PASS”
# 在[DEFAULT]和[keystone_authtoken]节中,配置Identity服务访问

[DEFAULT]
# ...
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 = cinder
password = CINDER_PASS

# 将“CINDER_PASS”替换为Identity服务中cinder用户的密码
# 在[DEFAULT]部分,配置my_ip选项以使用控制节点的管理接口IP地址

[DEFAULT]
# ...
my_ip = 192.168.43.11

3.在[oslo_concurrency]部分配置锁路径

[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp

4.填充块存储数据库

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

》》设置计算使用块存储

1.编辑/etc/nova/nova.conf文件,增加如下内容

[cinder]
os_region_name = RegionOne

》》完成安装

1.重新启动Compute API服务

[root@controller ~]# systemctl restart openstack-nova-api.service

2.启动块存储服务,并配置为系统启动时启动

[root@controller ~]# systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
[root@controller ~]# systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service

》》安装和配置存储节点

# 在存储节点上安装和配置块存储服务前,需要准备好存储设备

1.安装配套软件包

# 安装LVM包
# CentOS8中默认已存在lvm软件包,则不需要重新安装

[root@block-storage ~]# rpm -qa | grep lvm2
lvm2-2.03.11-5.el8.x86_64
lvm2-libs-2.03.11-5.el8.x86_64
udisks2-lvm2-2.9.0-6.el8.x86_64

# 否则执行安装

[root@block-storage ~]# yum install lvm2 device-mapper-persistent-data
# 本启动只针对自行安装的lvm2
# 启动LVM元数据服务,并设置为开机自启动

[root@block-storage ~]# systemctl enable lvm2-lvmetad.service
[root@block-storage ~]# systemctl start lvm2-lvmetad.service

2.创建PV

# 根据实际环境查看磁盘设备并创建

[root@block-storage ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0   50G  0 disk
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   49G  0 part
  ├─cl-root 253:0    0   47G  0 lvm  /
  └─cl-swap 253:1    0    2G  0 lvm  [SWAP]
sdb           8:16   0   50G  0 disk
sr0          11:0    1 1024M  0 rom

[root@block-storage ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

3.创建LVM卷组

[root@block-storage ~]# vgcreate cinder-volumes /dev/sdb
  Volume group "cinder-volumes" successfully created

4.只有实例可以访问块存储卷。 但是,底层操作系统管理与卷关联的设备。 默认情况下,LVM 卷扫描工具会扫描 /dev 目录以查找包含卷的块存储设备。 如果项目在其卷上使用 LVM,扫描工具会检测这些卷并尝试缓存它们,这可能会导致底层操作系统和项目卷出现各种问题。 必须重新配置 LVM 以仅扫描包含 cinder-volumes 卷组的设备。 编辑 /etc/lvm/lvm.conf 文件并完成以下操作:

devices {
...
filter = [ "a/sdb/", "r/.*/"]

过滤器数组中的每一项都以 a 表示接受或 r 表示拒绝,并包括设备名称的正则表达式。 该数组必须以 r/.*/ 结尾以拒绝任何剩余的设备。 可以使用 vgs -vvvv 命令来测试过滤器。

》》安装和配置组件

# 安装软件包
[root@block-storage ~]# yum install openstack-cinder targetcli python3-keystone

2.编辑/etc/cinder/cinder.conf文件

# 在[database]部分,配置数据库访问

[database]
# ...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder
# 将CINDER_DBPASS替换为为块存储数据库选择的密码
# 在[DEFAULT]部分,配置RabbitMQ消息队列访问

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

# 使用RabbitMQ中openstack帐户的密码替换“RABBIT_PASS”
# 在[DEFAULT]和[keystone_authtoken]节中,配置Identity服务访问

[DEFAULT]
# ...
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 = cinder
password = CINDER_PASS

# 将“CINDER_PASS”替换为Identity服务中cinder用户的密码
# 在[DEFAULT]部分,配置my_ip选项

[DEFAULT]
# ...
my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS

# 将MANAGEMENT_INTERFACE_IP_ADDRESS替换为存储节点上的管理网络接口的IP地址
# 在[lvm]部分中,使用lvm驱动程序、cinder-volumes卷组、iSCSI协议和适当的iSCSI服务配置lvm后端。如果[lvm]部分不存在,则创建它

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
target_protocol = iscsi
target_helper = lioadm
# 在[DEFAULT]部分,启用LVM后端

[DEFAULT]
# ...
enabled_backends = lvm
# 在[DEFAULT]部分中,配置Image服务API的位置
[DEFAULT]
# ...
glance_api_servers = http://controller:9292
# 在[oslo_concurrency]部分,配置锁路径

[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp

》》完成安装

# 启动块存储卷服务,包括它的依赖项,并配置它们在系统启动时启动

[root@block-storage ~]# systemctl enable openstack-cinder-volume.service target.service
[root@block-storage ~]# systemctl start openstack-cinder-volume.service target.service

》》验证Cinder运行

# 在控制节点执行

1.获取admin凭据以获得对admin-only CLI命令的访问权限

[root@controller ~]# . admin-openrc

2.列出服务组件,以验证每个流程是否成功启动

[root@controller ~]# openstack volume service list
+------------------+-------------------+------+---------+-------+----------------------------+
| Binary           | Host              | Zone | Status  | State | Updated At                 |
+------------------+-------------------+------+---------+-------+----------------------------+
| cinder-scheduler | controller        | nova | enabled | up    | 2021-08-29T15:42:26.000000 |
| cinder-volume    | block-storage@lvm | nova | enabled | down  | 2021-08-29T15:35:19.000000 |
+------------------+-------------------+------+---------+-------+----------------------------+

》》登录仪表板

作为云终端用户,可以在管理员设置的限制范围内,使用OpenStack dashboard发放自己的资源。

1.云操作人员询问可以访问仪表板的主机名或公共IP地址,以及用户名和密码。如果云支持多域模型,还需要请求域名。
2.打开一个浏览器
3.在地址栏中输入仪表板的主机名或IP地址,例如https://ipAddressOrHostName/。本操作使用http://controller/dashboard登录。

在这里插入图片描述

4.在“登录”界面,输入用户名和密码,单击“登录”。窗口的顶部显示您的用户名。您还可以访问“设置”页签(OpenStack仪表板-设置页签)或退出仪表板。仪表板中的可见选项卡和函数取决于登录用户的访问权限或角色。
终端用户登录时,会显示“Project (OpenStack dashboard - Project)”页签和“Identity (OpenStack dashboard - Identity)”页签。
管理员登录时,会显示“Project”页签(OpenStack dashboard - Project页签)、“Admin”页签(OpenStack dashboard - Admin页签)和“Identity”页签(OpenStack dashboard - Identity页签)。

在这里插入图片描述
在这里插入图片描述
》OpenStack仪表板-项目选项卡

项目是云中的组织单元,也称为租户或帐户。每个用户都是一个或多个项目的成员。在项目中,用户创建并管理实例。

在Project选项卡中,可以查看和管理所选项目中的资源,包括实例和图像。可以从左上角的下拉菜单中选择项目。如果云支持多域模型,您也可以从这个菜单中选择域。

在这里插入图片描述
在Project选项卡中,您可以访问以下类别:

计算选项卡

概述:查看项目的报告。
实例:查看、启动、创建快照、停止、暂停或重新启动实例,或通过VNC连接到它们。
映像:查看由项目用户创建的映像和实例快照,以及任何公开可用的映像。创建、编辑和删除映像,并从映像和快照启动实例。
密钥对:查看、创建、编辑、导入和删除密钥对。
主机组:查看、创建、编辑和删除主机组

卷组选项卡

卷:查看、创建、编辑、删除卷。
快照:查看、创建、编辑、删除卷快照。
组:查看、创建、编辑、删除一致性组。
组快照:查看、创建、编辑、删除一致性组快照。

网络选项卡

网络拓扑:查看网络拓扑。
网络:创建和管理公共和私有网络。
路由:创建和管理路由器。
安全组:查看、创建、编辑、删除安全组和安全组规则。
浮动IP:为项目分配或释放IP地址。

》OpenStack 管理员页面

管理用户可以使用管理员选项卡查看使用情况,并管理实例、卷、样式、映像、网络等。
在这里插入图片描述
在管理员选项卡中,您可以访问以下类别以完成这些任务:
概况选项卡

概述:查看基本报表

计算选项卡

虚拟机管理器:查看虚拟化环境概要信息。
主机聚合:查看、创建和编辑主机聚合。查看可用分区列表。
实例:查看、暂停、恢复、挂起、迁移、软或硬重启,并删除属于部分(而不是全部)项目用户的正在运行的实例。另外,可以查看实例的日志或通过VNC访问实例。
实力类型:查看、创建、编辑、查看实例的额外规格,以及删除实例。
镜像:查看、创建、编辑和删除自定义图像的属性。

卷选项卡

卷:查看、创建、管理和删除卷。
快照:查看、管理、删除卷快照。
卷类型:查看、创建、管理、删除卷类型。
组:查看、创建、编辑、删除一致性组。
组快照:查看、创建、编辑、删除一致性组快照。
组类型:查看、创建、管理、删除组类型。

网络选项卡

网络:查看、创建、编辑和删除网络的属性。
路由器:查看、创建、编辑和删除路由器的属性。
浮动IP:为项目分配或释放IP地址。

系统选项卡

默认值:查看默认配额值。配额是在OpenStack计算中硬编码的,定义了允许使用的最大资源大小和数量。
元数据定义:导入namespace,查看元数据信息。
系统信息:可通过以下选项卡查看服务信息。
		服务:查看服务列表。
		计算服务:查看所有计算服务的列表。
		块存储服务:查看块存储服务列表。
		网络代理:查看网络代理。

》OpenStack身份管理界面
在这里插入图片描述

项目:查看、创建、分配用户、从项目中删除用户和删除项目。
用户:查看、创建、启用、禁用、删除用户。

在这里插入图片描述

点击任何页面右上角的用户下拉菜单中的“设置”按钮,你会看到“设置”选项卡。
用户设置:查看和管理仪表板设置。
修改密码:修改用户密码。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐