Ceph 介绍
为什么要用 Ceph
- Ceph是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,同时提供块存储服务(rbd)、对象存储服务(rgw)以及文件系统存储服务(cephfs)。
 - Ceph在存储的时候充分利用存储节点的计算能力,在存储每一个数据时都会通过计算得出该数据的位置,尽量的分布均衡。
 - 目前也是OpenStack的主流后端存储,随着OpenStack在云计算领域的广泛使用,ceph也变得更加炙手可热。
 - 国内目前使用ceph搭建分布式存储系统较为成功的企业有x-sky,深圳元核云,上海UCloud等三家企业。
 - Ceph设计思想:集群可靠性、集群可扩展性、数据安全性、接口统一性、充分发挥存储设备自身的计算能力、去除中心化。
 

Ceph 架构介绍


- Ceph使用RADOS提供对象存储,通过librados封装库提供多种存储方式的文件和对象转换。
 - 外层通过RGW(Object,有原生的API,而且也兼容Swift和S3的API,适合单客户端使用)、RBD(Block,支持精简配置、快照、克隆,适合多客户端有目录结构)、CephFS(File,Posix接口,支持快照,适合更新变动少的数据,没有目录结构不能直接打开)将数据写入存储。
 
1  | - 高性能  | 
Ceph 核心概念
RADOS
- 全称Reliable Autonomic Distributed Object Store,即可靠的、自动化的、分布式对象存储系统。
 - RADOS是Ceph集群的精华,用户实现数据分配、Failover等集群操作。
 
Librados
- Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的。
 - 目前提供PHP、Ruby、Java、Python、C和C++支持。
 
Crush
- Crush算法是Ceph的两大创新之一,通过Crush算法的寻址操作,Ceph得以摒弃了传统的集中式存储元数据寻址方案。
 - 而Crush算法在一致性哈希基础上很好的考虑了容灾域的隔离,使得Ceph能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
 - 同时,Crush算法有相当强大的扩展性,理论上可以支持数千个存储节点,这为Ceph在大规模云环境中的应用提供了先天的便利。
 
1  | 1. Crush 算法 数据平均分配到各个节点上,访问的时候把数据拼起来获取  | 
Pool
- Pool是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略(默认3副本 )。
 - 支持两种类型:副本(replicated)和 纠删码( Erasure Code)
 
PG
- PG( placement group)是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略。
 - 简单点说就是相同PG内的对象都会放到相同的硬盘上,PG是ceph的逻辑概念,服务端数据均衡和恢复的最小粒度就是PG。
 - 一个PG包含多个OSD,引入PG这一层其实是为了更好的分配数据和定位数据;
 
Object
- 简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。
 - 能否弄一个读写快,利于共享的出来呢。于是就有了对象存储。最底层的存储单元,包含元数据和原始数据。
 

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

Monitor
- 1个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。
 - 负责坚实整个Ceph集群运行的Map视图(如OSD Map、Monitor Map、PG Map和CRUSH Map),维护集群的健康状态,维护展示集群状态的各种图表,管理集群客户端认证与授权;
 - Monitor生产上至少3个组成高可用。
 - 定期探测组件的健康状态。
 
1  | 1. osd想要什么数据 去 Monitor 里的 OSD Map 里面获取  | 

MDS
- MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。
 - 负责保存文件系统的元数据,管理目录结构。
 - 对象存储和块设备存储不需要元数据服务;
 

Mgr
- ceph 官方开发了 ceph-mgr,主要目标实现 ceph 集群的管理,为外界提供统一的入口。
 - 例如 cephmetrics、zabbix、calamari、promethus。
 - Mgr可以作为主从模式,挂了不影响集群使用。
 
RGW
- RGW 全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。
 
Admin
- Ceph常用管理接口通常都是命令行工具,如rados、ceph、rbd等命令 。
 - 另外Ceph还有可以有一个专用的管理节点,在此节点上面部署专用的管理工具来实现近乎集群的一些管理工作,如集群部署,集群组件管理等。
 
