Centos7系统Docker Ceph 集群的安装配置(中篇)
目的脉络知行合一
目标
Docker越来越广泛的流行使用, 生产环境逐步采用容器化编排管理,对于Docker的可移植性、隔离性等优势就不必多说了,本篇教程主要讲解如何通过Docker镜像来完成Ceph的集群部署。(其中也有不少大坑, 找了较多的网上教程并未提及,本篇带大家一起来领略下)
脉络
- 集群部署规划
- 安装Docker服务
- 启动MON服务
- 启动OSD服务
- 启动MGR服务
- 启动RGW服务
- 启动MDS服务
- 安装Dashboard管理后台
- 创建FS文件系统
- 查看整个集群信息
知行
1. 集群部署规划
按照上篇所讲的集群规划, 仍采用三台节点部署, 不同的是IP地址不一样。
  创建三台虚拟机, 本教程采用的是CENTOS7.6版本。
| 主机名称 | 主机IP | 说明 | 
|---|---|---|
| CENTOS7-1 | 172.16.0.126 | 容器主节点(Dashbaord、mon、mds、rgw、mgr、osd) | 
| CENTOS7-2 | 172.16.0.125 | 容器子节点(mon、mds、rgw、mgr、osd) | 
| CENTOS7-3 | 172.16.0.124 | 容器子节点(mon、mds、rgw、mgr、osd) | 
2. 创建Ceph目录
在宿主机上创建Ceph目录与容器建立映射, 便于直接操纵管理Ceph配置文件。
  以root身份依次在三台节点上创建/usr/local/ceph/{admin,data, etc,lib, logs}目录:
[root@CENTOS7-1 ~]# mkdir -p /usr/local/ceph/{admin,data,etc,lib,logs}
该命令会一次创建5个指定的目录, 注意逗号分隔, 不能有空格。
  授予ceph用户权限
[root@CENTOS7-1 ~]# chown -R ceph:ceph /usr/local/ceph
将目录权限赋予ceph用户, 如果仍碰到目录权限问题,可将目录权限全部放开:
[root@CENTOS7-1 ~]# chmod 777 -R  /usr/local/ceph
坑提示: 如果要进行重装, 最好要将所有目录内容文件清空, 避免残留配置影响。
3. 安装Docker服务
在三台节点上安装Docker服务, 如已安装, 可以忽略此步骤。
- 卸载旧版本
  yum -y remove docker docker-common docker-selinux docker-engine
- 安装依赖包
  yum -y install yum-utils device-mapper-persistent-data lvm2
- 配置YUM源
  yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker服务 
 安装最新版Docker, 为避免版本兼容性问题,这里就指定当时所安装的版本18.03.1-ce:yum -y install docker-ce-18.03.1.ce
- 启动服务
  
 并设置开机启动systemctl start dockersystemctl enable docker
- 查看安装的Docker版本
  
 出现以上提示, 代表安装成功。[root@CENTOS7-1 admin]# docker version Client: Version: 18.03.1-ce API version: 1.37 Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:20:16 2018 OS/Arch: linux/amd64 Experimental: false Orchestrator: swarm Server: Engine: Version: 18.03.1-ce API version: 1.37 (minimum version 1.12) Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:23:58 2018 OS/Arch: linux/amd64 Experimental: false
- 修改Docker仓库镜像, 加速下载
 vi /etc/docker/daemon.json
 需要重启Docker服务{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ] }systemctl daemon-reload systemctl restart docker
- 下载Ceph镜像
 这里要注意版本,不要贸然采用最新版, 有些会是存在缺陷, 安装的时候会出现问题, 这里采用的nautilus版本。
 版本说明:
 拉取镜像:本名称 版本号 发布时间 早期版本 … … Luminous 12.2.12 2017年10月 mimic 13.2.7 2018年5月 nautilus 14.2.5 2019年2月 octopus 15.2.1 2020年4月 
 修改版本分支,便于后续使用docker pull ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
 docker images
 修改命令:REPOSITORY TAG IMAGE ID CREATED SIZE ceph/daemon master-7ef46af-nautilus-centos-7-x86_64 6f68932df7dd 10 months ago 946MBdocker tag 6f68932df7dd ceph/daemon:latest
