第一章 环境准配
本章节是对基础环境进行配置,所有的节点都需要操作,包括控制节点、计算节点、网络节点、存储节点。
一、环境需求
主机名 | ip | 网卡 | 磁盘 |
---|---|---|---|
controller01 | 10.10.27.71 | ens192/ens224 | |
controller02 | 10.10.27.72 | ens192/ens224 | |
controller03 | 10.10.27.73 | ens192/ens224 | |
compute1 | 10.10.27.74 | ens192/ens224 | |
storage1 | 10.10.27.75 | ens192/ens224 | |
storage2 | 10.10.27.76 | ens192/ens224 | |
storage3 | 10.10.27.77 | ens192/ens224 | |
controller | 10.10.27.78 |
二、配置网卡
1.配置ens192
ens192配置的是管理网络,集群中所有的管理网络都应该在同一个网段,一般情况下管理网卡上方都会接在交换机的access口,但是也有人会将ens192这张网卡接在交换机的trunk口,这样就需要配置vlan_id了,可参考文章OpenStack文件下网络规划OpenStack网络规划的文章,这里是由KVM虚拟机部署的,因此不考虑服务器和交换机的连接。
此网卡一般会配置成静态网络,配置相应的ip地址,下面列出了需要修改项,其他的默认参数保留。
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.10.27.71
NETMASK=255.255.255.0
GATEWAY=10.10.27.1
DNS1=10.10.27.1
2.配置ens224
ens224是业务网络,一般情况下会将这块网卡接到交换机的trunk口,这是由于业务网络可能会有多个网段,接在交换机的access口也是可以的,但是一个交换机的access口有限,为了充分利用交换机资源,避免浪费,因此将服务区的这块网口接到交换机的trunk口,这样在配置ens224这块网卡时,就需要配置vlan_id,此操作可参考文章OpenStack文件下网络规划OpenStack网络规划的文章,这里是由KVM虚拟机部署的,因此不考虑服务器和交换机的连接。
三、设置主机名
主机名按照环境需求中的定义的主机名去修改,主机名可以直接修改配置文件也可以使用命令行去修改,修改完后重启或使用bash命令生效。NODE_NAME为不同的主机名。
# hostnamectl set-hostname NODE_NAME
四、配置hosts
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.27.78 controller
10.10.27.71 controller01
10.10.27.72 controller02
10.10.27.73 controller03
10.10.27.74 compute1
10.10.27.75 storage01
10.10.27.76 storage02
10.10.27.77 storage03
五、关闭firewalld
# systemctl stop firewalld
# systemctl disable firewalld
六、关闭selinux
# setenforce 0
# cat /etc/selinux/config
# 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 three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
七、关闭NetworkManage
# systemctl stop NetworkManager
# systemctl disable NetworkManager
八、替换centos7源
centos源默认是官方的源,官方的源下载的速度比较慢,因此可以将centos7的自带源修改为ali源,这样下载速度会增强。阿里源https://developer.aliyun.com/mirror/。
# cd /etc/yum.repos.d/
# mkdir _bak
# mv * _bak/
# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523 100 2523 0 0 441 0 0:00:05 0:00:05 --:--:-- 600
yum clean all
yum makecache
九、配置chrony
# yum install chrony -y
# cat /etc/chrony.conf | grep -v ^$ | grep -v ^#
server cn.pool.ntp.org iburst
allow 10.10.27.0/24
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
local stratum 10
logdir /var/log/chrony
# systemctl enable chronyd
# systemctl start chronyd
# chronyc sources
第二章 安装Ceph
本章节所有的内容都在Ceph节点上执行,Ceph的安装我们使用ceph-deploy工具安装,这个工具需要一个部署节点,我们将storage01当作部署节点,storage01、storage02和storage03部署mon服务。
一、配置ceph源
# cat /etc/yum.repos.d/ceph.repo
[ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch
enabled=1
gpgcheck=1
priority=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch
enabled=1
gpgcheck=1
priority=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
enabled=0
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
# yum clean all
# yum makecache
二、配置免密服务
#ssh-keygen
#ssh-copy-id root@storage01
#ssh-copy-id root@storage02
#ssh-copy-id root@storage03
三、安装cep-deploy工具
# yum -y remove epel-release
# yum install ceph-deploy -y
四、部署MON服务
1.创建文件目录
此目录是Ceph的部署目录,后续的操作都可以在此目录下完成。
# mkdir /root/my-cluster
# cd /root/my-cluster
2.创建集群
如果在在部署过程中遇到某些问题想要从头再来,可以使用以下命令进行配置清除,此清除命令不会清除Ceph的安装包。
#ceph-deploy purgedata {ceph-node} [{ceph-node}]
#ceph-deploy forgetkeys
如果想要将安装包一起清除,则使用以下命令。
#ceph-deploy purge {ceph-node} [{ceph-node}]
进入到管理目录,执行以下命令创建集群。
#ceph-deploy new {initial-monitor-node(s)}
#例如:
# ceph-deploy new storage01
创建集群后,部署路径下生成三个文件,ceph.conf是Ceph的配置文件,ceph-deploy-ceph.log是Ceph的日志文件,ceph.mon.keyring是Ceph的MON的认证文件。
[root@storage01 my-cluster]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
3.修改配置文件
[root@storage01 my-cluster]# cat ceph.conf
[global]
fsid = 5163b8bf-44a0-4043-b615-0b234cb87e94
mon_initial_members = storage01 #MON节点配置
mon_host = 10.10.27.75 #MON节点配置
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network =192.168.31.0/23 #外部访问集群的网络
cluster network =192.168.31.0/23 #集群内部网络
#默认osd pool的数量,此配置要和用于做存储的磁盘数量一致
osd pool default size = 3
rbd_default_format = 2
#设置monitor之间的时差,默认为0.5
mon clock drift allowed = 2
mon clock drift warn backoff = 30
[osd]
osd data = /var/lib/ceph/osd/ceph-$id
4.安装Ceph服务
调用ceph-deploy install命令会在每个节点上都安装相应的包,主要的包包括epel-release、yum-plugin-priorities、ceph ceph-radosgw等模块,也会安装一些依赖的模块ceph-mon、ceph-mds、ceph-osd、ceph-mgr等模块。
#ceph-deploy install {ceph-node} [{ceph-node} ...]
例如:
# ceph-deploy install storage01 storage02 storage03
5.初始化monitor
# ceph-deploy mon create-initial
6.赋予所有mon节点管理员权限
[root@storage01 my-cluster]# ceph-deploy admin storage01 storage02 storage03
[root@storage01 my-cluster]# ceph -s
cluster:
id: 5163b8bf-44a0-4043-b615-0b234cb87e94
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph01
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
五、部署mgr服务
由于OSD磁盘没有被创建,而配置文件中的配置的OSD的默认数是3个,因此集群的状态是HEALTH_WARN。
# ceph-deploy mgr create storage01
[root@storage01 my-cluster]# ceph -s
cluster:
id: 5163b8bf-44a0-4043-b615-0b234cb87e94
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph01
mgr: ceph01(active)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
六、部署osd服务
1.擦除磁盘
在部署osd服务时要指定一块磁盘,因此需要先对这块磁盘进行格式化,即对磁盘的内容进行擦除。
#擦除磁盘
# ceph-deploy disk zap storage01 /dev/sdb
# ceph-deploy disk zap storage02 /dev/sdb
# ceph-deploy disk zap storage03 /dev/sdb
2.部署osd服务
# ceph-deploy osd create --data /dev/sdb storage01
# ceph-deploy osd create --data /dev/sdb storage02
# ceph-deploy osd create --data /dev/sdb storage03
#查看状态
# ceph -s
cluster:
id: 5163b8bf-44a0-4043-b615-0b234cb87e94
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph01
mgr: ceph01(active)
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 3.01GiB used, 477GiB / 480GiB avail
pgs:
七、集群扩展
集群的mon是负责监控整个集群的状态,一般它为基数个,如果只有一个,当这个集群挂了之后就会出现单点故障。
1.同步配置文件
mon节点在配置文件中进行了配置,如果想要拓展mon节点,则需要在ceph.conf文件中修改,修改完成后将配置文件同步到所有的存储节点。
[root@storage01 my-cluster]# ceph-deploy --overwrite-conf admin storage01 storage02 storage03
2. 扩展mon
[root@storage01 my-cluster]# ceph-deploy mon add storage02
[root@storage01 my-cluster]# ceph-deploy mon add storage03
3. 扩展mgr
[root@storage01 my-cluster]# ceph-deploy mgr create storage02 storage03
八、配置ceph客户端
ceph客户端的意思是说在需要操作ceph的OpenStack节点安装ceph工具,然后让这些客户端获取admin权限,这样就能从其他的OpenStack节点操作ceph了。
1.免密配置
#ssh-copy-id root@controller01
#ssh-copy-id root@controller02
#ssh-copy-id root@controller03
#ssh-copy-id root@compute1
2.安装ceph
[root@storage01 my-cluster]# ceph-deploy install controller01 controller02 controller03 compute1
3.设置admin权限
[root@storage01 my-cluster]# ceph-deploy admin controller01 controller02 controller03 compute1
九、创建地址池
# ceph osd pool create vms 64
# ceph osd pool create images 16
# ceph osd pool create volumes 32
# ceph osd pool create backups 16
# ceph osd pool create gnocchi 8
# rbd pool init volumes
# rbd pool init images
# rbd pool init backups
# rbd pool init vms
# rbd pool init gnocchi
十、创建ceph用户
Ceph若开启了用户认证,则需要创建用户并给用户设定操作mon、osd的权限。
#创建cinder用户
# ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images'
#创建glance用户
# ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
#创建cinder-backup用户
ceph auth get-or-create client.cinder-backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backups'
#创建gnocchi用户
ceph auth get-or-create client.gnocchi mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=gnocchi'
#查看已有用户和权限
# ceph auth list
第三章 OpenStack环境基础配置
除了三小节之外,其他的在所有OpenStack节点上执行,三小节免密登录是为了方便拷贝已经配置好的配置文件到其他节点,这样省事。
一、配置OpenStack源
# yum install centos-release-openstack-rocky -y
# yum upgrade -y
二、安装OpenStack命令行
# yum install python-openstackclient openstack-selinux -y
三、控制节点做免密
# ssh-keygen
# ssh-copy-id root@controller02
# ssh-copy-id root@controller03
第四章 数据库HA
一、安装mariadb和galera
此小节中的内容在所有控制节点上执行,如果数据库集群不和控制节点在一起,则只在所有的数据库服务器上执行。
1.安装包
# yum install mariadb mariadb-server python2-PyMySQL galera mariadb-server-galera -y
# systemctl enable mariadb.service
2.配置mariadb-server.cnf
* default-storage-engine:指定数据库引擎
* wsrep_provider:指定ganera库的路径
* wsrep_cluster_address:#Galera集群中各节点地址。gcomm:// [地址使用组通信协议]。
* wsrep_node_address:#本节点在Galera集群中的通信地址,也是本机ip地址
* wsrep_node_name:#本节点在Galera集群中的通信名称,可自定义。
值得注意的是,在其他节点上wsrep_node_address、wsrep_node_name参数需要修改,其他的皆可保持不变。
[root@controller01 ~]# cat /etc/my.cnf.d/mariadb-server.cnf | grep -v ^# | grep -v ^$
[server]
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
max_connections = 4096
net_write_timeout= 900
net_read_timeout= 120
default-storage-engine = innodb
innodb_file_per_table = on
collation-server = utf8_general_ci
character-set-server = utf8
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://10.10.27.71,10.10.27.72,10.10.27.73"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_node_address="10.10.27.73"
wsrep_cluster_name="galeracluster11"
wsrep_node_name="galera1"
[embedded]
[mariadb]
[mariadb-10.1]
3.优化mariadb
修改mariadb启动文件,在启动文件中的[Service]配置组中增加以下参数,这样可以提高数据库的连接数。
LimitNOFILE=65535
LimitNPROC=65535
# systemctl --system daemon-reload
二、启动服务
启动集群和初始化数据库密码必须在同一节点上执行。
1.启动集群
# galera_new_cluster
2.初始化数据库密码
# mysql_secure_installation
3.启动数据库
启动数据库时,要注意启动时执行步骤1和步骤2的节点不用启动,依次启动其他的节点即可。
# systemctl start mariadb
4.验证集群
# mysql -uroot -p -e"show status like 'wsrep_cluster_size';"
Enter password:
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
# mysql -uroot -p -e"show status like 'wsrep_incoming_addresses';"
Enter password:
+--------------------------+----------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------+
| wsrep_incoming_addresses | 10.10.27.72:3306,10.10.27.73:3306,10.10.27.71:3306 |
+--------------------------+----------------------------------------------------------+
三、故障处理
若因为断点导致数据库同时掉线,且无法正常启动时,在主节点01上执行以下命令。
# cat /var/lib/mysql/grastate.dat
# sed -i "/safe_to_bootstrap/s/0/1/" /var/lib/mysql/grastate.dat
# galera_new_cluster
等到主节点01起来之后,在依次启动其他的节点即可。
# systemctl start mariadb
四、配置远程登录
# mysql -uroot -p
grant all privileges on *.* to root@'%' identified by '1q2w3e4r';
flush privileges;
set global net_read_timeout = 120;
set global net_write_timeout = 900;
第五章 rabbitmq HA
一、安装rabbitmq
rabbitmq这个包需要在所有的rabbitmq节点部署。
1.安装包
# yum install erlang rabbitmq-server -y
# systemctl enable rabbitmq-server.service
2.优化rabbitmq
在rabbitmq的启动服务文件的[Service]配置组中增加以下参数,这样可以让更多的用户能够连接到rabbbitmq。
LimitNOFILE=65535
# vi /usr/lib/systemd/system/rabbitmq-server.service
# systemctl daemon-reload
二、认证
将节点01当做主节点,将erlang.cookie拷贝到其他的节点,这样的认证有助于它们的内部通信。认证完成后启动其他节点的rabbitmq。
1.认证
# systemctl start rabbitmq-server.service
查看集群状态
# rabbitmqctl cluster_status
# scp /var/lib/rabbitmq/.erlang.cookie root@controller02:/var/lib/rabbitmq/.erlang.cookie
.erlang.cookie 100% 20 36.0KB/s 00:00
# scp /var/lib/rabbitmq/.erlang.cookie root@controller03:/var/lib/rabbitmq/.erlang.cookie
.erlang.cookie 100% 20 35.8KB/s 00:00
2.启动其他节点rabbitmq
# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
# chmod 400 /var/lib/rabbitmq/.erlang.cookie
# systemctl start rabbitmq-server.service
# rabbitmqctl cluster_status
三、添加集群到主节点
我们通过rabbitmqctl cluster_status命令在每个节点上看到的都是每个节点的集群运行状态,我们要将其他节点的rabbitmq集群添加到节点01(主节点)的集群中,在主节点01之外的其他节点依次执行以下命令。
#停止集群
# rabbitmqctl stop_app
#添加集群到主节点
# rabbitmqctl join_cluster --ram rabbit@controller01
#启动集群
# rabbitmqctl start_app
# rabbitmqctl cluster_status
Cluster status of node rabbit@controller03
[{
nodes,[{
disc,[rabbit@controller01]},
{
ram,[rabbit@controller03,rabbit@controller02]}]},
{
running_nodes,[rabbit@controller02,rabbit@controller01,rabbit@controller03]},
{
cluster_name,<<"rabbit@controller01">>},
{
partitions,[]},
{
alarms,[{
rabbit@controller02,[]},
{
rabbit@controller01,[]},
{
rabbit@controller03,[]}]}]
四、创建用户
本小节的内容在任意rabbitmq节点执行即可。
1.创建用户
#创建用户
# rabbitmqctl add_user openstack 1q2w3e4r
#为用户设置权限
# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
#查看用户列表
# rabbitmqctl list_users
2.设置镜像队列高可用
# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
# rabbitmqctl list_policies
五、开启rabbit web管理插件
本小节内容需要在所有的rabbitmq节点执行,这样做是为了开启rabbitmq的web管理界面,它对应的端口是15672。
# rabbitmq-plugins enable rabbitmq_management
web 访问http://ip:15672 guest guest
第六章 memcached
memcached服务在各节点独立部署,openstack各个服务模块统一调用多个控制节点的memcached服务。本章节在所有控制节点执行。
# yum install memcached python-memcached -y
# sed -i 's|127.0.0.1,::1|0.0.0.0|g' /etc/sysconfig/memcached
# systemctl enable memcached.service
# systemctl start memcached.service
第七章 pacemarker+haproxy
一、pacemarker
1.安装pacemarker包
所有的控制节点都需要安装pacemarker的包。
# yum install pacemaker pcs corosync fence-agents resource-agents -y
# systemctl enable pcsd
# systemctl start pcsd
2.修改集群管理员密码
集群默认的管理员为hacluster,由于我们在每台控制节点上都安装了placemarker集群,因此需要在所有控制节点上执行以下命令。
# echo 1q2w3e4r | passwd --stdin hacluster
3.认证配置节点
认证配置节点,是让集群管理员hacluster能够操作集群的节点,此操作可以在任意控制节点执行。
# pcs cluster auth controller01 controller02 controller03 -u hacluster -p 1q2w3e4r --force
4.创建pacemarker集群
pacemarker集群可以在任意控制节点创建,创建命令如下:
# pcs cluster setup --force --name openstack-cluster-01 controller01 controller02 controller03
# pcs cluster start --all
# pcs cluster enable --all
5.设置集群属性
此操作可以在任意控制节点操作。
# pcs property set pe-warn-series-max=1000 pe-input-series-max=1000 pe-error-series-max=1000
# pcs property set cluster-recheck-interval=5
# pcs property set stonith-enabled=false
# pcs property list
6.设置vip
在任意控制节点操作即可,vip是指对外暴露的ip地址,所有的请求都是通过vip接收,然后通过haroxy发送到相应的节点处理。其中ip和nic参数根据实际情况修改。
# pcs resource create vip ocf:heartbeat:IPaddr2 ip=10.10.27.78 cidr_netmask=24 nic=ens192 op monitor interval=30s
7.集群相关的操作
# 查看集群状态
# pcs status cluster
# 查看corosync状态;
# pcs status corosync
# 查看集群资源,即查看vip在哪台节点上
# pcs resource
web访问https://ip:2224 hacluster 1q2w3e4r
二、haproxy
本小节中1-7在所有控制节点执行。
1.安装haproxy
# yum install haproxy -y
2.系统配置
# cat /etc/sysctl.conf | grep -v ^# | grep -v ^$
net.ipv4.ip_nonlocal_bind =1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv6.conf.all.forwarding=1
# sysctl -p
3.haproxy基础配置
# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
chroot /var/lib/haproxy
daemon
group haproxy
maxconn 4000
pidfile /var/run/haproxy.pid
user haproxy
defaults
log global
maxconn 4000
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
listen stats
bind 0.0.0.0:1080
log 127.0.0.1 local0 err
maxconn 10
mode http
stats enable
stats uri /
stats realm OpenStack\ Haproxy
stats auth admin:admin
stats refresh 30s
stats show-node
stats show-legends
stats hide-version
stats admin if TRUE
4.配置mariadb监控页
mariadb监控页的配置可采用source模式,这样可以有效的避免数据的不一致行。
#路径: /etc/haproxy/haproxy.cfg
listen galera_cluster
bind 10.10.27.78:33060
balance source
mode tcp
option httpchk
server controller01 10.10.27.71:3306 inter 5000 fastinter 2000 rise 2 fall 2