Ceph 三种存储类型
块存储(RBD)
1  | - 优点:  | 
文件存储(CephFS)
1  | - 优点:  | 
对象存储(Object)(适合更新变动较少的数据)
1  | - 优点:  | 
io ceph 流程

- client 访问 Monitor map 拿数据
 - 然后去OSD去找文件,OSD里面有主从概念,主提供服务,副本不做改动,通过盘符标识(SSD/HDD),分配主从节点。
 

- 读数据 流程到返回
 - 写数据 强一致性,主副本先写,写完后同步从副本,三个副本之间通信数据一致后,数据才可以继续读取
 
小总结
- 为什么用ceph: 可扩展,节省成本,支持接口多
 - 架构:分布式架构,多接口,RADOS -> Librados -> RGW,RBD,CephFS ,每个组件分布式,数据也是分布式
 - 三种存储类型: RBD(块存储),CephFS(文件存储),对象存储(object)
 
Ceph 集群部署
Ceph 版本选择
- 官网安装 最新版本
 - 手动安装 内网yum源 安装指定版本
 
Ceph版本来源介绍
- Ceph 社区最新版本是 14,而 Ceph 12 是市面用的最广的稳定版本。
 - 第一个 Ceph 版本是 0.1 ,要回溯到 2008 年 1 月。
 - 多年来,版本号方案一直没变,直到 2015 年 4 月 0.94.1 ( Hammer 的第一个修正版)发布后,为了避免 0.99 (以及 0.100 或 1.00 ?),制定了新策略。
 
1  | x.0.z - 开发版(给早期测试者和勇士们)  | 
| 版本名称 | 版本号 | 发布时间 | 
|---|---|---|
| Argonaut | 0.48版本(LTS) | 2012年6月3日 | 
| Bobtail | 0.56版本(LTS) | 2013年5月7日 | 
| Cuttlefish | 0.61版本 | 2013年1月1日 | 
| Dumpling | 0.67版本(LTS) | 2013年8月14日 | 
| Emperor | 0.72版本 | 2013年11月9 | 
| Firefly | 0.80版本(LTS) | 2014年5月 | 
| Giant | Giant | October 2014 - April 2015 | 
| Hammer | Hammer | April 2015 - November 2016 | 
| Infernalis | Infernalis | November 2015 - June 2016 | 
| Jewel | 10.2.9 | 2016年4月 | 
| Kraken | 11.2.1 | 2017年10月 | 
| Luminous | 12.2.12 | 2017年10月 | 
| mimic | 13.2.7 | 2018年5月 | 
| nautilus | 14.2.5 | 2019年2月 | 
1  | # 本次实验 nautilus  | 
Luminous 新版本特性
1. Bluestore
1  | 1. ceph-osd的新后端存储BlueStore已经稳定,是新创建的OSD的默认设置。  | 
安装前准备
1  | # 我自己重新创建了3台 阿里云主机  | 
1  | (1)关闭防火墙:  | 
安装内网yum源
这一步有问题 直接用下面的 阿里云源
1. 安装httpd、createrepo 和 epel源
1  | yum install httpd createrepo epel-release -y  | 
2. 编辑yum源文件
1  | [root@cephnode01 ~]# vim /etc/yum.repos.d/ceph.repo  | 
3. 下载Ceph 相关rpm包
1  | [root@cephnode01 ~]# yum --downloadonly --downloaddir=/var/www/html/ceph/rpm-nautilus/el7/x86_64/ install ceph ceph-radosgw  | 
4. 下载Ceph依赖文件
1  | # 自作源的时候 要下载这些依赖  | 
更新yum源
1  | createrepo --update /var/www/html/ceph/rpm-nautilus  | 
1  | [root@cephnode01 rpm-nautilus]# systemctl start httpd  | 
使用阿里云yum源 安装Ceph集群
1. 编辑yum源
- 将yum源同步到其它节点并提前做好 yum makecache
 
1  | # 三台都操作  | 
1  | yum clean all  | 
2. 安装ceph-deploy(确认ceph-deploy版本是否为2.0.1)
1  | [root@cephnode01 rpm-nautilus]# yum list|grep ceph  | 
3. 创建一个my-cluster目录
- 所有命令在此目录下进行(文件位置和名字可以随意)
 - 生产上按照项目启目录名字也可以,这个是测试用的
 