4. 启动MON服务
三台节点上都需安装Mon服务。先在主节点操作。
- 
  在主节点的/usr/local/ceph/admin目录下创建start_mon.sh脚本: 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=172.16.0.126,172.16.0.125,172.16.0.124 \ -e CEPH_PUBLIC_NETWORK=172.16.0.0/24 \ ceph/daemon:latest mon- name参数,指定节点名称, 这里设为mon
- 建立宿主机与容器的目录映射关系,包含etc、lib、logs目录
- MON_IP 参数指定mon服务的节点IP信息
- CEPH_PUBLIC_NETWORK参数,指定mon的ip网段信息(注意这里是24位,将最后一位改为0就可以)。
- 最后指定镜像版本, 采用的是最新镜像, mon为参数, 代表启动的是mon服务,不能乱填。
 
- 
  给脚本增加权限: [root@CENTOS7-1 ~]# chmod 777 -R /usr/local/ceph/admin/start_mon.sh
- 
  启动mon服务: [root@CENTOS7-1 ~]# /usr/local/ceph/admin/start_mon.sh
- 
  创建Ceph配置文件 vi /usr/local/ceph/etc/ceph.conf配置内容及说明: [global] fsid = 646aa796-0240-4dd8-83b3-8781779a8feb # mon节点名称 mon initial members = CENTOS7-1 # mon 主机地址信息 mon host = 172.16.0.126,172.16.0.125,172.16.0.124 # 对外访问的IP网段 public network = 172.16.0.0/24 # 集群IP网段 cluster network = 172.16.0.0/24 # journal 大小 , 一般设为(磁盘带宽 * 文件同步刷新时间)的2倍 osd journal size = 100 # 设置pool池默认分配数量 osd pool default size = 2 # 容忍更多的时钟误差 mon clock drift allowed = 10 mon clock drift warn backoff = 30 # 允许删除pool mon_allow_pool_delete = true [mgr] # 开启WEB仪表盘 mgr modules = dashboard [client.rgw.CENTOS7-1] # 设置rgw网关的web访问端口 rgw_frontends = "civetweb port=20003"
- 
  检查mon服务状态, 
 出现HEALTH_OK代表服务启动成功:[root@CENTOS7-1 admin]# docker exec -it mon ceph -s cluster: id: 646aa796-0240-4dd8-83b3-8781779a8feb health: HEALTH_OK
- 
  将主节点配置复制到其他两个节点, 覆盖/usr/local/ceph/目录。 
 远程复制:scp -r /usr/local/ceph/ root@172.16.0.125:/usr/local/ scp -r /usr/local/ceph/ root@172.16.0.124:/usr/local/复制完成之后, 分别在其他两个节点启动mon服务 [root@CENTOS7-2 ~]# /usr/local/ceph/admin/start_mon.sh [root@CENTOS7-3 ~]# /usr/local/ceph/admin/start_mon.sh
- 
  检查集群状态 
 这里我们只搭建了三个mon节点, 正常的话可以看到已成功组件集群:[root@CENTOS7-1 local]# docker exec -it mon ceph -s cluster: id: 646aa796-0240-4dd8-83b3-8781779a8feb health: HEALTH_OK services: mon: 3 daemons, quorum CENTOS7-1,CENTOS7-2,CENTOS7-3 (age 5s) mgr: no daemons active osd: 0 osds: 0 up, 0 in data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 0 B used, 0 B / 0 B avail pgs:
5. 启动OSD服务
以下步骤在三台节点依次处理。
- 
  创建OSD磁盘 
 OSD服务是对象存储守护进程, 负责把对象存储到本地文件系统, 必须要有一块独立的磁盘作为存储。
 ① 如果没有独立磁盘,怎么办? 可以在Linux下面创建一个虚拟磁盘进行挂载。
 初始化10G的镜像文件:mkdir -p /usr/local/ceph-disk dd if=/dev/zero of=/usr/local/ceph-disk/ceph-disk-01 bs=1G count=10将镜像文件虚拟成块设备: losetup -f /usr/local/ceph-disk/ceph-disk-01格式化: #名称根据fdisk -l进行查询确认, 一般是/dev/loop0 mkfs.xfs -f /dev/loop0挂载文件系统: mkdir -p /usr/local/ceph/data/osd/ mount /dev/loop0 /usr/local/ceph/data/osd/② 如果有独立磁盘的话,那就简单一些。 
 直接格式化:#名称根据fdisk -l进行查询 mkfs.xfs -f /dev/sdb挂载文件系统: mkdir -p /usr/local/ceph/data/osd/ mount /dev/sdb /usr/local/ceph/data/osd/
