【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(上)

目录

一、分布式存储 Ceph 基本介绍

1.1 块存储(rbd)

1.2 文件系统 cephfs

1.3 对象存储

1.4 分布式存储的优点

二、Ceph 核心组件介绍

三、准备安装 Ceph 高可用集群的实验环境

3.1 机器配置

3.2  初始化环境

3.3 配置互信

3.4 配置 Ceph 安装源

四、安装 Ceph 集群

4.1 安装 ceph-deploy

4.2 创建 monitor 节点

4.3 安装 ceph-monitor

4.4 部署 osd 服务

4.5 创建 ceph 文件系统


一、分布式存储 Ceph 基本介绍

  • Ceph 官网地址:Ceph.io — Home
  • Ceph 官方文档:Intro to Ceph — Ceph Documentation

        Ceph 是一种开源的分布式的存储系统。它包含以下几种存储类型:块存储(rbd)、对象存储(RADOS Fateway)、文件系统(cephfs)。

1.1 块存储(rbd)

        块是一个字节序列(例如 512 字节的数据块)。 基于块的存储接口是使用旋转介质(如硬盘、CD、软盘甚至传统的 9 轨磁带等)存储数据的最常用方法。Ceph 块设备是精简配置,可调整大小并存储在 Ceph 集群中多个 OSD 条带化的数据。Ceph 块设备利用 RADOS 功能,如快照、复制和一致性。Ceph 的 RADOS 块设备(RBD)使用内核模块或 librbd 库与 OSD 进行交互。Ceph 的块设备为内核模块或 QVM 等 KVM 以及依赖 libvirt 和 QEMU 与 Ceph 块设备集成的OpenStack 和 CloudStack 等基于云的计算系统提供高性能和无限可扩展性。可以使用同一个集群同时运行 Ceph RADOS Gateway、CephFS 文件系统和 Ceph 块设备。

linux 系统中,ls /dev/ 下有很多块设备文件,这些文件就是我们添加硬盘时识别出来的。

        rbd 就是由 Ceph 集群提供出来的块设备。可以这样理解,sda 是通过数据线连接到了真实的硬盘,而 rbd 是通过网络连接到了 Ceph 集群中的一块存储区域,往 rbd 设备文件写入数据,最终会被存储到 Ceph 集群的这块区域中。

        总结:块设备可理解成一块硬盘,用户可以直接使用不含文件系统的块设备,也可以将其格式化成特定的文件系统,由文件系统来组织管理存储空间,从而为用户提供丰富而友好的数据操作支持。

1.2 文件系统 cephfs

        Ceph 文件系统(CephFS)是一个符合 POSIX 标准的文件系统,它使用 Ceph 存储集群来存储其数据。Ceph 文件系统使用与 Ceph 块设备相同的 Ceph 存储集群系统。

        用户可以在块设备上创建 xfs 文件系统,也可以创建 ext4 等其他文件系统,Ceph 集群实现了自己的文件系统来组织管理集群的存储空间,用户可以直接将 Ceph 集群的文件系统挂载到用户机上使用,Ceph 有了块设备接口,在块设备上完全可以构建一个文件系统,那么 Ceph 为什么还需要文件系统接口呢?

        主要是因为应用场景的不同,Ceph 的块设备具有优异的读写性能,但不能多处挂载同时读写,目前主要用在 OpenStack 上作为虚拟磁盘,而 Ceph 的文件系统接口读写性能较块设备接口差,但具有优异的共享性。

1.3 对象存储

        Ceph 对象存储使用 Ceph 对象网关守护进程(radosgw),它是一个用于与 Ceph 存储集群交互的 HTTP 服务器。由于它提供与 OpenStack Swift 和 Amazon S3 兼容的接口,因此 Ceph 对象网关具有自己的用户管理。 Ceph 对象网关可以将数据存储在用于存储来自 Ceph 文件系统客户端或 Ceph 块设备客户端的数据的相同 Ceph 存储集群中。使用方式就是通过 http 协议上传下载删除对象(文件即对象)。