1  | mkdir /my-cluster  | 
4. 创建一个Ceph集群
1  | [root@cephnode01 my-cluster]# ceph-deploy new cephnode01 cephnode02 cephnode03  | 
5. 安装Ceph软件(每个节点执行)
1  | [root@cephnode01 my-cluster]# yum -y install epel-release  | 
6. 生成monitor检测集群所使用的的秘钥
1  | [root@cephnode01 my-cluster]# ceph-deploy mon create-initial  | 
7. 查看基本配置
1  | [root@cephnode01 my-cluster]# ls -l  | 
8. 安装Ceph CLI,方便执行一些管理命令
1  | [root@cephnode01 my-cluster]# ceph-deploy admin cephnode01 cephnode02 cephnode03  | 
1  | # 其他节点下会生成  | 
9. 配置mgr,用于管理集群
1  | [root@cephnode01 my-cluster]# ceph-deploy mgr create cephnode01 cephnode02 cephnode03  | 
10. 部署rgw
1  | # 生产上多机器安装 rgw 对象存储 用nginx做负载均衡代理  | 
11. 部署MDS(CephFS)
1  | [root@cephnode01 my-cluster]# ceph-deploy mds create cephnode01 cephnode02 cephnode03  | 
12. 阿里云购买云盘
- 为每台实例购买云盘,按照分区购买后,挂载到实例上
 - 高效云盘,20G,可用区C
 
1  | [root@cephnode01 my-cluster]# lsblk  | 

13. 添加osd
1  | # 该命令可以将 裸盘 vdb 自动格式化成ceph BlueStore 认识的格式  | 
1  | [root@cephnode01 my-cluster]# ceph osd tree  | 
1  | # 查看集群状态  | 
把其他实例上的盘也加入到集群里


1  | # 别忘记购买啊...  | 
1  | # 三块盘 每台实例加入一块  | 
1  | # 在磁盘不平衡或者新加盘的时候 会出现 WARN状态  | 
1  | # 有报错的话 会看到详细报错  | 
1  | # 查看pool  | 
1  | # 查看pg,pg是逻辑概念,磁盘规置  | 
添加硬盘业务无感知
- 如果新加盘需要清空再键入
 - 最好直接加入裸盘
 
ceph.conf
1  | # 原始配置文件  | 
书写格式
- 该配置文件采用init文件语法,#和;为注释,ceph集群在启动的时候会按照顺序加载所有的conf配置文件。 配置文件分为以下几大块配置。
 
1  | global: 全局配置。  | 
- 配置文件可以从多个地方进行顺序加载,如果冲突将使用最新加载的配置,其加载顺序为。
 
1  | # 不需要改动  | 
- 配置文件还可以使用一些元变量应用到配置文件,如
 
1  | $cluster: 当前集群名。  | 
- ceph.conf 详细参数
 
1  | # 全局设置 默认接口 不用调整太多  | 
Ceph RBD
RBD 介绍
- RBD即RADOS Block Device的简称,RBD块存储是最稳定且最常用的存储类型。
 - RBD块设备类似磁盘可以被挂载。
 - RBD块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在Ceph集群的多个OSD中。
 - 如下是对Ceph RBD的理解。
 
1  | 1. RBD: 就是 Ceph 里的块设备,一个 4T 的块设备的功能和一个 4T 的 SATA 类似,挂载的 RBD 就可以当磁盘用;  | 
- 块存储本质就是将裸磁盘或类似裸磁盘(lvm)设备映射给主机使用,主机可以对其进行格式化并存储和读取数据,块设备读取速度快但是不支持共享。
 
1  | 1. ceph可以通过内核模块和librbd库提供块设备支持。  | 
- 使用场景:
 
