1
2
3
4
5
6
7
作者:李晓辉

联系方式:

微信:Lxh_Chat

邮箱:939958092@qq.com

前言

在当今数字化时代,云计算技术已成为推动企业创新和业务发展的关键力量。OpenStack作为一种开源的云计算平台,凭借其强大的灵活性、可扩展性和开源社区的支持,成为众多企业和机构构建私有云和公有云基础设施的首选方案。

OpenStack通过整合计算、存储和网络资源,为企业提供了高效、灵活的资源管理能力,使得企业能够快速部署和管理虚拟化资源,满足不断变化的业务需求。然而,OpenStack的部署并非一蹴而就,它需要经过一系列复杂而关键的步骤,其中通用服务的部署是整个OpenStack环境搭建的基础。

通用服务的部署涵盖了从基础的网络配置到关键的后端服务(如数据库、消息队列等)的搭建,每一个环节都至关重要。这些服务不仅为OpenStack的核心组件(如Nova、Neutron、Cinder等)提供了运行的基础,还确保了整个云平台的稳定性和性能。

本文将详细阐述OpenStack通用服务的部署过程,包括配置名称解析、主机名设置、关闭防火墙和SELINUX、配置NTP、启用软件仓库、安装OpenStack客户端、安装SQL数据库、配置消息队列、配置Memcached以及配置ETCD等关键步骤。通过本文的介绍,你可以系统地了解如何为OpenStack的后续部署打下坚实的基础,确保整个云平台的顺利搭建和稳定运行。

配置网络

在OpenStack中,管理网络和Provider网络是两种重要的网络类型,它们在架构和使用场景上各有特点。

管理网络

  • 定义:管理网络主要用于OpenStack内部组件之间的通信,例如,计算节点(Nova)、网络节点(Neutron)、存储节点(Cinder)等之间的通信。它确保了OpenStack服务之间的协调和管理功能能够正常运行。

  • 特点

    • 通常是一个私有网络,不直接暴露给外部用户。

    • 配置相对简单,主要关注内部服务的连通性。

    • 在部署时,管理网络的配置是基础步骤之一,确保所有OpenStack节点能够相互通信。

在部署OpenStack时,通常会配置一个管理网络,例如使用一个私有IP段(如192.168.8.0/24),并将所有OpenStack节点的管理接口连接到这个网络。

管理网络配置:

我的管理网卡网卡名称为: ens160

  1. IP: 192.168.8.10/24

  2. 网关: 192.168.8.2

  3. DNS: 223.5.5.5

配置方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat > /etc/NetworkManager/system-connections/ens160.nmconnection <<-'EOF'
[connection]
id=ens160
uuid=b1de734a-07e8-3538-8200-724c6dffd8a7
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1715837362

[ethernet]

[ipv4]
address1=192.168.8.10/24,192.168.8.2
dns=223.5.5.5;
method=manual

[ipv6]
addr-gen-mode=eui64
method=auto

[proxy]
EOF

网卡配置好之后,重启NetworkManager服务或者重启链接生效

1
systemctl restart NetworkManager

Provider网络

  • 定义:Provider网络是由OpenStack管理员创建的网络,它直接映射到数据中心的物理网络上。Provider网络允许虚拟机(VM)直接连接到外部网络,从而实现与外部世界的通信。

  • 特点

    • 直接与物理网络相连,可以使用Flat(无标签)或VLAN(带标签)类型。

    • 对于Flat类型的Provider网络,所有实例都位于同一个网络中,没有VLAN tagging。

    • 对于VLAN类型的Provider网络,可以使用VLAN ID(802.1Q tagged)在物理网络中创建多个隔离的网络。

    • 可以被多个租户共享,提供了一种灵活的方式来管理外部网络访问

Provider网络要求:

我的Provider网络网卡名称为ens224

  1. 这个网络要求没有任何有效的IP地址

  2. 重启服务器要求会自动激活接口

配置方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat > /etc/NetworkManager/system-connections/ens224.nmconnection <<-'EOF'
[connection]
id=ens224
uuid=ab11eecc-deb3-33a7-ad7e-aa081cfe8a1c
type=ethernet
autoconnect-priority=-999
interface-name=ens224
timestamp=1715865778

[ethernet]

[ipv4]
method=auto

[ipv6]
addr-gen-mode=eui64
method=auto

[proxy]
EOF

网卡配置好之后,重启NetworkManager服务或者重启链接生效

1
systemctl restart NetworkManager

配置名称解析

所有机器上都要能互相解析才可以,所以请在所有节点之间完成解析

1
2
3
4
5
6
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.10 controller
192.168.8.20 node
EOF

这里要自己测试是否能ping通各个其他节点,确保通信正常

配置主机名

1
hostnamectl hostname controller

关闭防火墙和SELINUX

1
2
3
systemctl disable firewalld --now
setenforce 0
sed -i 's/SELINUX=.*/SELINUX=permissive/' /etc/selinux/config

