一、ceph集群部署
本文章参考文档:https://blog.csdn.net/hxx688/article/details/103440967
Ceph镜像
这里要注意版本,不要贸然采用最新版, 有些会是存在缺陷, 安装的时候会出现问题, 这里采用的nautilus版本。
版本说明:
docker pull ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
调整防火墙端口
# firewall-cmd--zone=public --add-port=6789/tcp –permanent
# firewall-cmd--zone=public --add-port=6800-7100/tcp–permanent
# firewall-cmd–reload
# firewall-cmd--zone=public --list-all
官方参照文档
前置条件
hostname | ip |
---|---|
test1 | 192.168.180.45 |
test2 | 192.168.180.46 |
test3 | 192.168.180.47 |
安装 Docker-Compose
创建文件夹为部署ceph
做准备
[root@test1 ~]# mkdir -p /home/compose /etc/ceph/ /var/lib/ceph/
[root@test1 ~]# ssh test2 mkdir -p /home/compose /etc/ceph/ /var/lib/ceph/
[root@test1 ~]# ssh test3 mkdir -p /home/compose /etc/ceph/ /var/lib/ceph/
如果启用了SELinux,则运行以下命令, 给文件夹授权, 否则这一步可以跳过
[root@test1 ~]# chcon -Rt svirt_sandbox_file_t /etc/ceph && chcon -Rt svirt_sandbox_file_t /var/lib/ceph
[root@test1 ~]# ssh test2 chcon -Rt svirt_sandbox_file_t /etc/ceph && ssh test2 chcon -Rt svirt_sandbox_file_t /var/lib/ceph
[root@test1 ~]# ssh test3 chcon -Rt svirt_sandbox_file_t /etc/ceph && ssh test3 chcon -Rt svirt_sandbox_file_t /var/lib/ceph
创建文件夹为osd挂载
做准备, 挂载文件夹与分区无关,只要是目录就行, 如果不使用挂载分区
, 这一步可以跳过
[root@test1 ~]# mkdir -p /mnt/cephfs
[root@test1 ~]# ssh test2 mkdir -p /mnt/cephfs
[root@test1 ~]# ssh test3 mkdir -p /mnt/cephfs
(可以不做)下载docker镜像,并推送到自己的 harbor 私服仓库中, 如果已经实现,这一步可以跳过
# 下载镜像
docker pull ceph/daemon:latest-luminous
# 改镜像名
docker tag ceph/daemon:latest-luminous sinoeyes.io/cephlib/ceph/daemon:latest-luminous
# 登录 harbor
docker login sinoeyes.io -u admin -p Harbor12345
# 推送到 harbor
docker push sinoeyes.io/cephlib/ceph/daemon:latest-luminous
如果是重新安装,需要清空缓存, 否则这一步可以跳过
[root@test1 ~]# rm -rf /etc/ceph/* && rm -rf /var/lib/ceph/*
[root@test1 ~]# ssh test2 rm -rf /etc/ceph/ && ssh test2 rm -rf /var/lib/ceph/*
[root@test1 ~]# ssh test3 rm -rf /etc/ceph/ && ssh test3 rm -rf /var/lib/ceph/*
1 创建compose文件,并在(test2、test3)节点上同样创建
注意事项:
MON_IP
不要写多个ip,只写所在服务器的IP即可;如果写多个重启docker以后 mon会启动失败- 这个
/etc/ceph/ceph.conf
文件中的内容所有节点都要要保持一致,不要单独修改内容
cat > /home/compose/docker-compose.yml << eric
version: '3'
services:
# 部署 Monitor 模块
ceph-mon:
# 镜像已经下载到harbor私服
image: ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
network_mode: host
container_name: ceph-mon
restart: always
volumes:
- /etc/localtime:/etc/localtime
- /etc/ceph:/etc/ceph
- /var/lib/ceph/:/var/lib/ceph
environment:
# 当前服务器的IP, 在不同的服务器部署不要忘记改IP
MON_IP: 192.168.180.45,192.168.180.46,192.168.180.47
CEPH_PUBLIC_NETWORK: 192.168.180.1/24
command: mon
# 部署 Manager daemon 模块
ceph-mgr:
image: ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
network_mode: host
container_name: ceph-mgr
restart: always
volumes:
- /etc/localtime:/etc/localtime
- /etc/ceph:/etc/ceph
- /var/lib/ceph/:/var/lib/ceph
command: mgr
# 部署 OSD 模块
ceph-osd:
image: ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
network_mode: host
container_name: ceph-osd
restart: always
privileged: true
# 跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。
pid: host
volumes:
- /etc/localtime:/etc/localtime
- /etc/ceph:/etc/ceph
- /var/lib/ceph/:/var/lib/ceph
- /dev/:/dev/
# 单独指定osd数据空间, 如果不单独指定,默认在/var/lib/ceph目录下
#-/mnt/cephfs:/var/lib/ceph/osd
command: osd_directory
# 部署 MDS 模块 (用来支持 CephFS文件系统存储, 根据实际情况选用,非必须)
ceph-mds:
image: ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
network_mode: host
container_name: ceph-mds
restart: always
volumes:
- /etc/localtime:/etc/localtime
- /etc/ceph:/etc/ceph
- /var/lib/ceph/:/var/lib/ceph
environment:
# CEPHFS_CREATE 是为METADATA服务生成文件系统,0表示不自动创建文件系统(推荐),1表示自动创建
CEPHFS_CREATE: 0
#CEPHFS_DATA_POOL_PG是数据池的数量,默认为8。
CEPHFS_METADATA_POOL_PG: 512
#CEPHFS_METADATA_POOL_PG是元数据池的数量,默认为8。
CEPHFS_DATA_POOL_PG: 512
command: mds
# # 部署 Rados Gateway 模块 (用来支持 对象存储, 根据实际情况选用,非必须)
# ceph-rgw:
# image: sinoeyes.io/cephlib/ceph/daemon:latest-luminous
# network_mode: host
# container_name: ceph-rgw
# restart: always
# volumes:
# - /etc/localtime:/etc/localtime
# - /etc/ceph:/etc/ceph
# - /var/lib/ceph/:/var/lib/ceph
# command: rgw
# # 部署 RBD mirror 模块 (用来支持 块存储, 根据实际情况选用,非必须)
# ceph-rbd:
# image: sinoeyes.io/cephlib/ceph/daemon:latest-luminous
# network_mode: host
# container_name: ceph-rbd
# restart: always
# volumes:
# - /etc/localtime:/etc/localtime
# - /etc/ceph:/etc/ceph
# - /var/lib/ceph/:/var/lib/ceph
# command: rbd_mirror
eric
如果IP跨网段,那么CEPH_PUBLIC_NETWORK
必须写上所有网段,否则就会像网上大部分已有教程一样,只指定一个IP和一个网段是无法启动的!
2 先启动 test1
[root@test1 compose]# docker-compose up -d
3 将多个节点组建成集群
如果要增加同一个集群的Monitor,需要将test1
服务器上的/etc/ceph/
和/var/lib/ceph/bootstrap-*
下的文件,分别复制到test2
、test3
服务器的/etc/ceph/
和/var/lib/ceph/
目录下,记得不要保留文件的属主权限。
[root@test1 compose]# scp -r /etc/ceph/* test2:/etc/ceph/ && scp -r /var/lib/ceph/bootstrap-* test2:/var/lib/ceph/
......
[root@test1 compose]# scp -r /etc/ceph/* test3:/etc/ceph/ && scp -r /var/lib/ceph/bootstrap-* test3:/var/lib/ceph/
ceph.client.admin.keyring 100% 161 116.0KB/s 00:00
ceph.conf 100% 235 204.5KB/s 00:00
ceph.mon.keyring 100% 690 385.9KB/s 00:00
ceph.keyring 100% 113 84.3KB/s 00:00
ceph.keyring 100% 113 50.4KB/s 00:00
ceph.keyring 100% 113 35.3KB/s 00:00
ceph.keyring 100% 113 29.0KB/s 00:00
[root@test1 compose]#
4 启动其它节点机
[root@test1 compose]# ssh test2 docker-compose -f /home/compose/docker-compose.yml up -d
[root@test1 compose]# ssh test3 docker-compose -f /home/compose/docker-compose.yml up -d
5 查看各组件启动是否成功
# 查看 osd 是否加入集群
[root@test1 compose]# docker-compose exec ceph-osd ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.16676 root default
-3 0.05559 host test1
0 hdd 0.05559 osd.0 up 1.00000 1.00000
-5 0.05559 host test2
1 hdd 0.05559 osd.1 up 1.00000 1.00000
-7 0.05559 host test3
2 hdd 0.05559 osd.2 up 1.00000 1.00000
[root@test1 compose]#
其它查看命令
[root@test1 compose]# docker-compose exec ceph-mon ceph -s
cluster:
id: dd864482-6028-4f48-a321-27f9e41c8057
health: HEALTH_WARN
too few PGs per OSD (16 < min 30)
services:
mon: 3 daemons, quorum app01,test1,test2
mgr: app01(active), standbys: test1, test2
mds: cephfs-1/1/1 up {0=app01=up:active}, 2 up:standby
osd: 3 osds: 3 up, 3 in
data:
pools: 2 pools, 16 pgs
objects: 21 objects, 2.19KiB
usage: 88.8GiB used, 82.1GiB / 171GiB avail
pgs: 16 active+clean
[root@test1 compose]# docker-compose exec ceph-mgr ceph -s
[root@test1 compose]# docker-compose exec ceph-mds ceph -s
[root@test1 compose]# docker-compose exec ceph-rgw ceph -s
[root@test1 compose]# docker-compose exec ceph-rbd ceph -s
6 安装Dashboard管理后台
1、在mgr点执行,开启dashboard功能
docker exec ceph-mgr ceph mgr module enable dashboard
2、创建证书
docker exec ceph-mgr ceph dashboard create-self-signed-cert
3、创建登陆用户与密码:
docker exec ceph-mgr ceph dashboard set-login-credentials admin test
设置用户名为admin, 密码为test。
4、配置外部访问端口
docker exec ceph-mgr ceph config set mgr mgr/dashboard/server_port 18080
5、配置外部访问IP
docker exec ceph-mgr ceph config set mgr mgr/dashboard/server_addr 192.168.180.45
6、关闭https(如果没有证书或内网访问, 可以关闭)
docker exec ceph-mgr ceph config set mgr mgr/dashboard/ssl false
7、重启Mgr DashBoard服务
docker restart ceph-mgr
8、查看Mgr DashBoard服务信息
[root@CENTOS7-1 admin]# docker exec ceph-mgr ceph mgr services
{
"dashboard": "http://0.0.0.0:18080/"
}
9、管理控制台界面:
使用 K8S 挂载
注意
:如果想使用 k8s pv 进行挂载,如下的操作就不需要在做了,k8s pv 配置好以后,pod 启动时会自动挂载
测试 内核方式挂载cephfs
明文挂载
# 获取密钥
[root@test1 compose]# docker-compose exec ceph-mon ceph-authtool --print-key /etc/ceph/ceph.client.admin.keyring
AQAzdARew/d7JRAAbwbgRh9p0z8sXCDVsg61eQ==
[root@test1 ~]#
# 挂载之前
[root@test1 ~]# df -h | grep mnt
[root@test1 ~]#
# 挂载目录
[root@test1 ~]# mount -t ceph 192.168.180.46:6789,192.168.180.47:6789,192.168.180.48:6789:/ /mnt/cephfs -o name=admin,secret=AQAzdARew/d7JRAAbwbgRh9p0z8sXCDVsg61eQ==
[root@test1 ~]#
# 挂载之后
[root@test1 compose]# df -h | grep mnt
192.168.180.46:6789,192.168.180.47:6789,192.168.180.48:6789:/ 46G 0 46G 0% /mnt/cephfs
[root@test1 compose]#
# 卸载目录
[root@test1 ~]# umount /mnt/cephfs
注意:当你的当前路径为/mnt下,即在挂载文件的里面时,卸载会失败,提示:Dev is besy.解决办法:退出挂载的目录
当有别的程序正在访问挂载的文件时,也会提示卸载失败,通过 lsof /mnt 查看是哪个进程占用了/mnt,kill -9 $pid ,然后再卸载
使用:umount -l /mnt (-l : 卸载前检查占用该挂载文件的程序并迅速kill掉,以达到快速卸载的目的)
其它节点挂载情况
这里要**注意
** 挂载盘的ip地址都是**192.168.180.46:6789
**,不是每个节点的IP
[root@test2 ~]# mount -t ceph 192.168.180.46:6789,192.168.180.47:6789,192.168.180.48:6789:/ /mnt/cephfs -o name=admin,secret=AQAzdARew/d7JRAAbwbgRh9p0z8sXCDVsg61eQ==
[root@test2 ~]# df -h | grep mnt
192.168.180.46:6789,192.168.180.47:6789,192.168.180.48:6789:/ 46G 0 46G 0% /mnt/cephfs
[root@test2 ~]#
[root@test3 ~]# mount -t ceph 192.168.180.46:6789,192.168.180.47:6789,192.168.180.48:6789:/ /mnt/cephfs -o name=admin,secret=AQAzdARew/d7JRAAbwbgRh9p0z8sXCDVsg61eQ==
[root@test3 ~]# df -h | grep mnt
192.168.180.46:6789,192.168.180.47:6789,192.168.180.48:6789:/ 46G 0 46G 0% /mnt/cephfs
[root@test3 ~]#
二、Ceph常用操作
检查集群监控状况
# docker exec ceph-mon ceph health
HEALTH_OK
检查集群的使用情况
[root@app01 ceph]# docker exec ceph-mon ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
171GiB 82.1GiB 88.8GiB 51.98
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
cephfs_data 1 0B 0 16.1GiB 0
cephfs_metadata 2 2.19KiB 0 16.1GiB 21
检查OSD状态
[root@app01 ceph]# docker exec ceph-mon ceph osd stat
3 osds: 3 up, 3 in
或者
# docker exec ceph-mon ceph osd dump
[root@app01 ceph]# docker exec ceph-mon ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.16676 root default
-3 0.05559 host app01
0 hdd 0.05559 osd.0 up 1.00000 1.00000
-5 0.05559 host test1
1 hdd 0.05559 osd.1 up 1.00000 1.00000
-7 0.05559 host test2
2 hdd 0.05559 osd.2 up 1.00000 1.00000
查看PG
[root@app01 ceph]# docker exec ceph-mon ceph pg dump
[root@app01 ceph]# docker exec ceph-mon ceph pg stat
16 pgs: 16 active+clean; 2.19KiB data, 88.8GiB used, 82.1GiB / 171GiB avail
列出存储池
[root@app01 ceph]# docker exec ceph-mon ceph osd lspools
1 cephfs_data,2 cephfs_metadata,
创建存储池
# docker exec ceph-mon ceph osd pool create data 200
pool 'data' created
data 是存储池的名称
200 是设置的PG数量
设置PG值:
少于5个OSD可把pg_num设置为128
OSD数量在5到10,可以设置pg_num为512
OSD数量在10到50,可以设置pg_num为4096
OSD数量大于50,需要计算pg_num的值
设置存储池最大对象数
# docker exec ceph-mon ceph osd pool set-quota data max_objects 10000
set-quota max_objects = 10000 for pool data
删除存储池
# docker exec ceph-mon ceph osd pool delete data data --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
如果确定要删除存储,需要将pg_name 输入两次,然后写上–yes-i-really-really-mean-it
这里有个提示,修改当前的Monitor配置文件/etc/ceph/ceph.conf
添加参数: mon_allow_pool_delete = true
然后执行 docker restart ceph-mon
# docker exec ceph-mon ceph osd pool delete data data --yes-i-really-really-mean-it
pool 'data' removed
重命名存储池
# docker exec ceph-mon ceph osd pool rename data datanew
pool 'data' renamed to 'datanew'
查看存储池统计信息
# docker exec ceph-mon rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRAED RD_OPS RD WR_OPS WR
datanew 0 0 0 0 0 0 0 0 0 0 0
rbd 0 0 0 0 0 0 0 0 0 0 0
total_objects 0
total_used 420M
total_avail 60989M
total_space 61410M
拍下存储池快照
# docker exec ceph-mon ceph osd pool mksnap datanew data_snap2017
created pool datanew snap data_snap2017
删除存储池快照
# docker exec ceph-mon ceph osd pool rmsnap datanew data_snap2017
removed pool datanew snap data_snap2017
设置对象副本数
# docker exec mon ceph osd pool set datanew size 5
需要注意一下,一个处于降级模式的对象其副本数小于规定值的pool_size, 仍然可以接收I/O请求。为了保证I/O正常,可以设置min_size, 确保数据存储池里任何对象的副本数小于min_size都不接收I/O
# docker exec ceph-mon ceph osd pool set datanew min_size 2
获取对象副本数
# docker exec ceph-mon ceph osd dump|grep 'replicated size'
pool 0 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0
pool 4 'datanew' replicated size 5 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 200 pgp_num 200 last_change 36 flags hashpspool stripe_width 0