老问题来了,有了块设备接口存储和文件系统接口存储,为什么还整个对象存储呢?

        Ceph 的块设备存储具有优异的存储性能但不具有共享性,而 Ceph 的文件系统具有共享性然而性能较块设备存储差,为什么不权衡一下存储性能和共享性,整个具有共享性而存储性能好于文件系统存储的存储呢,对象存储就这样出现了。

1.4 分布式存储的优点

  • 高可靠:既满足存储读取不丢失,还要保证数据长期存储。 在保证部分硬件损坏后依然可以保证数据安全。

  • 高性能:读写速度快。

  • 可扩展:分布式存储的优势就是“分布式”,所谓的“分布式”就是能够将多个物理节点整合在一起形成共享的存储池,节点可以线性扩充,这样可以源源不断的通过扩充节点提升性能和扩大容量,这是传统存储阵列无法做到的。

二、Ceph 核心组件介绍

        在 Ceph 集群中,不管你是想要提供对象存储、块设备存储,还是文件系统存储,所有 Ceph 存储集群部署都是从设置每个 Ceph 节点、网络和 Ceph 存储开始的。Ceph 存储集群至少需要一个 Ceph Monitor、Ceph Manager 和 Ceph OSD(对象存储守护进程)。运行 Ceph Filesystem 客户端时也需要 Ceph 元数据服务器。

  • Monitors:Ceph 监视器(ceph-mon)维护集群状态的映射,包括监视器映射、管理器映射、OSD 映射和 CRUSH 映射。这些映射是 Ceph 守护进程相互协调所需的关键集群状态。监视器还负责管理守护进程和客户端之间的身份验证。冗余和高可用性通常至少需要三个监视器。

  • Managers:Ceph Manager 守护程序(ceph-mgr)负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager 守护进程还托管基于python 的模块来管理和公开 Ceph 集群信息,包括基于 Web 的 Ceph Dashboard 和 REST API。高可用性通常至少需要两名 Managers。

  • Ceph OSD:Ceph OSD(对象存储守护进程,ceph-osd)存储数据,处理数据复制,恢复,重新平衡,并通过检查其他 Ceph OSD 守护进程来获取心跳,为 Ceph 监视器和管理器提供一些监视信息。冗余和高可用性通常至少需要 3 个 Ceph OSD。

  • MDS:Ceph 元数据服务器(MDS,ceph-mds)代表 Ceph 文件系统存储元数据(即 Ceph 块设备和 Ceph 对象存储不使用 MDS)。Ceph 元数据服务器允许 POSIX 文件系统用户执行基本命令(如 ls,find 等),而不会给 Ceph 存储集群带来巨大负担。

三、准备安装 Ceph 高可用集群的实验环境

3.1 机器配置

注意:不是在 k8s 集群内部署 Ceph,而是另外准备三台机器。

  • 操作系统:Centos 7.6

  • 网络模式:NAT

准备三台机器,每台机器需要三个硬盘,最低配置 2GiB / 2vCPU / 50G

master1-admin 是管理节点 :192.168.78.135

【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(上)_第1张图片

node1-monitor 是监控节点:192.168.78.136

【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(上)_第2张图片

node2-osd 是对象存储节点:192.168.78.137

【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(上)_第3张图片

3.2  初始化环境

可以按照我的这篇文章来操作:CentOS 7 初始化系统_centos7初始化_Stars.Sky的博客-CSDN博客

3.3 配置互信

生成 ssh 密钥对:

[root@master1-admin ~]# ssh-keygen -t rsa            # 一路回车(三次),不输入密码。下面操作以此类推

# 把本地的 ssh 公钥文件安装到远程主机对应的账户
[root@master1-admin ~]# ssh-copy-id node1-monitor    # 输入 yes 和 对应主机密码
[root@master1-admin ~]# ssh-copy-id node2-osd
[root@master1-admin ~]# ssh-copy-id master1-admin