配置NTP

NTP的作用

在OpenStack中,NTP(网络时间协议)服务是确保整个云平台时间同步的关键组件,NTP服务在OpenStack中的主要作用是确保所有节点(包括控制节点、计算节点、网络节点等)的时间保持一致。这对于分布式系统的正常运行至关重要,因为时间不一致可能导致数据复制、事务处理等问题。例如,数据库系统需要各个节点的时间同步,以确保数据的一致性。

安装NTP

我这里安装了chrony服务做NTP同步,请允许192.168.0.0/16网段向controller同步时间

1
2
3
dnf install chrony -y
sed -i '/#allow.*/a\allow 192.168.0.0/16' /etc/chrony.conf
systemctl enable chronyd --now

验证NTP

1
2
3
4
5
6
7
[root@controller ~]# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp.wdc2.us.leaseweb.net 2 6 17 44 -13ms[ -13ms] +/- 261ms
^- makaki.miuku.net 3 6 17 44 -33ms[ -33ms] +/- 86ms
^* dns1.synet.edu.cn 1 6 17 44 +352us[ +25ms] +/- 28ms
^- ntp7.flashdance.cx 2 6 17 44 -30ms[ -30ms] +/- 165ms

启用软件仓库

这里的release版本可以参考: https://releases.openstack.org

我这里选择安装dalmatian版本,也就是2025年1月的版本

1
2
3
dnf install dnf-plugins-core epel-release -y
dnf config-manager --set-enabled crb
dnf install centos-release-openstack-dalmatian vim bash-completion -y

安装openstack客户端

1
dnf install python3-openstackclient openstack-selinux -y

安装SQL数据库

1
yum install mariadb mariadb-server python3-PyMySQL -y

准备配置文件

1
2
3
4
5
6
7
8
9
cat > /etc/my.cnf.d/openstack.cnf <<'EOF'
[mysqld]
bind-address = 192.168.8.10
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
EOF

启动数据库服务

1
systemctl enable mariadb.service --now

初始化root密码

1
2
3
4
5
6
7
8
9
10
11
mysql_secure_installation << EOF

n
y
LiXiaohui
LiXiaohui
y
n
y
y
EOF

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

stty: 'standard input': Inappropriate ioctl for device
Enter current password for root (enter for none):
stty: 'standard input': Inappropriate ioctl for device
OK, successfully used password, moving on...

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

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

Switch to unix_socket authentication [Y/n] ... skipping.

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

Change the root password? [Y/n] stty: 'standard input': Inappropriate ioctl for device
New password:
Re-enter new password:
stty: 'standard input': Inappropriate ioctl for device
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] ... 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] ... skipping.

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] - 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] ... 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!

配置消息队列

消息队列的作用

在OpenStack中,消息队列(如RabbitMQ、Qpid等)是核心组件之一,它在OpenStack架构中扮演着至关重要的角色。以下是消息队列在OpenStack中的主要作用:

1. 异步通信

消息队列允许OpenStack中的各个服务之间进行异步通信。这种异步通信机制可以显著提高系统的响应速度和性能,避免服务之间直接调用时可能出现的阻塞问题。

  • 示例

    • 当Nova服务创建虚拟机实例时,它会将创建请求发送到消息队列,然后由其他服务(如Nova-compute)从队列中获取请求并处理。这种方式使得Nova服务可以快速响应用户的请求,而不需要等待实例创建完成。

2. 负载均衡

消息队列可以将任务均匀分配到多个服务实例上,从而实现负载均衡。这有助于提高系统的整体性能和可扩展性。

  • 示例

    • 在一个包含多个计算节点的OpenStack环境中,Nova-scheduler可以将创建虚拟机的请求发送到消息队列,Nova-compute服务的多个实例可以从队列中获取任务并处理。这种方式确保了任务不会集中在某个特定节点上,从而提高了资源利用率。

3. 解耦服务

消息队列使得OpenStack中的各个服务之间可以实现解耦。服务之间不需要直接调用对方的接口,而是通过消息队列进行通信。这种解耦机制提高了系统的灵活性和可维护性。

  • 示例

    • Cinder服务(块存储)和Nova服务(计算)之间通过消息队列通信。Nova服务在需要创建卷时,将请求发送到消息队列,Cinder服务从队列中获取请求并处理。这种方式使得Nova和Cinder服务可以独立开发和维护,而不会相互影响。

4. 任务持久化

消息队列可以将任务持久化存储,即使在消息队列服务或处理任务的服务出现故障时,任务也不会丢失。这确保了任务的可靠性和系统的高可用性。

  • 示例

    • 如果Nova-compute服务在处理创建虚拟机的任务时出现故障,任务仍然保留在消息队列中。当服务恢复后,它可以继续处理这些任务,从而保证任务不会丢失。

5. 扩展性和高可用性

