💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
![](https://i-blog.csdnimg.cn/direct/ff169577db1c4a128c6c5ae56d3c6949.gif)
推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
OpenStack HA 部署
技能目标:
-
OpenStack HA 部署方案
-
Corosync 安装和配置
-
Pacemaker 安装和配置
-
RabbitMQ 安装和配置
-
MariaDB 安装和配置
-
Keystone 安装和配置
-
Dashboard 安装和配置
-
配置 OpenStack API5.1 案例分析
5.1.1 案例概述
HA(High Available),高可用性集群,是保证业务连续性的有效解决方案。一般有两
个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的节点称为活动节
点,而作为活动节点的备份节点则称为备用节点。当活动节点出现问题,导致正在运行的业
务(任务)不能正常运行时,备用节点此时就会侦测到故障,并立即接续活动节点来执行业
务。从而实现业务的不中断或短暂中断。本章主要介绍 OpenStack 高可用集群的实现方案
——HA 部署。
5.1.2 案例前置知识点
1. HA 的计算公式
RPO(Recovery Point Objective)即数据恢复点目标,主要指的是业务系统所能容忍
的数据丢失量。RTO(Recovery Time Objective)即恢复时间目标,主要指的是所能容忍
的业务停止服务的最长时间,也就是从灾难发生到业务系统恢复服务功能所需要的最短时间
周期。对于 HA 来说,往往使用共享存储,同时使用 Active/Active (双活集群) HA 模
式来使得 RTO 几乎为 0。如果使用 Active/Passive 模式的 HA,则需要将 RTO 减少到
最小限度。
非宕机时间=1 - (宕机时间)/(宕机时间 + 运行时间),通常使用 9 的个数表示可用性:
2 个 9:99% = 1% * 365 = 3.65 * 24 小时/年 = 87.6 小时/年的宕机时间。
4 个 9: 99.99% = 0.01% * 365 * 24 * 60 = 52.56 分钟/年。
5 个 9:99.999% = 0.001% * 365 = 5.265 分钟/年的宕机时间,也就意味着每次
停机时间在一到两分钟。
11 个 9:几乎就是几年才宕机几分钟。 据说 AWS S3 的设计高可用性就是 11
个 9。
2. HA 的分类
HA 将服务分为两类:
有状态服务:后续对服务的请求依赖于之前对服务的请求。
无状态服务:多次对服务的请求之间没有依赖关系,是完全独立的。
HA 需要使用冗余的服务器组成集群来运行,包括应用和服务。这种冗余性也可以将
HA 分为两类:
Active/Passive HA:集群只包括两个节点简称主备。在这种配置下,系统采用主
和备用机器来提供服务,系统只在主设备上提供服务。在主设备故障时,备设备上
的服务被启动来替代主设备提供的服务。典型地,可以采用 CRM 软件比如
Pacemaker 来控制主备设备之间的切换,并提供一个虚机 IP 来提供服务。
Active/Active HA:集群只包括两个节点时简称双活,包括多节点时成为多主
(Multi-master)。在这种配置下,系统在集群内所有服务器上运行同样的负载。
以数据库为例,对一个实例的更新,会被同步到所有实例上。这种配置下往往采用
负载均衡软件比如 HAProxy 来提供服务的虚拟 IP。
3. OpenStack 的 HA
OpenStack 部署环境中,各节点可以分为几类:
Cloud Controller Node (云控制节点):安装各种 API 服务和内部工作组件
(worker process)。同时,往往将共享的 DB 和 MQ 安装在该节点上。
Neutron Controller Node (网络控制节点):安装 Neutron L3 Agent,L2 Agent,
LBaas,VPNaas,FWaas,Metadata Agent 等 Neutron 组件。
Storage Controller Node (存储控制节点):安装 Cinder volume 以及 Swift 组
件。
Compute node (计算节点):安装 Nova-compute 和 Neutron L2 Agent,
节点上创建虚机。
要实现 OpenStack HA,一个最基本的要求是这些节点都是冗余的。根据每个节点上
部署的软件特点和要求,每个节点可以采用不同的 HA 模式。但是,选择 HA 模式有个基
本的原则:能 A/A 尽量 A/A,不能的话则 A/P (RedHat 认为 A/P HA 是 No HA)。
有原生(内在实现的)HA 方案尽量选用原生方案,没有的话则使用额外的 HA 软件比如此
次介绍的 Pacemaker 等。需要考虑负载均衡,方案尽可能简单,不要太复杂。
5.1.3 案例环境
1. 本案例环境
本案例环境如表 所示。
表 案例环境
主机 | 操作系统 | 主机名/IP 地址 | 主要软件 |
服务器 | Centos 7.3 | Controller01/192.168.0.3 | Openstack+DRBD+Pacemaker+Corosync |
服务器 | Centos 7.3 | Controller02/192.168.0.4 | Openstack+DRBD+Pacemaker+Corosync |
| 虚拟 IP 地址 | Controller/192.168.0.100 | 作用为 VIP |
2. 案例需求
Heartbeat 与 Corosync 是流行的 Messaging Layer (集群信息层),Pacemaker 是最
流行的 CRM(集群资源管理器),同时 Corosync+Pacemaker 是最流行的高可用集群的
套件,使用 DRBD+Pacemaker+Corosync 部署 OpenStack HA。
3. 案例实现思路
(1)准备基础环境;
(2)Corosync 安装及基础操作;
(3)Pacemaker 安装及基本操作;
(4)RabbitMQ 基本安装与操作;
(5)MariaDB 安装及基本使用;
(6)配置及验证 OpenStack HA 基本功能。
5.2 案例实施
本案例采用 DRBD+Pacemaker+Corosync 部署 OpenStack HA 。DRBD(Distributed
Replicated Block Device,分布式复制块设备)是用软件实现的、无共享的、服务器之间镜
像块设备内容的存储复制解决方案。DRBD 是镜像块设备,是按数据位镜像成一样的数据
块。简单说 DRBD 是实现活动节点存储数据改动后自动复制到备用节点相应存储位置的软
件。Corosync 是集群管理套件的一部分,它在传递信息的时候可以通过一个简单的配置文
件来定义信息传递的方式和协议等。Corosync 也是 Messaging Layer 集群信息层软件,需
要 Pacemaker 资源管理器(CRM),才能构成一个完整的高可用集群。
5.2.1 案例环境准备
1. 修改主机名
修改 hostname 主机名,两个节点都需要执行,以 controller01 上执行为例,命令如下
所示。
[root@localhost ~]# hostnamectl set-hostname controller01
2. 配置 hosts 文件
配置 hosts 文件,两个节点都需要执行,以 controller01 上执行为例,命令如下所示。
[root@controller01 ~]# vim /etc/hosts
192.168.0.3
controller01
192.168.0.4
controller02
192.168.0.100 controller
3. 关闭防火墙
禁用 SELinux 和关闭防火墙,两个节点都要执行,以 controller01 上执行为例,命令如
下所示。
[root@controller01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@controller01 ~]# setenforce 0
[root@controller01 ~]# systemctl stop firewalld.service
[root@controller01 ~]# systemctl disable firewalld.service
4. 安装 DRBD
先配置 YUM 源,然后再进行 DRBD 的安装。两个节点都需要执行,以 controller01 上
执行为例,命令如下所示。
[root@controller01 ~]# rpm -ivh
http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@controller01 ~]# yum install -y drbd84-utils kmod-drbd84 kernel*
安装完 DRBD 之后,需要重新启动系统,加载对应模块。
[root@controller01 ~]# modprobe drbd
[root@controller01 ~]# lsmod | grep drbd
drbd
397041 0
libcrc32c
12644 4 xfs,drbd,nf_nat,nf_conntrack
[root@controller01 ~]# echo drbd >/etc/modules-load.d/drbd.conf
5. 配置时间同步
确保两个节点时间是一致,可通过执行如下命令实现。
(1)controller01 节点配置为时间源服务器
[root@controller01 ~]# yum install chrony -y
[root@controller01 ~]# vim /etc/chrony.conf
#server 0.centos.pool.ntp.org iburst
//注释掉默认的源服务器
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp6.aliyun.com iburst
//添加阿里时间源地址
//省略部分内容
allow 192.168.0.0/24
//新添加允许同步范围
[root@controller01 ~]# systemctl enable chronyd.service
[root@controller01 ~]# systemctl restart chronyd.service
[root@controller01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address
Stratum Poll Reach LastRx Last sample
=======================================================================
^* 203.107.6.88
2 10
377
470
+420us[ +556us] +/-
16ms
(2)controller02
配置为时间同步客户端
[root@compute02 ~]# yum install chrony -y
[root@compute02 ~]# vim /etc/chrony.conf
#server 0.centos.pool.ntp.org iburst
//注释掉默认的源服务器
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server controller01 iburst
//添加 controller01 为时间源服务器
[root@compute02 ~]# systemctl enable chronyd.service
[root@compute02 ~]# systemctl restart chronyd.service
[root@compute02 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address
Stratum Poll Reach LastRx Last sample
=======================================================================
^* controller
3 10
377
910
+27us[ +263us] +/-
12ms
6. 配置 DRBD
在 controller01 上,修改/etc/drbd.conf ,内容如下:
[root@controller01 ~]# vim /etc/drbd.conf
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
[root@controller01 ~]# cp /etc/drbd.d/global_common.conf{,.bak}
//将/etc/drbd.d/global_common.conf 备份
[root@controller01 ~]# vim /etc/drbd.d/global_common.conf //替换为如下内容
global {
usage-count no;
udev-always-use-vnr; # treat implicit the same as explicit volumes
}common {
protocol C;
handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh;
/usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh;
/usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh;
/usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
}
startup {
}
options {
}
disk {
on-io-error detach;
}
net {
cram-hmac-alg "sha1";
shared-secret "123456";
}
}
[root@controller01 ~]# vim /etc/drbd.d/mydrbd.res
resource mydrbd {
on controller01 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.0.3:7789;
meta-disk internal;
}
on controller02 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.0.4:7789;
meta-disk internal;
}
}
将配置好的文件复制到 controller02 相同路径。
[root@localhost ~]# scp /etc/drbd.conf controller02:/etc/
[root@localhost ~]# scp /etc/drbd.d/{global_common.conf,mydrbd.res}
controller02:/etc/drbd.d
给虚拟机添加硬盘,两个节点都要执行,如图 所示。![](https://i-blog.csdnimg.cn/direct/a10d1c59f3664a1c92c840b7553ee6c3.png)
添加虚拟硬盘
第二块硬盘添加完成后,为了方便快速识别,需要重启系统。
创建初始化 DRBD 设备元数据,两个节点都要执行。
[root@controller01 ~]# dd if=/dev/zero of=/dev/sdb bs=1M count=100
然后,创建元数据设备,两个节点都要执行。
[root@controller01 ~]# drbdadm create-md mydrbd
[root@controller01 ~]# drbdadm up mydrbd
将 controller01 节点设置为主节点。
[root@controller01 ~]# drbdadm -- --overwrite-data-of-peer primary mydrbd
使用 cat /proc/drbd 或者 drbdadm status 命令查看 DBRD 状态,会显示正在同步数据。
[root@controller01 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05
02:58:18
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:9940992 nr:0 dw:0 dr:9941904 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:11029852
[========>...........] sync'ed: 47.5% (10768/20476)M
finish: 0:04:18 speed: 42,604 (35,888) K/sec
[root@controller01 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05
02:58:18
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:18185172 nr:0 dw:0 dr:18186084 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2785672
[================>...] sync'ed: 86.8% (2720/20476)M
finish: 0:01:06 speed: 41,724 (37,884) K/sec
等待数据同步完成后,在 controller01 节点创建文件系统,命令如下所示。
[root@controller01 ~]# mke2fs -j /dev/drbd0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242711 blocks
262135 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
至此,DBRD 安装完成。
5.2.2 Corosync 安装和配置
以下操作需要在两个节点进行。下面以 controller01 为例介绍操作命令。
1. 安装 Pacemaker、Corosync
安装 Pacemaker 时,Corosync 会自动安装,因此安装命令如下所示。
[root@controller01 ~]# yum install -y pacemaker pcs psmisc policycoreutils-python
[root@controller01 ~]# systemctl start pcsd.service
[root@controller01 ~]# systemctl enable pcsd.service
在安装 pcs 时,hacluster 用户会自动创建,并且给该用户设置密码。
[root@controller01 ~]# passwd hacluster
Changing password for user hacluster.
New password:
//设置密码为 123456
在 controller01 授权集群节点,如下所示。
[root@controller01 ~]# pcs cluster auth controller01 controller02
Username: hacluster
Password:
controller01: Authorized
controller02: Authorized
在 controller01 设置集群名称,加入节点,如下所示。
[root@controller01 ~]# pcs cluster setup --name openstack-HA controller01 controller02
Destroying cluster on nodes: controller01, controller02...
controller01: Stopping Cluster (pacemaker)...
controller02: Stopping Cluster (pacemaker)...
controller02: Successfully destroyed cluster
controller01: Successfully destroyed cluster
Sending 'pacemaker_remote authkey' to 'controller01', 'controller02'
controller01: successful distribution of the file 'pacemaker_remote authkey'
controller02: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes...
controller01: Succeeded
controller02: Succeeded
Synchronizing pcsd certificates on nodes controller01, controller02...
controller01: Success
controller02: Success
Restarting pcsd on the nodes in order to reload the certificates...
controller01: Success
controller02: Success
在 controller01 启动集群,如下所示。
[root@controller01 ~]# pcs cluster start --all
controller01: Starting Cluster (corosync)...
controller02: Starting Cluster (corosync)...
controller01: Starting Cluster (pacemaker)...
controller02: Starting Cluster (pacemaker)...
在 controller01 检查 Corosync 服务状态,执行命令及检查结果如下所示。
[root@controller01 ~]# pcs status corosync
Membership information
----------------------
Nodeid
Votes Name
1
1 controller01 (local)
2
1 controller02
2. 配置 Corosync
两个节点都要执行配置 Corosync,编辑/etc/corosync/corosync.conf 文件,内容如下。
[root@controller01 ~]# vim /etc/corosync/corosync.conf
totem {
version: 2
cluster_name: openstack-HA
secauth: off
transport: udpu
}
nodelist {
node {
ring0_addr: controller01
nodeid: 1
}
node {
ring0_addr: controller02
nodeid: 2
}
}
quorum {
provider: corosync_votequorumtwo_node: 1
}
logging {
to_logfile: yes
logfile: /var/log/cluster/corosync.log
to_syslog: yes
}
配置加密认证会在/etc/corosync/目录下生成 authkey 文件(在 controller01 上执行)。
[root@controller01 ~]# corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Press keys on your keyboard to generate entropy (bits = 920).
Press keys on your keyboard to generate entropy (bits = 1000).
Writing corosync key to /etc/corosync/authkey.
将 corosync.conf 和 authkey 两个文件拷贝到 controller02 相同目录下。检查集群状态,
如果显示活跃节点为 controller01 且两个节点均在线,集群就配置好了。
[root@controller01 ~]# scp -p authkey corosync.conf controller01:/etc/corosync/
至此,完成了 Corosync 的配置任务。
5.2.3 Pacemaker 配置
安装和配置 Pacemaker,需确保 HA 环境资源可以使用。以下操作在 controller01 节
点执行。
1. 配置集群初始属性
Pacemaker 的安装已经介绍过,此处只详细说明 Pacemaker 配置集群参数的命令与操
作。配置集群可以在两个节点中任意一个进行,推荐使用主节点,如不清楚主节点是哪个,
可以执行 pcs cluster status,通过关键字“Current DC: controller01”确定。
[root@controller01 ~]# pcs cluster status
Cluster Status:
Stack: corosync
Current DC: controller01 (version 1.1.21-4.el7-f14e36fd43) - partition with quorum
Last updated: Wed May 27 21:09:48 2020
Last change: Wed May 27 16:59:48 2020 by hacluster via crmd on controller02
2 nodes configured
0 resources configured
PCSD Status:
controller01: Online
controller02: Online
因为本案例只有两个节点,故不需要投票属性,集群中当主节点挂掉时会自动切换到备
节点,可通过如下命令实现。
[root@controller01 ~]# pcs property set no-quorum-policy=ignore
其中 no-quorum-policy=ignore 表示忽略投票属性。
设置当集群出现故障时服务自动迁移,通过如下命令实现。
[root@controller01 ~]# pcs resource defaults migration-threshold=1
由于两个节点无 stonith 设备,因此需要设置无 stonith 设备,否则将无法启动 pcs 服务。
[root@controller01 ~]# pcs property set stonith-enabled=false
在故障 controller 恢复后,为防止备用资源迁回原有节点(迁来迁去会对业务有一定影
响),建议将以下数值设置为官网推荐的默认时间。
[root@controller01 ~]# pcs resource defaults resource-stickiness=100
[root@controller01 ~]# pcs resource defaults
[root@controller01 ~]# pcs resource op defaults timeout=90s
[root@controller01 ~]# pcs resource op defaults
[root@controller01 ~]# pcs property set pe-warn-series-max=1000
pe-input-series-max=1000
pe-error-series-max=1000 cluster-recheck-interval=5min
验证如果默认没有任何输出,就说明配置正确,如下所示。
[root@controller01 ~]# crm_verify -L -V
2. 配置集群详细属性
群集对外提供服务需要使用浮动 IP 地址(又称虚拟 IP 地址,简称 VIP)。执行以下命
令配置 VIP 和监测时间间隔。[root@controller01 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.0.100
cidr_netmask=24 op monitor interval=30s
[root@controller01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen
1000
link/ether 00:0c:29:03:5f:97 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.3/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.0.100/24 brd 192.168.0.255 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::91ca:fd3e:8800:bfa1/64 scope link
valid_lft forever preferred_lft forever
在 controller01 上查看当前集群属性,输入 pcs property 命令,查看输出信息,如下所
示。
[root@controller01 ~]# pcs property
Cluster Properties:
cluster-infrastructure: corosync
cluster-name: openstack-HA
cluster-recheck-interval: 5min
dc-version: 1.1.21-4.el7-f14e36fd43
have-watchdog: false
no-quorum-policy: ignore
pe-error-series-max: 1000
pe-input-series-max: 1000
pe-warn-series-max: 1000
stonith-enabled: false
5.2.4 MariaDB 安装和配置
MariaDB 安装和配置在两个节点都要执行,下面以在 controller01 上执行为例。
1. 安装 MariaDB
[root@controller01 ~]# yum -y install mariadb mariadb-server python2-PyMySQL
2. 配置 MariaDB
[root@controller01 ~]# vim /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 192.168.0.3
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
在 controller02 上 编 辑 /etc/my.cnf.d/openstack.cnf , 只 需 要 将 bind-address =
192.168.0.3 改为 192.168.0.4,其他配置和 192.168.0.3 上保持一致。在两个节点上,分别
启动数据库服务,并配置为开机启动。
[root@controller01 ~]# systemctl enable mariadb.service
[root@controller01 ~]# systemctl start mariadb.service
为了保证数据库服务的安全性,运行``mysql_secure_installation``脚本。特别需要说明
的是,线上环境需要为数据库的 root 用户设置一个安全度高的密码,本章案例实验设置的
是 123456。
[root@controller01 ~]# mysql_secure_installation
//省略部分内容
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置 root 用户密码,输入 y 并回车或直接回车
New password: <– 设置 root 用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,生产环境建议删除,所以直接回车
Disallow root login remotely? [Y/n] <–是否禁止 root 远程登录,根据自己的需求选择 Y/n 并回车,建议
禁止
Remove test database and access to it? [Y/n] <– 是否删除 test 数据库,直接回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,直接回车
[root@controller02 ~]# mysql -u root -p123456
//登录 mysql
5.2.5 Memcache 的安装配置
安装 Memcached 服务,两个节点都需要执行,命令如下所示。
[root@controller01 ~]# yum install memcached python-memcached -y
编辑配置文件/etc/sysconfig/memcached,将 OPTIONS 的值修改为控制节点的管理 IP
192.168.0.3。如下所示。
[root@controller01 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 192.168.0.3,::1"
//不同机器修改为对应的 IP
安装配置完成后开启 Memcached 服务,并设置开机启动。
[root@controller01 ~]# systemctl restart memcached.service
[root@controller01 ~]# systemctl enable memcached.service
5.2.6 RabbitMQ 安装和配置
两个节点上,分别完成 RabbitMQ 安装和配置。
1. 安装 RabbitMQ
使用 CentOS 7 默认提供的 YUM 官方源,安装 OpenStack-train 源。然后安装
RabbitMQ 并配置开机启动。命令如下所示。
[root@controller01 ~]# yum install centos-release-openstack-train -y
//安装 openstack-ocata
源
[root@controller01 ~]# yum install rabbitmq-server -y
//安装 rabbitmq
[root@controller01 ~]# systemctl enable rabbitmq-server.service
[root@controller01 ~]# systemctl start rabbitmq-server.service
2. 配置 RabbitMQ
使用 rabbitmqctl 添加 openstack 用户,并设置密码为 admin,命令如下所示。
[root@controller01 ~]# rabbitmqctl add_user openstack admin
给 openstack 用户授予权限,命令如下所示。
[root@controller01 ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
RabbitMQ 自带了 web 管理界面,只需要启动插件便可以使用。
[root@controller01 ~]# rabbitmq-plugins enable rabbitmq_management
登录 http://192.168.0.3:15672/ ,用户名(guest)、密码(guest),登录后如图
所示。![](https://i-blog.csdnimg.cn/direct/ce3e5bc9126b49ca9355fff4a5d92945.png)
RabbitMQ 控制台
出现上图所示页面,说明 RabbitMQ 安装且配置成功。
5.2.7 安装配置 Keystone
在两个节点分别执行以下操作,下面仅以 controller01 节点为例进行介绍。controller02
节点需要根据对应主机器名和 IP 地址进行修改。
1. 安装 Keystone
(1)创建数据库并授予权限
[root@controller01 ~]# mysql -uroot -p'123456'
ariaDB [(none)]> CREATE DATABASE keystone;
//创建 keystone 数据库
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'controller01'
IDENTIFIED BY 'admin';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED
BY 'admin';
(2)安装 Keystone Apache 软件
[root@controller01 ~]# yum -y install openstack-keystone python-openstackclient httpd
mod_wsgi
2. 配置 keystone
(1)修改配置文件
在/etc/keystone/keystone.conf 文件内添加如下配置,密码是 admin。
[database]
# ...
connection = mysql+pymysql://keystone:admin@192.168.0.3/keystone
//controller02 内修改为
192.168.0.4
[token]
# ...
provider = fernet
(2)初始化身份认证服务数据库
[root@controller01 ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
(3)初始化 Fernet keys
Fernet keys 是用于 API token 的安全信息格式。
[root@controller01 ~]# keystone-manage fernet_setup --keystone-user keystone
--keystone-group keystone
[root@controller01 ~]# keystone-manage credential_setup --keystone-user keystone
--keystone-group keystone
(4)Bootstrap 身份认证服务配置
[root@controller01 ~]# keystone-manage bootstrap --bootstrap-password admin
--bootstrap-admin-url http://controller01:5000/v3/ --bootstrap-internal-url
http://controller01:5000/v3/ --bootstrap-public-url http://controller01:5000/v3/
--bootstrap-region-id RegionOne
//controller02 节点注意修改命令中主机名
(5)配置 Apache HTTP 服务
[root@controller01 ~]# vim /etc/httpd/conf/httpd.conf //修改 ServerName 为 controller01
//省略部分内容
ServerName controller01
//controller02 节点注意修改配置文件中的主机名
//省略部分内容
[root@controller01 ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
(6)启动 Apache HTTP 服务,并配置开机启动
[root@controller01 ~]# systemctl enable httpd.service
[root@controller01 ~]# systemctl start httpd.service
(7)创建脚本文件
创建用于认证的 admin 用户环境变量脚本文件。
[root@controller01 ~]# vim admin-openrc
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller01:5000/v3
//注意主机名的修改
export OS_IDENTITY_API_VERSION=3
[root@controller01 ~]# chmod +x admin-openrc
[root@controller01 ~]# . admin-openrc
(8)创建域、项目、用户和角色
① 创建 service 项目
[root@controller01 ~]# openstack project create --domain default --description "Service
Project" service② 创建 demo 项目
[root@controller01 ~]# openstack project create --domain default --description "Demo Project"
demo
③ 创建 demo 用户
[root@controller01 ~]# openstack user create --domain default --password-prompt demo
//输入两次密码 demo
④ 创建 user 角色
[root@controller01 ~]# openstack role create user
⑤ 添加 demo 用户到 demo 项目和角色
[root@controller01 ~]# openstack role add --project demo --user demo user
⑥ 验证 Keystore 服务
执行命令重置 OS_TOKEN 和 OS_URL 环境变量。
[root@controller01 ~]# unset OS_TOKEN OS_URL
然后,分别以 admin 和 demo 用户请求认证令牌。
作为 admin 用户,请求认证令牌。
[root@controller01 ~]# openstack --os-auth-url http://controller01:5000/v3
--os-project-domain-name default --os-user-domain-name default --os-project-name admin
--os-username admin token issue
验证 admin 用户获取 token。
[root@controller01 ~]# . admin-openrc
[root@controller01 ~]# openstack token issue
创建 demo 用户环境变量脚本文件。编辑文件 demo-openrc,并添加如下内容。
[root@controller01 ~]# vim demo-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_AUTH_URL=http://controller01:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
[root@controller01 ~]# chmod +x demo-openrc
作为 demo 用户,请求认证令牌。
[root@controller01 ~]# openstack --os-auth-url http://controller01:5000/v3
--os-project-domain-name default --os-user-domain-name default --os-project-name demo
--os-username demo token issue
//输入 demo 密码
验证 demo 用户获取 token。
[root@controller01 ~]# . demo-openrc
[root@controller01 ~]# openstack token issue
5.2.8 安装及配置 Dashboard
在两个节点上分别安装和配置 Dashboard,下面仅以 controller01 节点为例。配
置 controller02 节点时要注意主机名和 IP 地址的变化。执行命令如下。
[root@controller01 ~]# yum -y install openstack-dashboard python-openstackclient
[root@controller01 ~]# vim /etc/openstack-dashboard/local_settings
OPENSTACK_HOST = "controller01"
ALLOWED_HOSTS = ['*']
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '192.168.0.3:11211',
}
}
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
//启用第 3 版认证 API
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = {
“identity”: 3,
“image”: 2,
“volume”: 2,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = “default”
OPENSTACK_KEYSTONE_DEFAULT_ROLE = “user”
OPENSTACK_NEUTRON_NETWORK = {
...
'enable_router': False,
'enable_quotas': False,
'enable_distributed_router': False,
'enable_ha_router': False,
'enable_lb': False,
'enable_firewall': False,
'enable_vpn': False,
'enable_fip_topology_check': False,
}
TIME_ZONE = “Asia/Shanghai”
//两台 OpenStack 节点配置相同,需要更换配置文件内的 IP 地址。
[root@controller01 ~]# scp /etc/openstack-dashboard/local_settings
192.168.0.4:/etc/openstack-dashboard/
//注意修改 ip 和主机名[root@controller01 ~]# systemctl restart httpd.service memcached.service
5.2.9 验证 OpenStack
1. 验证集群状态
执行 pcs cluster status 命令,查看集群状态,结果如下所示。
[root@controller01 ~]# pcs cluster status
Cluster Status:
Stack: corosync
Current DC: controller01 (version 1.1.21-4.el7-f14e36fd43) - partition with quorum
Last updated: Thu May 28 22:37:43 2020
Last change: Wed May 27 21:42:10 2020 by root via cibadmin on controller01
2 nodes configured
1 resource configured
PCSD Status:
controller02: Online
controller01: Online
2. 使用 VIP 登录
打开浏览器,输入网址 http://192.168.0.100,在弹出的认证页面分别输入域名为“default”,
帐号为“admin”,密码为“admin”。登录后如图 所示.![](https://i-blog.csdnimg.cn/direct/01b84c09cb9c4f9888d00e5be2a65195.png)
vip 登录 web 界面
如果访问时,报如下错误。
Not Found
The requested URL /auth/login/ was not found on this server.
是由于 Train 版的 Dashboard 存在一些问题,编辑 openstack-dashboard.conf 文件,
进入如下修改。
[root@controller01 ~]# vim /etc/httpd/conf.d/openstack-dashboard.conf
#WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
WSGIScriptAlias / /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
#Alias /dashboard/static /usr/share/openstack-dashboard/static
Alias /static /usr/share/openstack-dashboard/static
//去掉了一层 dashboard 字符之后就可以正常访问。
2. 验证 HA 切换
关闭集群中 controller01 节点,并查看状态,结果如下所示。
[root@controller01 ~]# pcs cluster stop controller01
controller01: Stopping Cluster (pacemaker)...
controller01: Stopping Cluster (corosync)...
[root@controller01 ~]# pcs cluster status
Error: cluster is not currently running on this node
此时,因为 controller01 已经关闭,切换到 controller02 查看状态。结果如下所示。
[root@controller02 ~]# pcs cluster status
Cluster Status:
Stack: corosync
Current DC: controller02 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Mon Jul 30 11:43:15 2018
Last change: Fri Jul 27 17:14:56 2018 by root via cibadmin on controller01
2 nodes configured
1 resource configured
PCSD Status:
controller01: Online
controller02: Online
[root@controller02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
group default qlen 1000
link/ether 00:0c:29:dd:ac:1b brd ff:ff:ff:ff:ff:ff
inet 192.168.0.4/24 brd 192.168.9.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.0.100/24 brd 192.168.9.255 scope global secondary eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedd:ac1b/64 scope link
valid_lft forever preferred_lft forever
从上面切换结果看,VIP 192.168.0.100 已经切换到了备机,现在可以继续访问
http://192.168.0.100,Web 界面如图 所示。![](https://i-blog.csdnimg.cn/direct/938c7b2f01114038bda0cfe8d9186d1f.png)
切换备机后 identity 页面
至此,OpenStack 高可用 HA 搭建完成。
![](https://i-blog.csdnimg.cn/direct/86179564265a4f2e8c9ecbf48457e32d.gif)