- 
  创建OSD服务启动脚本 vi /usr/local/ceph/admin/start_osd.sh脚本内容: docker run -d \ --name=osd \ --net=host \ --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 /usr/local/ceph/data/osd:/var/lib/ceph/osd \ ceph/daemon:latest osd_directory再赋予权限: chmod 777 /usr/local/ceph/admin/start_osd.sh说明: 这里我们采用的是osd_directory镜像模式,如果有独立磁盘的话, 也可以采用osd_ceph_disk模式, 不需格式化, 直接指定设备名称即可OSD_DEVICE=/dev/sdb。 
- 
  创建OSD密钥文件 
 这里有个坑, 如果不创建密钥, 直接启动脚本会出现错误:2019-12-08 23:56:26 /opt/ceph-container/bin/entrypoint.sh: static: does not generate config 2019-12-08 23:56:26 /opt/ceph-container/bin/entrypoint.sh: Creating osd [errno 13] error connecting to the cluster或者错误: docker ceph var/lib/ceph/bootstrap-osd ceph.keyring must exist. You can extract it from your curren ...创建密钥文件的命令(三台mon节点都需执行): docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring注意, 该命令是在容器mon节点服务上执行。 
- 
  启动osd节点 
 最后执行/usr/local/ceph/admin/start_osd.sh脚本, 启动osd服务。
 检查容器是否启动成功:[root@CENTOS7-1 admin]# docker ps -a | grep osd 8294effe52dc ceph/daemon:latest "/opt/ceph-container…" 1 days ago Up 1 days osd
- 
  如果osd启动失败, 检查确认目录权限 chown 167:167 -R /usr/local/ceph chmod 777 -R /usr/local/ceph
6. 启动mgr服务
依次在三台节点上执行。
- 创建启动脚本
  
 脚本内容:vi /usr/local/ceph/admin/start_mgr.shdocker 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 mgr
- 启动服务
 执行/usr/local/ceph/admin/start_mgr.sh脚本。[root@CENTOS7-1 admin]# docker ps -a | grep mgr a98d2a2ab893 ceph/daemon "/opt/ceph-container…" 1 days ago Up 1 days mgr
7. 启动rgw服务
依次在三台节点上执行。
- 
  创建启动脚本 vi /usr/local/ceph/admin/start_rgw.sh脚本内容: 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 rgw
- 
  在mon节点生成rgw密钥信息 docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
- 
  启动服务 
 执行/usr/local/ceph/admin/start_mgr.sh脚本。[root@CENTOS7-1 admin]# docker ps -a | grep rgw f81e2b9641bb ceph/daemon "/opt/ceph-container…" 1 days ago Up 1 days rgw
8. 启动mds服务
依次在三台节点上执行。
- 
  创建启动脚本 vi /usr/local/ceph/admin/start_mds.sh脚本内容: docker run -d \ --net=host \ --name=mds \ --privileged=true \ -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 CEPHFS_CREATE=0 \ -e CEPHFS_METADATA_POOL_PG=512 \ -e CEPHFS_DATA_POOL_PG=512 \ ceph/daemon mds说明下: 
 CEPHFS_CREATE 是为METADATA服务生成文件系统, 0表示不自动创建文件系统(默认值), 1表示自动创建。
 CEPHFS_DATA_POOL_PG是数据池的数量,默认为8。
 CEPHFS_METADATA_POOL_PG是元数据池的数量,默认为8。
- 
  启动服务 
 执行/usr/local/ceph/admin/start_mds.sh脚本。[root@CENTOS7-1 admin]# docker ps -a | grep mds f5daf99bf325 ceph/daemon "/opt/ceph-container…" 1 days ago Up 1 days mds
9. 安装Dashboard管理后台
在主节点执行即可。
- 
  开启dashboard功能 docker exec mgr ceph mgr module enable dashboard
- 
  创建证书 docker exec mgr ceph dashboard create-self-signed-cert
- 
  创建登陆用户与密码: docker exec mgr ceph dashboard set-login-credentials admin test设置用户名为admin, 密码为test。 
- 
  配置外部访问端口 docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080