消息队列支持集群部署,可以提高系统的扩展性和高可用性。通过部署多个消息队列节点,可以实现负载均衡和故障转移,从而确保系统的稳定运行。

  • 示例

    • 在高可用部署中,可以部署多个RabbitMQ节点组成一个集群。当某个节点出现故障时,其他节点可以继续提供服务,确保消息队列的高可用性。

6. 事件通知

消息队列还可以用于事件通知,使得服务之间可以相互通知重要的事件和状态变化。

  • 示例

    • 当Neutron服务创建或删除网络时,它可以将事件发送到消息队列,其他服务(如Nova)可以从队列中获取这些事件并进行相应的处理。这种方式使得服务之间可以及时响应彼此的状态变化。

安装rabbitmq

1
yum install rabbitmq-server -y

启动服务

1
systemctl enable rabbitmq-server.service --now

添加rabbitmq管理员用户

添加openstack用户

1
rabbitmqctl add_user openstack LiXiaohui

分配此用户为管理员

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

配置memcached

memcached的作用

在OpenStack中,Memcached是一种高性能的分布式内存缓存系统,主要用于缓存频繁访问的数据,从而提高系统的性能和响应速度。以下是Memcached在OpenStack中的主要作用:

1. 身份认证缓存

Memcached在OpenStack的身份认证服务(Keystone)中扮演着关键角色。Keystone使用Memcached来缓存用户的身份认证信息,包括用户的令牌(Token)和角色信息。通过缓存这些信息,可以显著减少对数据库的访问次数,从而提高身份认证的效率。

  • 具体作用

    • 快速验证:当用户请求访问OpenStack资源时,Keystone首先检查Memcached中是否已经缓存了该用户的令牌信息。如果缓存存在,可以直接使用缓存中的数据进行验证,而无需查询数据库,从而大大加快了验证速度。

    • 减轻数据库压力:通过缓存频繁访问的身份认证信息,Memcached可以显著减少对后端数据库的查询次数,从而减轻数据库的负载,提高系统的整体性能。

2. 会话管理

Memcached可以用于管理用户的会话信息。在OpenStack环境中,用户的会话信息(如登录状态、权限信息等)可以存储在Memcached中,以便快速访问和管理。

  • 具体作用

    • 快速会话恢复:当用户重新访问OpenStack服务时,系统可以通过Memcached快速恢复用户的会话信息,而无需重新进行身份验证,从而提高用户体验。

    • 分布式会话管理:在分布式环境中,Memcached可以跨多个节点共享会话信息,确保用户在不同节点之间的无缝切换。

3. 减少数据库读取

除了身份认证信息,Memcached还可以缓存其他频繁访问的数据,如配置信息、资源状态等。通过缓存这些数据,可以减少对数据库的读取操作,从而提高系统的性能和响应速度。

  • 具体作用

    • 提高读取效率:对于一些不经常变化但频繁访问的数据,如配置参数、资源状态等,Memcached可以提供快速的读取服务,避免每次访问都查询数据库。

    • 减轻数据库压力:减少对数据库的读取操作可以显著减轻数据库的负载,特别是在高并发环境下,这有助于提高系统的整体性能和稳定性。

4. 分布式缓存

Memcached支持分布式部署,可以跨多个节点共享缓存数据。在OpenStack环境中,这种分布式缓存机制可以确保数据的一致性和高可用性。

  • 具体作用

    • 数据一致性:通过分布式缓存,可以确保所有节点上的缓存数据保持一致,避免因数据不一致导致的问题。

    • 高可用性:分布式缓存可以提高系统的高可用性。即使某个节点出现故障,其他节点仍然可以提供缓存服务,确保系统的正常运行。

5. 提高系统性能

通过缓存机制,Memcached可以显著提高OpenStack系统的整体性能。缓存数据的读取速度远远快于从数据库中读取数据,这可以显著减少系统的响应时间,提高用户的满意度。

  • 具体作用

    • 快速响应:缓存机制可以显著减少系统的响应时间,提高用户体验。

    • 优化资源利用:通过减少对数据库的访问,可以优化资源利用,提高系统的整体性能。

安装memcached

1
yum install memcached python3-memcached -y

修改监听IP

将服务的IP更改为使用管理接口的IP

1
sed -i 's/OPTIONS=.*/OPTIONS="-l 127.0.0.1,::1,controller"/' /etc/sysconfig/memcached

启动服务

1
systemctl enable memcached.service --now

配置ETCD

1
yum install etcd -y

把这/etc/etcd/etcd.conf的几个IP都换成管理接口的IP: ETCD_INITIAL_CLUSTERETCD_INITIAL_ADVERTISE_PEER_URLSETCD_ADVERTISE_CLIENT_URLSETCD_LISTEN_CLIENT_URLS

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/etcd/etcd.conf <<'EOF' 
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.8.10:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.8.10:2379"
ETCD_NAME="controller"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.8.10:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.8.10:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.8.10:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

启动服务

1
systemctl enable etcd --now