1  | 1. 云平台(OpenStack做为云的存储后端提供镜像存储)  | 
RBD 常用命令
| 命令 | 功能 | 
|---|---|
| rbd create | 创建块设备映像 | 
| rbd ls | 列出 rbd 存储池中的块设备 | 
| rbd info | 查看块设备信息 | 
| rbd diff | 可以统计 rbd 使用量 | 
| rbd map | 映射块设备 | 
| rbd showmapped | 查看已映射块设备 | 
| rbd remove | 删除块设备 | 
| rbd resize | 更改块设备的大小 | 
RBD 配置操作
RBD 挂载到操作系统
创建rbd使用的pool
1  | # 32 pg_num 32 pgp_num 随着容量在增加扩容 生产要做规划  | 
1  | [root@cephnode01 my-cluster]# ceph osd pool create rbd 32 32  | 
创建一个块设备
1  | [root@cephnode01 my-cluster]# rbd create --size 10240 image01  | 
查看快设备
1  | [root@cephnode01 my-cluster]# rbd ls  | 
禁用当前系统内核不支持的feature
1  | [root@cephnode01 my-cluster]# rbd feature disable image01 exclusive-lock, object-map, fast-diff, deep-flatten  | 
将块设备映射到系统内核
1  | [root@cephnode01 my-cluster]# rbd map image01  | 
格式化块设备镜像
1  | [root@cephnode01 my-cluster]# mkfs.xfs /dev/rbd0  | 
mount到本地
1  | [root@cephnode01 my-cluster]# mount /dev/rbd0 /mnt  | 
取消挂载
1  | [root@cephnode01 mnt]# rbd showmapped  | 
删除RBD块设备
1  | [root@cephnode01 /]# rbd rm image01  | 
其他机器需要创建
1  | ceph common k8s会讲到  | 
RBD 快照配置
1  | [root@cephnode01 my-cluster]# rbd create --size 10240 image02  | 
创建快照
1  | [root@cephnode01 my-cluster]# rbd snap create image02@image02_snap01  | 
列出创建的快照
1  | [root@cephnode01 my-cluster]# rbd snap list image02  | 
查看快照详细信息
1  | [root@cephnode01 my-cluster]# rbd info image02@image02_snap01  | 
克隆快照(快照必须处于被保护状态才能被克隆)
1  | # 保护状态就无法操作了  | 
查看快照的children
1  | # 查看快照的子快照  | 
去掉快照的parent
1  | # 取消克隆关系  | 
恢复快照
1  | # 回滚 一开始有5个文件 一直写 想回滚  | 
删除快照
1  | # 取消保护  | 
RBD 镜像导出导入
导出RBD镜像
1  | [root@cephnode01 my-cluster]# rbd export image02 /tmp/image02  | 
导入RBD镜像
1  | [root@cephnode01 tmp]# rbd ls  | 
RBD 扩容
1  | [root@cephnode01 tmp]# rbd info image02|grep size  | 
总结
1  | 1. 把rbd映射到文件系统挂载  | 
Ceph 文件系统 CephFS
- Ceph File System (CephFS) 是与 POSIX 标准兼容的文件系统, 能够提供对 Ceph 存储集群上的文件访问.
 - Jewel 版本 (10.2.0) 是第一个包含稳定 CephFS 的 Ceph 版本.
 - CephFS 需要至少一个元数据服务器 (Metadata Server - MDS) daemon (ceph-mds) 运行, MDS daemon 管理着与存储在 CephFS 上的文件相关的元数据, 并且协调着对 Ceph 存储系统的访问。
 - 对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。
 
CephFS 架构
- 底层是核心集群所依赖的, 包括:
 
1  | 1. OSDs (ceph-osd): CephFS 的数据和元数据就存储在 OSDs 上  | 

- 数据访问流程
 
1  | 1. client 访问MDS 获取数据的元数据(文件名,大小等信息)  | 
配置 CephFS MDS
1  | # 当前集群状态  | 
1  | 1. 要使用 CephFS, 至少就需要一个 metadata server 进程。  | 
部署 Ceph 文件系统
- 部署一个 CephFS, 步骤如下:
 
