测试环境:Ubuntu20.04

版本

  • v14.2.22 Nautilus released
  • v15.2.14 Octopus released
  • v16.2.5 Pacific released 最新版本,建议使用此版本?

This is the fifth backport release in the Pacific series. We recommend all Pacific users update to this release.

概念介绍

什么是Ceph存储?什么是分布式存储?

ceph介绍

Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能

RGW、RBD、CephFS ==> RADOS ==> librados

  • CEPH 对象存储
  • CEPH 块设备
  • CEPH 文件系统

cephadm介绍

Cephadm 是随着 Ceph 新版本 v15.2.0(Octopus)发布的安装工具,并且不支持 Ceph 的旧版本,Ceph 中已经 Cephadm 不依赖于外部配置工具,如 Ansible、 Rook 和 Salt,它通过 SSH 将管理器守护进程连接到主机来实现这一点。管理器守护进程可以添加、删除和更新 Ceph 容器。类似迷你版本的kubernetes,cephadm实际上就是一个编排工具。

环境准备

节点规划:

主机名 public-ip cluster-ip 磁盘 角色
ceph1 10.0.26.180 172.0.26.180 系统盘: sdaosd盘: sdb cephadm,monitor,mgr,rgw,mds,osd,nfs
ceph2 10.0.26.190 172.0.26.190 系统盘: sdaosd盘: sdb monitor,mgr,rgw,mds,osd,nfs
ceph3 10.0.26.191 172.0.26.191 系统盘: sdaosd盘: sdb monitor,mgr,rgw,mds,osd,nfs
# 分别设置主机名
hostnamectl set-hostname ceph1
hostnamectl set-hostname ceph2
hostnamectl set-hostname ceph3

# 增加解析
cat >> /etc/hosts <<EOF
172.0.26.180 ceph1
172.0.26.190 ceph2
172.0.26.191 ceph3
EOF

cephadm依赖

所有节点都需要安装依赖环境,因为cephadm类似k8s,通过容器进行管理

  • Python3
  • Systemd
  • Podman or Docker(直接使用Docker就行了)
  • chrony or NTP
  • LVM2

cephadm安装

https://docs.ceph.com/en/latest/cephadm/install/

# 官方文档中还提到了另一种安装cephadm方式,就是通过apt install -y cephadm安装,实践证明最好不要使用这种方式,这种方式安装的cephadm可能不是最新版本的,但cephadm去拉的容器版本又是最新的,会导致两个版本不一致!
# cephadm:基于 python3 编写的一个脚本
# --location 用于处理重定向
curl -o cephadm --location https://github.com/ceph/ceph/raw/pacific/src/cephadm/cephadm
chmod +x cephadm
# 指定最新发布的版本为:pacific,其实就是新增源,不同的系统自动指定:/etc/apt/sources.list.d/ceph.list
./cephadm add-repo --release pacific
# 安装指定版本的cephadm到/usr/sbin/cephadm
./cephadm install && rm -fv ./cephadm
# 用新安装指定版本的cephadm安装ceph所有命令行
cephadm install ceph-common
# apt install -y cephadm依赖包
# The following additional packages will be installed:
#  bridge-utils containerd dns-root-data dnsmasq-base docker.io libidn11 pigz runc ubuntu-fan

引导新的群集

cephadm bootstrap的处理步骤如下:

  • Create a monitor and manager daemon for the new cluster on the local host.
  • Generate a new SSH key for the Ceph cluster and add it to the root user’s /root/.ssh/authorized_keys file.
  • Write a copy of the public key to /etc/ceph/ceph.pub.
  • Write a minimal configuration file to /etc/ceph/ceph.conf. This file is needed to communicate with the new cluster.
  • Write a copy of the client.admin administrative (privileged!) secret key to /etc/ceph/ceph.client.admin.keyring.
  • Add the _admin label to the bootstrap host. By default, any host with this label will (also) get a copy of /etc/ceph/ceph.conf and /etc/ceph/ceph.client.admin.keyring.
# 初始化集群,注意留意生成的 web 账号信息,默认是ceph网络的ip
# 通常不会使用root用户,具有sudo免密的用户即可
cephadm bootstrap --mon-ip 172.0.26.180 --ssh-user zaza

# ceph网络的ip可能无法直接访问
https://172.0.26.180:8443/

# 查看镜像
docker images

# 查看容器
docker ps

# 查看所有组件状态
ceph orch ps

# 查看某个组件运行状态
ceph orch ps --daemon-type mds
ceph orch ps --daemon-type mgr

# 查看集群状态
ceph status

添加主机

# 通常不会使用root账号,具有sudo免密的账号即可
ssh-copy-id -f -i /etc/ceph/ceph.pub zaza@ceph2
ssh-copy-id -f -i /etc/ceph/ceph.pub zaza@ceph3