- 
  配置外部访问IP docker exec mgr ceph config set mgr mgr/dashboard/server_addr $IP
- 
  关闭https(如果没有证书或内网访问, 可以关闭) docker exec mgr ceph config set mgr mgr/dashboard/ssl false
- 
  重启Mgr DashBoard服务 docker restart mgr
- 
  查看Mgr DashBoard服务信息 [root@CENTOS7-1 admin]# docker exec mgr ceph mgr services { "dashboard": "http://0.0.0.0:18080/" }管理控制台界面:  
10. 创建FS文件系统
在主节点执行即可。
- 
  创建Data Pool: docker exec osd ceph osd pool create cephfs_data 128 128
- 
  创建Metadata Pool: docker exec osd ceph osd pool create cephfs_metadata 64 64注意: 如果受mon_max_pg_per_osd限制, 不能设为128,可以调小点, 改为64。 
- 
  创建CephFS: docker exec osd ceph fs new cephfs cephfs_metadata cephfs_data将上面的数据池与元数据池关联, 创建cephfs的文件系统。 
- 
  查看FS信息: [root@CENTOS7-1 admin]# docker exec osd ceph fs ls name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
11. 查看整个集群信息
至此, 整个集群就已经搭建完毕, 通过ceph -s 命令, 可以查看整个集群信息,我们规划的所有节点都已创建成功并加入集群。
[root@CENTOS7-1 admin]# docker exec mon ceph -s
 cluster:
   id:     646aa796-0240-4dd8-83b3-8781779a8feb
   health: HEALTH_OK
 services:
   mon: 3 daemons, quorum CENTOS7-1,CENTOS7-2,CENTOS7-3 (age 6d)
   mgr: CENTOS7-1(active, since 6d), standbys: CENTOS7-3, CENTOS7-2
   mds: cephfs:1 {0=CENTOS7-1=up:active} 2 up:standby
   osd: 3 osds: 3 up (since 6d), 3 in (since 6d)
   rgw: 3 daemons active (CENTOS7-1, CENTOS7-2, CENTOS7-3)
 data:
   pools:   8 pools, 360 pgs
   objects: 256 objects, 46 KiB
   usage:   3.3 GiB used, 27 GiB / 30 GiB avail
   pgs:     360 active+clean
12. 关于重启mon服务失败问题
如果修改了配置或者宿主机出现问题, 需要重启mon服务, 会出现不能正常启动的问题,查看容器日志, 最后一行提示:
Existing mon, trying to rejoin cluster abort
没有具体的原因, 解决的办法是删除/usr/local/ceph/lib/mon目录, 再重新启动, 但这会破坏原有配置与数据, 影响集群的正常运转,这是我们不能接受的, 无耐,只有研究它的启动脚本。( 这不是Docker容器问题, 是Ceph的镜像脚本编写有点问题。) 将脚本拷贝出来:
docker cp mon:/opt/ceph-container/bin/start_mon.sh .
找到并修改以下内容:
# 注释此行,直接将v2v1复制为2,代表是走V2协议, 以指定IP方式加入集群
#v2v1=$(ceph-conf -c /etc/ceph/${CLUSTER}.conf 'mon host' | tr ',' '\n' | grep -c ${MON_IP})
v2v1=2
再将脚本复制至容器内:
docker cp start_mon.sh mon:/opt/ceph-container/bin/start_mon.sh 
这样就搞定了, 大伙又可以愉快的重启玩转Ceph集群了。
合一
- 本章教程讲解了通过Docker Ceph完成了整个集群的搭建,通过容器镜像,可以简化一些配置,但是也多出一些容器脚本的配置, 大家要注意不要搞混淆了。这里容器网络都是采用HOST主机模式, 便于Ceph集群内外部的通讯, 大家也可以根据自己的需要, 组建不同的网络模式。
- Docker Ceph 镜像最新版难免会有些坑, 在生产环境当中, 建议大家选用稳定版, 尝鲜就在实验中试试就行了。
- Docker Ceph集群创建好了, 在实际环境当中如何去调用? rgw服务在librados之上向应用提供访问ceph集群的RestAPI,支持Amazon S3和openstack swift两种接口, 下篇会针对Java Swift Api 封装与调用来做讲解。
本文由mirson创作分享,如需进一步交流,请加QQ群:19310171或访问www.softart.cn
更多推荐
 
 




所有评论(0)