1  | 1. 在一个 Mon 节点上创建 Ceph 文件系统.  | 
创建一个 Ceph 文件系统
1. CephFS 需要两个 Pools
1  | # cephfs-data 和 cephfs-metadata, 分别存储文件数据和文件元数据  | 
1  | [root@cephnode01 my-cluster]# ceph osd pool create cephfs-data 16 16  | 
1  | # 注意  | 
2. 创建一个 CephFS, 名字为 cephfs
1  | [root@cephnode01 my-cluster]# ceph fs new cephfs cephfs-metadata cephfs-data  | 
3. 验证至少有一个 MDS 已经进入 Active 状态
1  | [root@cephnode01 my-cluster]# ceph fs status cephfs  | 

4. 在 Monitor 上, 创建一个用户,用于访问CephFs
1  | [root@cephnode01 my-cluster]# ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs-data, allow rw pool=cephfs-metadata'  | 
5. 验证key是否生效
1  | [root@cephnode01 my-cluster]# ceph auth get client.cephfs  | 
6. 检查CephFs和mds状态
1  | [root@cephnode01 my-cluster]# ceph -s  | 

挂载 CephFS 文件系统
以 kernel client 形式挂载 CephFS
1  | # 找一台不在集群中的服务器测试挂载  | 
1  | # secret 就是刚生成的秘钥 key = AQCluh9eDsknLBAAjxABEQpF8vJeUt8Buk22Dg==  | 

1  | # 开机自动挂载  | 
1  | 4. 验证是否挂载成功  | 
以 FUSE client 形式挂载 CephFS
1  | 1. 安装ceph-common  | 
1  | 2. 安装ceph-fuse  | 
1  | 3. 将集群的ceph.conf拷贝到客户端  | 
1  | 4. 使用 ceph-fuse 挂载 CephFS  | 

1  | # 验证 CephFS 已经成功挂载  | 
1  | # 自动挂载  | 
1  | # 卸载  | 
存储文件测试并查看
1  | # 在目录下写点东西  | 
挂载小总结
1  | # 推荐ceph-fuse 效率更高  | 
MDS主备与主主切换
配置主主模式
- 当cephfs的性能出现问题时,就应该配置多个活动的MDS。
 - 通常是多个客户机应用程序并行的执行大量元数据操作,并且它们分别有自己单独的工作目录。这种情况下很适合使用多主MDS模式。
 - 配置MDS多主模式
 - 每个cephfs文件系统都有一个max_mds设置,可以理解为它将控制创建多少个主MDS。注意只有当实际的MDS个数大于或等于max_mds设置的值时,mdx_mds设置才会生效。
 - 例如,如果只有一个MDS守护进程在运行,并且max_mds被设置为两个,则不会创建第二个主MDS。
 
1  | # 设置完成后 存在两个主  | 

配置备用 MDS
- 即使有多个活动的MDS,如果其中一个MDS出现故障,仍然需要备用守护进程来接管。因此,对于高可用性系统,实际配置max_mds时,最好比系统中MDS的总数少一个。
 - 但如果你确信你的MDS不会出现故障,可以通过以下设置来通知ceph不需要备用MDS,否则会出现insufficient standby daemons available告警信息:
 
1  | # 设置不需要备用MDS  | 
Ceph Dashboard
- Ceph 的监控可视化界面方案很多—-grafana、Kraken。但是从Luminous开始,Ceph 提供了原生的Dashboard功能
 - 通过Dashboard可以获取Ceph集群的各种基本状态信息。
 - mimic版 (nautilus版) dashboard 安装。如果是 (nautilus版) 需要安装 ceph-mgr-dashboard
 
配置 Ceph Dashboard
1  | 1. 在每个mgr节点安装  | 
1  | # 出现问题 ImportError: cannot import name UnrewindableBodyError  | 


修改默认配置命令
1  | 指定集群dashboard的访问端口  | 
开启Object Gateway管理功能
1  | # 这块可能有问题 需要用到对象存储的时候 再网上查查  | 
Promethus+Grafana 监控 Ceph
安装 grafana
1  | 1、配置yum源文件  | 
安装 promethus
1  | 1、下载安装包,下载地址  | 
ceph mgr prometheus插件配置
1  | # ceph mgr module enable prometheus  | 
配置 promethus
1  | [root@cephnode04 prometheus]# vim /opt/prometheus/prometheus.yml  | 
1  | # 重启promethus服务  | 
1  | # 检查prometheus服务器中是否添加成功  | 