# 添加主机
# 添加成功后会创建以下服务(mgr总共置放了两个,所有ceph2和ceph3其中一个才有):
# ceph orch ps|grep ceph2
# crash.ceph2 mgr.ceph2.dyhlvv mon.ceph2 node-exporter.ceph2
ceph orch host add ceph2 172.0.26.190
ceph orch host add ceph3 172.0.26.191

# 查看主机
ceph orch host ls

# 查看哪些设备可以用于添加OSD(Available为Yes,代表可以添加,NO代表添加完成)
ceph orch device ls

添加OSD

ceph底层服务器对象,必须添加(服务于Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能。)

OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。主要功能是存储数据、复制数据、平衡数据、恢复数据,以及与其它OSD间进行心跳检查,负责响应客户端请求返回具体数据的进程等;

添加OSD需求满足以下所有条件:

  • 设备必须没有分区。
  • 设备不得具有任何LVM状态。
  • 不得安装设备。
  • 该设备不得包含文件系统。
  • 该设备不得包含Ceph BlueStore OSD。
  • 设备必须大于5 GB。
# 为自动添加所有满足条件的OSD
# ceph orch apply osd --all-available-devices
# 通过手工指定的方式添加OSD(添加进程:osd.x,一个硬盘对应一个)
ceph orch daemon add osd ceph1:/dev/sdb
ceph orch daemon add osd ceph2:/dev/sdb
ceph orch daemon add osd ceph3:/dev/sdb

# 查看(Available为Yes,代表可以添加,NO代表添加完成)
ceph orch device ls

查看服务类型

https://127.0.0.1:8443/#/services/create

部署RGW

本次测试主要是文件系统,所以不需要部署:CEPH 对象存储 网关

Ceph RGW基于librados,是为应用提供RESTful类型的对象存储接口。RGW提供两种类型的接口:

  • S3:兼容Amazon S3RESTful API
  • Swift:兼容OpenStack Swift API
# placement为三个,也可以是所有或者匹配主机
ceph orch apply rgw rgw --placement=3
# 查看服务
ceph orch ls | grep rgw.rgw
# 查看进程
ceph orch ps | grep rgw.rgw
# 集成到dashboard(查看access_key和secret_key分别保存到secret_key.txt和access_key.txt)
radosgw-admin user create --uid=rgw --display-name=rgw --system
# 保存(后续版本可以不需要操作此步骤了)
ceph dashboard set-rgw-api-access-key -i access_key.txt
ceph dashboard set-rgw-api-secret-key -i secret_key.txt

部署Cephfs

本次测试重点:文件存储功能

Ceph 文件系统( CephFS )是个与 POSIX 标准兼容的文件系统,它建立在 Ceph 的分布式对象存储 RADOS 之上。

ceph fs volume create cephfs --placement=3

# 查看状态
ceph orch ls | grep cephfs
ceph orch ps | grep cephfs

授权并挂载Cephfs

授权示例

######################管理节点######################
# 查看授权
ceph auth ls

# 授权
# 可以创建文件,但是不能写入数据,因为mds元数据有w权限
# 问题:/test/目录下任然无法写入数据
# ceph auth get-or-create client.0 mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs.cephfs.data/test/'
# 用户名可以是id也可以是name
ceph auth get-or-create client.0 mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs.cephfs.data'

# 查看keyring数据
# ceph auth get client.admin
ceph auth get client.0

######################客户端######################
# 查看mount支持的挂载类型
# grep ceph /proc/filesystems
# 通过fuse挂载
apt install -y ceph-fuse

# 创建配置文件
# 这里有个坑:xshell+ubuntu,下面的数据会变成:ceph.ckey这种类型的,因为前面的空格是tab键
# root@ceph3:/etc/ceph# cat > /etc/ceph/ceph.client.0.keyring << 'EOF'
# > [client.0]
# > ceph.ckey = AQAJmyhho5xMHBAAVx68eqqaamMxZd2539y27Q==
# > ceph.ccaps mds = "allow r, allow rw path=/"
# > ceph.ccaps mon = "allow r"
# > ceph.ccaps osd = "allow rw pool=cephfs.cephfs.data"
# > EOF
# 注意:生成的数据需要将tab键改成空格键,或者是vim添加
cat > /etc/ceph/ceph.client.0.keyring << "EOF"
[client.0]
    key = AQAJmyhho5xMHBAAVx68eqqaamMxZd2539y27Q==
    caps mds = "allow r, allow rw path=/"
    caps mon = "allow r"
    caps osd = "allow rw pool=cephfs.cephfs.data"
EOF

# 挂载
# cephadm节点上面可以直接执行: ceph-fuse -m ceph1:6789,ceph2:6789,ceph3:6789 -r / /mnt/cephfs
ceph-fuse -m ceph1:6789,ceph2:6789,ceph3:6789 -r / /mnt/cephfs --name=client.0

部署NFS

建议测试