[root@node1-monitor ~]# ssh-keygen
[root@node1-monitor ~]# ssh-copy-id master1-admin
[root@node1-monitor ~]# ssh-copy-id node1-monitor
[root@node1-monitor ~]# ssh-copy-id node2-osd

[root@node2-osd ~]# ssh-keygen 
[root@node2-osd ~]# ssh-copy-id master1-admin
[root@node2-osd ~]# ssh-copy-id node1-monitor
[root@node2-osd ~]# ssh-copy-id node2-osd

3.4 配置 Ceph 安装源

配置 ceph 的阿里云 repo 源,需要都在 master1-admin、node1-monitor、node2-osd 上操作:

yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*

需要在 master1-admin、node1-monitor、node2-osd 上创建 ceph.repo :

[root@master1-admin ~]# vim /etc/yum.repos.d/ceph.repo
[Ceph] 
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ 
enabled=1 
gpgcheck=0 
type=rpm-md 
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc 
priority=1
[Ceph-noarch] 
name=Ceph noarch packages 
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/ 
enabled=1 
gpgcheck=0 
type=rpm-md 
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc 
priority=1 
[ceph-source]
name=Ceph source packages 
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/ 
enabled=1 
gpgcheck=0 
type=rpm-md 
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc 
priority=1

四、安装 Ceph 集群

4.1 安装 ceph-deploy

# 在 master1-admin 节点安装 ceph-deploy
[root@master1-admin ~]# yum install python-setuptools ceph-deploy -y

# 在 master1-admin、node1-monitor 和 node2-osd 节点安装 ceph
yum install ceph ceph-radosgw -y

# 查看 ceph 版本
[root@master1-admin ~]# ceph --version
ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)

4.2 创建 monitor 节点

# 创建一个目录用于保存 ceph-deploy 生成的配置文件信息的
[root@master1-admin ~]# cd /etc/ceph/
[root@master1-admin ceph]# ceph-deploy new master1-admin node1-monitor node2-osd

# 生成了如下配置文件
[root@master1-admin ceph]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring  rbdmap

# Ceph 配置文件 日志文件           monitor 密钥环

4.3 安装 ceph-monitor

  • 修改 ceph 配置文件:
# 把 ceph.conf 配置文件里的默认副本数从 3 改成 1;把 osd_pool_default_size = 2 加入 [global] 段,这样只有 2 个 osd 也能达到 active+clean 状态:
[root@master1-admin ceph]# vim ceph.conf 
[global]
fsid = 8edfa62d-3732-45ca-b788-b42e35ebd144
mon_initial_members = master1-admin, node1-monitor, node2-osd
mon_host = 192.168.78.135,192.168.78.136,192.168.78.137
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2
mon clock drift allowed = 0.500        # 监视器间允许的时钟漂移量默认值 0.05
mon clock drift warn backoff = 10      # 时钟偏移警告的退避指数。默认值 5

# ceph 对每个mon之间的时间同步延时默认要求在0.05s之间,这个时间有的时候太短了。所以如果ceph集群如果出现clock问题就检查ntp时间同步或者适当放宽这个误差时间。
cephx是认证机制是整个 Ceph 系统的用户名/密码

        ceph 对每个 mon 之间的时间同步延时默认要求在 0.05s 之间,这个时间有的时候太短了。所以如果 ceph 集群如果出现 clock 问题就检查 ntp 时间同步或者适当放宽这个误差时间。

cephx 是认证机制,是整个 Ceph 系统的用户名/密码。

  • 配置初始 monitor、收集所有的密钥:

[root@master1-admin ceph]# cd /etc/ceph/

[root@master1-admin ceph]# ceph-deploy mon create-initial

