您好,我是码农飞哥,本篇文章是Ceph实战专栏的第三篇文章,承接上文,默认我们已经在虚拟机上装好了docker,本文主要讲如何启动ceph文件系统的各个组件,将集群搭建起来。
环境
创建三台虚拟机,本教程采用的Linux是CentOS7.6版本,Docker的版本是19.03.13,Ceph的版本是nautilus。三台虚拟机的情况如下:
| 主机名称 | 主机IP | 说明 |
|---|---|---|
| ceph1 | 192.168.161.137 | 容器主节点(Dashbaord、mon、rgw、mgr、osd) |
| ceph2 | 192.168.161.135 | 容器子节点(mon、rgw、mgr、osd) |
| ceph3 | 192.168.161.136 | 容器子节点(mon、rgw、mgr、osd) |
预检
部署Ceph之前我们需要对自身机器的环境做一个预检查。主要涉及到防火墙,主机名等设置。
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 关闭selinux(linux的安全子系统)
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
PS: 正式环境实际部署时,最好通过加入IP白名单的方式来操作,而不是直接关闭防火墙。 3. 设置主机名,分别把三台虚拟机的主机名设置成ceph1,ceph2,ceph3。
hostnamectl set-hostname ceph1
hostnamectl set-hostname ceph2
hostnamectl set-hostname ceph3
- 在主节点ceph1配置免密登录到ceph2和ceph3,下面命令在主节点ceph1上执行。
#在192.168.161.133(ceph1)上执行:
ssh-keygen
#把密钥发给ceph2、ceph3
ssh-copy-id ceph2
ssh-copy-id ceph3
- 在三个节点上分别执行下列命令配置host。
cat >> /etc/hosts <<EOF
192.168.161.137 ceph1
192.168.161.135 ceph2
192.168.161.136 ceph3
EOF
- 打开ntp服务
ntp服务的作用是用于同步不同机器的时间。如果不打开ntp服务的话,则有可能会出现
clock skew detected on mon.ceph1, mon.ceph2这种问题。
#查看ntp,如果状态是inactive,则表示没启动
systemctl status ntpd
#启动ntp服务
systemctl start ntpd
#设置开启自启动ntp服务
systemctl enable ntpd
- 其他配置 把容器内的 ceph 命令 alias 到本地,方便使用,其他 ceph 相关命令也可以参考添加:
echo 'alias ceph="docker exec mon ceph"' >> /etc/profile
source /etc/profile
上面的预检做完之后,下面我们就开始具体的部署。
部署
1. 创建Ceph目录
在宿主机上创建Ceph目录与容器建立映射,便于直接操纵管理Ceph配置文件,以root身份在主要节点ceph1上创建这四个文件夹,命令如下:
mkdir -p /usr/local/ceph/{admin,etc,lib,logs}
该命令会一次创建4个指定的目录,注意逗号分隔,不能有空格。 其中: admin文件夹下用于存储启动脚本, etc文件夹下存放了ceph.conf等配置文件 lib文件夹下存放了各组件的密钥文件 logs文件夹下存放了ceph的日志文件。 2. 对docker内用户进行授权
chown -R 167:167 /usr/local/ceph/ #docker内用户id是167,这里进行授权
2. 安装docker(省略,见上文,三台机器)
3. 创建OSD磁盘
-
创建OSD磁盘 OSD服务是对象存储守护进程,负责把对象存储到本地文件系统,必须要有一块独立的磁盘作为存储。
-
如果没有独立磁盘,我们可以在Linux下面创建一个虚拟磁盘进行挂载,步骤如下: 2.1. 初始化10G的镜像文件:
mkdir -p /usr/local/ceph-disk dd if=/dev/zero of=/usr/local/ceph-disk/ceph-disk-01 bs=1G count=102.2. 将镜像文件虚拟成块设备:
losetup -f /usr/local/ceph-disk/ceph-disk-012.3. 格式化(名称根据fdisk -l进行查询):mkfs.xfs -f /dev/loop02.4. 挂载文件系统,就是将loop0磁盘挂载到/dev/osd目录下,``` mkdir -p /dev/osd mount /dev/loop0 /dev/osd ``` -
如果有独立磁盘的话(如果是虚拟机的话,则只需要在VM的设置上添加一个硬盘,如图所示)
3.1 直接格式化( 名称根据fdisk -l进行查询)
mkfs.xfs -f /dev/sdb3.2 挂载文件系统:mkdir -p /dev/osd mount /dev/sdb /dev/osd ``` -
可以通过
df -h命令查看挂载结果
4. 拉取ceph
这里用到了 dockerhub 上最流行的 ceph/daemon 镜像(这里需要拉取nautilus版本的ceph,latest-nautilus)
docker pull ceph/daemon:latest-nautilus
5. 编写脚本(脚本都放在admin文件夹下)
1. start_mon.sh
!/bin/bash
docker run -d --net=host \
--name=mon \
-v /etc/localtime:/etc/localtime \
-v /usr/local/ceph/etc:/etc/ceph \
-v /usr/local/ceph/lib:/var/lib/ceph \
-v /usr/local/ceph/logs:/var/log/ceph \
-e MON_IP=192.168.161.137,192.168.161.135,192.168.161.136 \
-e CEPH_PUBLIC_NETWORK=192.168.161.0/24 \
ceph/daemon:latest-nautilus mon
这个脚本是为了启动监视器,监视器的作用是维护整个Ceph集群的全局状态。一个集群至少要有一个监视器,最好要有奇数个监视器。方便当一个监视器挂了之后可以选举出其他可用的监视器。启动脚本说明:
- name参数,指定节点名称,这里设为mon
- -v xxx:xxx 是建立宿主机与容器的目录映射关系,包含 etc、lib、logs目录。
MON_IP是Docker运行的IP地址(通过ifconfig来查询,取ens33里的inet那个IP),这里我们有3台服务器,那么MAN_IP需要写上3个IP,如果IP是跨网段的CEPH_PUBLIC_NETWORK必须写上所有网段。CEPH_PUBLIC_NETWORK配置了运行Docker主机所有网段 这里必须指定nautilus版本,不然会默认操作最新版本ceph,mon必须与前面定义的name保持一致。 2. start_osd.sh
#!/bin/bash
docker run -d \
--name=osd \
--net=host \
--restart=always \
--privileged=true \
--pid=host \
-v /etc/localtime:/etc/localtime \
-v /usr/local/ceph/etc:/etc/ceph \
-v /usr/local/ceph/lib:/var/lib/ceph \
-v /usr/local/ceph/logs:/var/log/ceph \
-v /dev/osd:/var/lib/ceph/osd \
ceph/daemon:latest-nautilus osd_directory
这个脚本是用于启动OSD组件的,OSD(Object Storage Device)是RADOS组件,其作用是用于存储资源。
脚本说明:
1. name 是用于指定OSD容器的名称
2. net 是用于指定host,就是前面我们配置host
3. restart指定为always,使osd组件可以在down时重启。
4.privileged是用于指定该osd是专用的。
这里我们采用的是osd_directory 镜像模式
3. start_mgr.sh
#!/bin/bash
docker run -d --net=host \
--name=mgr \
-v /etc/localtime:/etc/localtime \
-v /usr/local/ceph/etc:/etc/ceph \
-v /usr/local/ceph/lib:/var/lib/ceph \
-v /usr/local/ceph/logs:/var/log/ceph \
ceph/daemon:latest-nautilus mgr
这个脚本是用于启动mgr组件,它的主要作用是分担和扩展monitor的部分功能,提供图形化的管理界面以便我们更好的管理ceph存储系统。其启动脚本比较简单,在此不再赘述。 4. start_rgw.sh
#!/bin/bash
docker run \
-d --net=host \
--name=rgw \
-v /etc/localtime:/etc/localtime \
-v /usr/local/ceph/etc:/etc/ceph \
-v /usr/local/ceph/lib:/var/lib/ceph \
-v /usr/local/ceph/logs:/var/log/ceph \
ceph/daemon:latest-nautilus rgw
该脚本主要是用于启动rgw组件,rgw(Rados GateWay)作为对象存储网关系统,一方面扮演RADOS集群客户端角色,为对象存储应用提供数据存储,另一方面扮演HTTP服务端角色,接受并解析互联网传送的数据。
6. 执行脚本
启动mon
- 首先在主节点ceph1上执行start_mon.sh脚本,启动后通过
docker ps -a|grep mon查看启动结果,启动成功之后生成配置数据,在ceph主配置文件中,追加如下内容:
cat >>/usr/local/ceph/etc/ceph.conf <<EOF
# 容忍更多的时钟误差
mon clock drift allowed = 2
mon clock drift warn backoff = 30
# 允许删除pool
mon_allow_pool_delete = true
[mgr]
# 开启WEB仪表盘
mgr modules = dashboard
[client.rgw.ceph1]
# 设置rgw网关的web访问端口
rgw_frontends = "civetweb port=20003"
EOF
- 拷贝所有数据(已包含脚本)到另外2台服务器
scp -r /usr/local/ceph ceph2:/usr/local/
scp -r /usr/local/ceph ceph3:/usr/local/
- 通过远程ssh,在ceph2和ceph3上依次启动mon(启动前不要修改ceph.conf文件)
ssh ceph2 bash /usr/local/ceph/admin/start_mon.sh
ssh ceph3 bash /usr/local/ceph/admin/start_mon.sh
启动后通过 ceph -s查看集群状态,如果能够看到ceph2和ceph3,则表示集群创建成功,此时的状态应该是HEALTH_OK状态。
启动OSD
在执行start_osd.sh脚本之前,首先需要在mon节点生成osd的密钥信息,不然直接启动会报错。命令如下:
docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
接着在主节点下执行如下命令:
bash /usr/local/ceph/admin/start_osd.sh
ssh ceph2 bash /usr/local/ceph/admin/start_osd.sh
ssh ceph3 bash /usr/local/ceph/admin/start_osd.sh
全部osd都启动之后,稍等片刻后,执行ceph -s查看状态,应该可以看到多了如下信息(总共3个osd)
osd: 3 osds: 3 up, 3 in
PS: osd的个数最好维持在奇数个。
启动mgr
直接在主节点ceph1上执行如下三个命令:
bash /usr/local/ceph/admin/start_mgr.sh
ssh ceph2 bash /usr/local/ceph/admin/start_mgr.sh
ssh ceph3 bash /usr/local/ceph/admin/start_mgr.sh
启动rgw
同样的我们首先还是需要先在mon节点生成rgw的密钥信息,命令如下:
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
接着在主节点ceph1上执行如下三个命令:
bash /usr/local/ceph/admin/start_rgw.sh
ssh ceph2 bash /usr/local/ceph/admin/start_rgw.sh
ssh ceph3 bash /usr/local/ceph/admin/start_rgw.sh
启动完成之后再通过ceph-s查看集群的状态
安装Dashboard管理后台
首先确定主节点,通过ceph -s命令查看集群状态,找到mgr为active的那个节点,如下:
mgr: ceph1(active), standbys: ceph2, ceph3
这里的主节点就是ceph1节点。
- 开启dashboard功能
docker exec mgr ceph mgr module enable dashboard
- 创建登录用户与密码
docker exec mgr ceph dashboard set-login-credentials admin test
这里设置用户名为admin,密码为test。 3. 配置外部访问端口个,这里指定端口号是18080,可以自定义修改
docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080
- 配置外部访问地址,这里我的主节点IP是192.168.161.137,你需要换成自己的IP地址。
docker exec mgr ceph config set mgr mgr/dashboard/server_addr 192.168.161.137
- 关闭https(如果没有证书或内网访问, 可以关闭)
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
- 重启Mgr DashBoard服务
docker restart mgr
- 查看Mgr DashBoard服务
docker exec mgr ceph mgr services
最后通过 http://192.168.161.137:18080/#/dashboard 访问。
查看整个集群信息
至此,整个集群就已经搭建完毕,通过ceph -s命令,可以查看整个集群信息,我们规划的所有节点都已创建成功并加入集群
总结
本文介绍了通过docker部署ceph集群的详细步骤,本文只是启动了核心的必要的组件,一共有 mon,osd,mgr,rgw四个组件,其中mon,osd,mgr组件是必须要启动的,rgw组件是作为对象存储的网关系统,如果不用对象存储的话则不需要启动该组件,其他的组件入mds也只是cephFS才需要用到。后面文章会详细介绍这些组件的作用,本文主要是将集群搭建起来。
参考
Centos7系统Docker Ceph 集群的安装配置(中篇) [基于Docker部署ceph分布式文件系统MImic13.2