自从Jewel版本,nfs-ganesha开始支持ceph,并且把对接点选择了radosGanesha支持两种方式将Ceph导出为NFS,一种通过RGW,一种通过CephFS,通过FSAL模块 连接到RGW或者CephFS, 其中,FSAL_RGW调用librgw2NFS协议转义为S3协议再通过RGW存入到Ceph中,FSAL_CEPH 调用libcephfs1NFS转义为Cephfs协议再存入到Ceph 中。所以需要额外安装这两个包。

伪版本(pseudo-version)

Pseudo说明

squash说明

# 创建pool池的名称为:ganesha_data
ceph osd pool create ganesha_data 32
# 查看资源池
ceph osd pool ls
# 将资源池用于nfs app程序
ceph osd pool application enable ganesha_data nfs

# 部署nfs Service,并将svc_id设置为nfs,ganesha_data为pool池的资源名称
# 使用web,更加直观的显示:https://127.0.0.1:8443/#/services/create
# ceph orch apply nfs <svc_id> [<placement>] [<pool>]
ceph orch apply nfs nfs ganesha_data --placement=3

# 查看状态
ceph orch ls | grep nfs.nfs
ceph orch ps | grep nfs

将CephFS映射到nfs

通过web,将CephFS映射到nfs,当然也可以不用映射,直接使用NFS服务即可

这里主要实现了将CephFS转换成nfs协议访问

伪版本(pseudo-version)

https://127.0.0.1:8443/#/nfs/create

web关键配置信息:

  • Daemons记得添加
  • CephFS Path: / 源数据
  • Pseudo: /cephfs nfs映射的目录
  • Add clients 客户端权限控制
  • 此时:/mnt/cephfs数据和/mnt/nfs/cephfs是一致的了

挂载NFS

# 安装依赖包
apt install -y nfs-common

# 只支持单ip,所以需要nfs-ingress实现高可用
mount ceph1:/ /mnt/nfs
# 安装负载均衡器后,可以直接只要负载均衡器的ip
# 当前还有问题:mount.nfs: requested NFS version or transport protocol is not supported
# mount -o port=2050 172.0.26.200:/nfs /mnt/nfs

部署iSCSi

CEPH 块设备,没有需求占时不测试

# 创建iscsi所需求的池
ceph osd pool create iscsi_pool 32 32
ceph osd pool application enable iscsi_pool iscsi

# 应用配置文件(参数太多不方便)
cat > iscsi.yaml << 'EOF'
service_type: iscsi
service_id: gw
placement:
  hosts:
    - ceph1
    - ceph2
    - ceph3
spec:
  pool: iscsi_pool
  trusted_ip_list: "172.0.26.180,172.0.26.190,172.0.26.191"
  api_user: admin
  api_password: admin
  api_secure: false
EOF

# 应用
ceph orch apply -i iscsi.yaml

# 查看状态
ceph orch ls | grep iscsi
ceph orch ps | grep iscsi

部署rbd-mirror

ceph orch apply rbd-mirror --placement=3

# 查看状态
ceph orch ls | grep rbd-mirror
ceph orch ps | grep rbd-mirror

部署Cephfs-mirror

快照工具?

ceph orch apply cephfs-mirror --placement=3

# 查看状态
ceph orch ls | grep cephfs-mirror
ceph orch ps | grep cephfs-mirror

查看所有服务

ceph -s

添加rgw-ingress

在前几个步骤中我们添加了RGW和NFS,并且都部署了3个Deamon,但其实三个还是独立服务的,也就是前端没有负载均衡实现统一访问,在Cephadm中将haproxy和keepalived两个封装成了ingress服务

注意这里的backend_service一定要通过ceph orch ls查看到实际的名称为准, frontend_port为VIP的端口,注意到这里有个 monitor_port这个的意思是haproxy 状态页端口。

# 配置文件
cat > rgw-ingress.yaml << 'EOF'
service_type: ingress
service_id: rgw.rgw
placement:
  count: 3
spec:
  backend_service: rgw.rgw
  virtual_ip: 172.0.26.200/24
  frontend_port: 8080
  monitor_port: 1967
EOF

# 应用
ceph orch apply -i rgw-ingress.yaml

# 查看
ceph orch ls | grep ingress.rgw.rgw
ceph orch ps | egrep 'haproxy.rgw.rgw|keepalived.rgw.rgw'

添加nfs-ingress

# 配置文件
cat > nfs-ingress.yaml << 'EOF'
service_type: ingress
service_id: nfs.nfs
placement:
  count: 3
spec:
  backend_service: nfs.nfs
  virtual_ip: 172.0.26.200/24
  frontend_port: 2050
  monitor_port: 1968
EOF

# 应用
ceph orch apply -i nfs-ingress.yaml

# 查看
ceph orch ls | grep ingress.nfs.nfs
ceph orch ps | egrep 'haproxy.nfs.nfs|keepalived.nfs.nfs'

重置dashboard密码

# 必须通过文件读取密码
echo mnBgUHoDLeTMkQOMVaGD > change_password
ceph dashboard ac-user-set-password admin -i change_password

参考