配置 grafana
1  | 1. 浏览器登录 grafana 管理界面  | 


K8S 接入 Ceph 存储
PV、PVC 概述
- 管理存储是管理计算的一个明显问题。PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。
 - 于是引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim
 
1  | 1. PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。  | 
POD 动态供给
- 动态供给主要是能够自动帮你创建pv,需要多大的空间就创建多大的pv。
 - k8s帮助创建pv,创建pvc就直接api调用存储类来寻找pv。
 - 如果是存储静态供给的话,会需要我们手动去创建pv,如果没有足够的资源,找不到合适的pv,那么pod就会处于pending等待的状态。
 - 而动态供给主要的一个实现就是StorageClass存储对象,其实它就是声明你使用哪个存储,然后帮你去连接,再帮你去自动创建pv。
 
小总结
- pv去存储里申请的一块空间,映射到pv上,作为物理卷存活在容器里
 - POD使用pvc联系pv拿到存储
 - 动态供给,省却手动创建pv,而是调用StorageClass帮我们去创建
 
POD 使用 RBD 做为持久数据卷
安装与配置
- RBD支持ReadWriteOnce,ReadOnlyMany两种模式
 
1  | # 访问模式包括:  | 
配置 rbd-provisioner
1  | # 配置rbd-provisioner  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f external-storage-rbd-provisioner.yaml  | 
配置 storageclass
- 创建pod时,kubelet需要使用rbd命令去检测和挂载pv对应的ceph image,所以要在所有的worker节点安装ceph客户端ceph-common。
 - 将ceph的ceph.client.admin.keyring和ceph.conf文件拷贝到所有工作节点的/etc/ceph目录下
 
1  | [root@k8s-master1 ceph]# vim /etc/yum.repos.d/ceph.repo  | 
1  | yum -y install ceph-common  | 
创建 osd pool
1  | [root@cephnode01 my-cluster]# ceph osd pool create kube 16 16  | 
创建k8s访问ceph的用户
1  | ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.kube.keyring  | 
查看 key
1  | [root@cephnode01 my-cluster]# ceph auth get-key client.admin  | 
创建 admin secret
1  | kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \  | 
在 default 命名空间创建 pvc 用于访问ceph的 secret
1  | kubectl create secret generic ceph-user-secret --type="kubernetes.io/rbd" \  | 
1  | [root@k8s-master1 ceph]# kubectl get secret --all-namespaces  | 
配置 StorageClass
- 源码中,monitors需要k8s dns解析,我这里使用外部ceph,肯定没有相关解析。
 - 所以手动添加解析。
 - 而且storageclass配置默认不支持直接修改(只能删除再添加),维护解析比维护storageclass配置要好些。
 
1  | [root@k8s-master1 ceph]# kubectl create ns ceph  | 
1  | [root@k8s-master1 ceph]# vim storageclass-ceph-rdb.yaml  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f storageclass-ceph-rdb.yaml  | 
测试使用
创建 pvc 测试
1  | cat >ceph-rdb-pvc-test.yaml<<EOF  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f ceph-rdb-pvc-test.yaml  | 
1  | [root@k8s-master1 ceph]# kubectl describe pvc ceph-rdb-claim  | 
创建 nginx pod 挂载测试
1  | cat >nginx-pod.yaml<<EOF  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f nginx-pod.yaml  | 
1  | # 修改文件内容  | 
1  | # 清理  | 
POD 使用 CephFS 做为持久数据卷
- CephFS方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ,ReadWriteMany
 
1  | 访问模式包括:  | 
- Pod挂载cephfs有时候会用fuse挂载 如果宿主机没有这个工具会导致挂载失败 pod无法启动
 
1  | yum install -y ceph-fuse  | 

Ceph 端创建 CephFS pool
- 在ceph节点,CephFS需要使用两个Pool来分别存储数据和元数据
 