[root@master1-admin ceph]# ls *.keyring
ceph.bootstrap-mds.keyring  ceph.bootstrap-osd.keyring  ceph.client.admin.keyring
ceph.bootstrap-mgr.keyring  ceph.bootstrap-rgw.keyring  ceph.mon.keyring

4.4 部署 osd 服务

# 查看磁盘信息
[root@master1-admin ceph]# fdisk -l

# 准备 osd
[root@master1-admin ceph]# pwd
/etc/ceph
[root@master1-admin ceph]# ceph-deploy osd prepare master1-admin:/dev/sdb
[root@master1-admin ceph]# ceph-deploy osd prepare node1-monitor:/dev/sdb
[root@master1-admin ceph]# ceph-deploy osd prepare node2-osd:/dev/sdb

# 激活 osd
[root@master1-admin ceph]# ceph-deploy osd activate master1-admin:/dev/sdb1
[root@master1-admin ceph]# ceph-deploy osd activate node1-monitor:/dev/sdb1
[root@master1-admin ceph]# ceph-deploy osd activate node2-osd:/dev/sdb1

# 查看状态
[root@master1-admin ceph]# ceph-deploy osd list master1-admin node1-monitor node2-osd

        要使用 Ceph 文件系统,你的 Ceph 的存储集群里至少需要存在一个 Ceph 的元数据服务器(mds)。

4.5 创建 ceph 文件系统

# 创建 mds
[root@master1-admin ceph]# ceph-deploy mds create master1-admin node1-monitor node2-osd

# 查看 ceph 当前文件系统
[root@master1-admin ceph]# ceph fs ls
No filesystems enabled

        一个 cephfs 至少要求两个 librados 存储池,一个为 data,一个为 metadata。当配置这两个存储池时,注意:

  1. 为 metadata pool 设置较高级别的副本级别,因为 metadata 的损坏可能导致整个文件系统不用;

  2. 建议 metadata pool 使用低延时存储,比如 SSD,因为 metadata 会直接影响客户端的响应速度。

# 创建存储池
[root@master1-admin ceph]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created

[root@master1-admin ceph]# ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created

解释:

确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:

  • OSD 少于 5 个 OSD 时可把 pg_num 设置为 128

  • OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512

  • OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096

  • OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值

  • 自己计算 pg_num 取值时可借助 pgcalc 工具

        随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。

# 创建文件系统
# 创建好存储池后,你就可以用 fs new 命令创建文件系统了,其中 new 后的 fsname 可自定义
[root@master1-admin ceph]# ceph fs new test cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1

# 查看创建后的 cephfs
[root@master1-admin ceph]# ceph fs ls
name: test, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

# 查看 mds 节点状态
[root@master1-admin ceph]# ceph mds stat
e7: 1/1/1 up {0=node2-osd=up:active}, 2 up:standby

# active 是活跃的,另 1 个是处于热备份的状态

# 查看 ceph 集群状态
[root@master1-admin ceph]# ceph -s
    cluster 8edfa62d-3732-45ca-b788-b42e35ebd144
     health HEALTH_OK
     monmap e1: 3 mons at {master1-admin=192.168.78.135:6789/0,node1-monitor=192.168.78.136:6789/0,node2-osd=192.168.78.137:6789/0}
            election epoch 4, quorum 0,1,2 master1-admin,node1-monitor,node2-osd
      fsmap e7: 1/1/1 up {0=node2-osd=up:active}, 2 up:standby
     osdmap e21: 3 osds: 3 up, 3 in
            flags sortbitwise,require_jewel_osds
      pgmap v43: 320 pgs, 3 pools, 2068 bytes data, 20 objects
            326 MB used, 15000 MB / 15326 MB avail
                 320 active+clean

# HEALTH_OK 表示 ceph 集群正常

上一篇文章:【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(下)_Stars.Sky的博客-CSDN博客

下一篇文章:【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(下)_Stars.Sky的博客-CSDN博客

你可能感兴趣的:(K8s,企业项目实战,kubernetes,云原生,分布式)