1  | [root@cephnode01 my-cluster]# ceph osd pool create fs_data 16  | 
1  | # 创建一个CephFS  | 
部署 cephfs-provisioner
1  | # 使用社区提供的cephfs-provisioner  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f external-storage-cephfs-provisioner.yaml  | 
配置 StorageClass
1  | # 查看key 在ceph的mon或者admin节点  | 
1  | # 配置 StorageClass  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f storageclass-cephfs.yaml  | 
测试使用
创建pvc测试
1  | cat >cephfs-pvc-test.yaml<<EOF  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f cephfs-pvc-test.yaml  | 
1  | # 创建 nginx pod 挂载测试  | 
1  | [root@k8s-master1 ceph]# kubectl apply -f nginx-pod2.yaml  | 
1  | # 修改文件内容  | 
1  | # 清理  | 
Ceph 日常运维管理
集群监控管理
- 集群整体运行状态
 
1  | [root@cephnode01 my-cluster]# ceph -s  | 
PG 状态
- 查看pg状态查看通常使用下面两个命令即可,dump可以查看更详细信息,如
 
1  | ceph pg dump  | 

Pool状态
1  | ceph osd pool stats  | 
OSD 状态
1  | ceph osd stat  | 
Monitor状态和查看仲裁状态
1  | ceph mon stat  | 
集群空间用量
1  | ceph df 常用  | 
集群配置管理 (临时和全局,服务平滑重启)
- 有时候需要更改服务的配置,但不想重启服务,或者是临时修改。这时候就可以使用tell和daemon子命令来完成此需求。
 
查看运行配置
1  | 命令格式:  | 
tell 子命令格式
- 使用 tell 的方式适合对整个集群进行设置,使用 * 号进行匹配,就可以对整个集群的角色进行设置。
 - 而出现节点异常无法设置时候,只会在命令行当中进行报错,不太便于查找。
 
1  | 命令格式:  | 
daemon子命令
- 使用 daemon 进行设置的方式就是一个个的去设置,这样可以比较好的反馈,此方法是需要在设置的角色所在的主机上进行设置。
 
1  | 命令格式:  | 
集群操作
1  | 1. 启动所有守护进程  | 
添加和删除OSD
添加 OSD
1  | 1、格式化磁盘  | 
删除 OSD
1  | 1. 调整osd的crush weight为 0  | 
扩容 PG
1  | ceph osd pool set {pool-name} pg_num 128  | 
Pool 操作
1  | # 列出存储池  | 
1  | # 创建存储池  | 
1  | # 设置存储池配额  | 
1  | # 删除存储池  | 
1  | # 重命名存储池  | 
1  | # 查看存储池统计信息  | 
1  | # 给存储池做快照  | 
1  | # 删除存储池的快照  | 
1  | # 获取存储池选项值  | 
1  | # 调整存储池选项值  | 
获取对象副本数
1  | ceph osd dump | grep 'replicated size'  | 
用户管理
- Ceph 把数据以对象的形式存于各存储池中。
 - Ceph 用户必须具有访问存储池的权限才能够读写数据。
 - 另外,Ceph 用户必须具有执行权限才能够使用 Ceph 的管理命令。
 
1  | # 查看用户信息  | 
1  | # 添加用户  | 
1  | # 修改用户权限  | 
增加和删除Monitor
1  | # 新增一个monitor  | 
1  | # 删除Monitor  | 
Pool 配置大小
1  | # Pool的基本配置  | 
常见问题
nearfull osd(s) or pool(s) nearfull
- 此时说明部分osd的存储已经超过阈值,mon会监控ceph集群中OSD空间使用情况。
 - 如果要消除WARN,可以修改这两个参数,提高阈值,但是通过实践发现并不能解决问题,可以通过观察osd的数据分布情况来分析原因。
 
1  | # 配置文件设置阈值  | 
1  | # 自动处理  | 
1  | # 手动处理  | 
1  | # 全局处理  | 
PG 故障状态
1  | PG状态概述  | 
OSD 状态
1  | 单个OSD有两组状态需要关注,其中一组使用in/out标记该OSD是否在集群内,另一组使用up/down标记该OSD是否处于运行中状态。两组状态之间并不互斥,换句话说,当一个OSD处于“in”状态时,它仍然可以处于up或down的状态。  | 
