Ceph是一个开源的分布式存储系统,提供高性能、高可靠性的对象存储、块存储和文件系统。其去中心化架构自动处理数据复制和恢复,旨在实现弹性扩展和容错能力。为了实现数据持久化,本教程主要介绍如何通过Kubernetes对接Ceph分布式存储。
一、Ceph存储类型
1、块存储(RBD)
块存储(RBD)提供高性能的块级存储,适用于虚拟机和数据库。通过Ceph的RADOS(ReliableAutonomicDistributedObjectStore)接口提供块设备。且每个块设备映射到一个RADOS对象,支持动态分配和快照功能,可动态增加或减少存储容量。块设备具有优异的读写性能,但不支持多处同时挂载。用户可直接使用不含文件系统的块设备,也可以格式化成特定的文件系统。
2、文件系统(CephFS)
文件系统(CephFS)提供完整的分布式文件系统,提供标准的POSIX文件系统接口,支持标准的文件操作和目录结构。又基于Ceph的对象存储,通过元数据服务器(MDS)管理文件和目录的元数据。支持横向扩展,能够处理大量的文件和目录操作。文件系统性能不及块设备,但共享性优秀。
3、对象存储(ObjectGateway)
对象存储(ObjectGateway)提供兼容AmazonS3和OpenStackSwift的RESTfulAPI,适合存储大量非结构化数据,如照片、视频等。其数据以对象形式存储,由数据、元数据和唯一标识符组成。可通过增加存储节点横向扩展,适合大规模数据存储需求。
二、Ceph分布式存储的优点
- 弹性扩展:可无缝添加存储节点以满足增长需求;
- 高可用性:数据自动复制到多个节点,确保硬件故障时数据安全;
- 高性能:提供快速的读写速度;
- 去中心化:无单点故障,提升可靠性;
- 灵活性:支持对象、块和文件系统等多种存储类型。
三、Ceph核心组件
- Monitors(监视器):维护集群状态,包括监视器、管理器和OSD映射,负责身份验证。建议至少三台;
- Managers:跟踪运行时指标,管理和公开Ceph集群信息,建议至少两台;
- CephOSD:负责存储数据,处理复制和恢复等操作,建议至少三台;
- MDS(元数据服务器):管理Ceph文件系统的元数据,支持POSIX文件操作。
四、部署Ceph高可用集群
1、服务器环境信息
注意:本实验将Ceph集群与K8S集群部署在一起,生产环境应单独部署Ceph集群。
2、部署前环境准备工作
在所有主机上执行以下步骤:
(1)配置阿里云Ceph安装源
(2)安装基础包
yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet deltarpm
(3)添加hosts本地解析
vim /etc/hosts 16.32.15.200 master-1 16.32.15.201 node-1 16.32.15.202 node-2
(4)修改主机名(对应主机执行)
hostnamectl set-hostname master-1 && bash hostnamectl set-hostname node-1 && bash hostnamectl set-hostname node-2 && bash
(5)配置内网免密登录
ssh-keygen ssh-copy-id master-1 ssh-copy-id node-1 ssh-copy-id node-2
(6)配置NTP时间同步
yum -y install ntpdate ntpdate ntp1.aliyun.com
(7)添加定时任务
echo "0 1 * * * ntpdate ntp1.aliyun.com" >> /var/spool/cron/root
3、部署Ceph监控服务Monitor
(1)安装cephdeploy(在Ceph管理节点执行)
yum install python-setuptools ceph-deploy -y
(2)安装Ceph(在所有主机执行)
yum install ceph ceph-radosgw -y
(3)查看Ceph版本
ceph --version
(4)创建Monitor(在Ceph管理节点执行)
cd /etc/ceph ceph-deploy new master-1 node-1 node-2
(5)查看当前生成的文件
ls -1 /etc/ceph ceph.conf # Ceph配置文件 ceph-deploy-ceph.log # 日志文件 ceph.mon.keyring # Monitor密钥
(6)修改ceph配置文件(在Ceph管理节点执行)
注意:Ceph对每个监视器之间的时间同步延时要求在0.05秒之间,必要时可适当放宽该误差时间。
(7)配置初始Monitor、收集所有的密钥(在Ceph管理节点执行)
cd /etc/ceph ceph-deploy mon create-initial
(8)等待收集完成后,查看收集到的key
ls -1 /etc/ceph/*.keyring
4、激活Ceph存储服务OSD
注意:以下操作需在Ceph管理节点执行!
(1)准备OSD
cd /etc/ceph/ ceph-deploy osd prepare master-1:/dev/sdb ceph-deploy osd prepare node-1:/dev/sdb ceph-deploy osd prepare node-2:/dev/sdb
(2)激活OSD
ceph-deploy osd activate master-1:/dev/sdb1 ceph-deploy osd activate node-1:/dev/sdb1 ceph-deploy osd activate node-2:/dev/sdb1
(3)查看OSD状态
ceph-deploy osd list master-1 node-1 node-2
五、K8S对接Ceph存储
在K8S集群中使用Ceph存储时,需要在K8S各个节点中安装”cephcommon”工具,安装命令如下:
yum install ceph-common -y
如果K8S集群和Ceph集群不在同一服务器中,需要将Ceph集群中的”/etc/ceph”目录拷贝到K8S各个节点下。
1、K8S对接CephRBD实现数据持久化
(1)创建RBD
ceph osd pool create k8srbd 16 rbd create rbda -s 1024 -p k8srbd rbd feature disable k8srbd/rbda object-map fast-diff deep-flatten # 禁用无用特性
(2)查看RBD状态信息
ceph osd pool ls # 列出所有pool ceph osd pool stats k8srbd # 查看状态
(3)创建Pod,使用RBD挂载
(4)执行apply并查看Pod状态
kubectl apply -f pod.yaml kubectl get pods
注意:RBD类型只能挂载一个,如果再创建一个Pod使用相同的RBD,则会创建失败!
2、基于CephRBD生成PV
(1)创建Cephsecret对象
Secret对象用于K8SVolume插件访问Ceph集群,获取”client.admin”的keyring值(在Ceph管理节点执行):
ceph auth get-key client.admin | base64 QVFDVHljbG1hU3JnSnhBQSt0eUpmcVRjNEs2SHdrZUcxdjJVblE9PQ==
(2)创建Ceph的Secret资源(在K8SMaster节点操作):
apiVersion: v1 kind: Secret metadata: name: ceph-secret data: key: QVFBWk0zeGdZdDlhQXhBQVZsS0poYzlQUlBianBGSWJVbDNBenc9PQ== kubectl apply -f ceph-secret.yaml
(3)创建pool池
ceph osd pool create k8srbd1 16 rbd create rbda -s 1024 -p k8srbd1 rbd feature disable k8srbd1/rbda object-map fast-diff deep-flatten
(4)创建PV、PVC
kubectl apply -f ceph-pv-pvc.yaml kubectl get pvc ceph-pvc
(5)创建Deployment资源,使用PVC
kubectl apply -f deployment.yaml
注意:Ceph RBD块存储能在同一Node上跨Pod以使用ReadWriteOnce共享挂载,但不支持跨Node使用。
由于Deployment触发更新,为了保证服务可用性,Deployment需要先创建一个Pod并运行正常后,再删除老Pod。如果新Pod和老Pod不在同一Node上,将会导致故障。
解决办法:
- 使用支持跨Node和Pod挂载的共享存储,例如CephFS、GlusterFS等;
- 给Node添加Label,只允许Deployment所管理的Pod调度到一个固定的Node上(不建议,Node节点宕机会导致服务中断)。
3、基于Storage Class动态生成PV
注意:K8S1.20版本后需修改”kubeapiserver”配置以支持自动生成PV:
vim/etc/kubernetes/manifests/kubeapiserver.yaml
添加这一行:
featuregates=RemoveSelfLink=false
重启kubelet使其生效:
systemctl restart kubelet
注意:在本文测试环境中,v1.26.2版本修改此配置后导致集群无法启动,而v1.23.0版本修改后正常,建议在测试环境验证后再在生产环境中添加。
(1)执行赋权操作(所有K8S集群、Ceph集群中执行)
chmod 777 -R /etc/ceph/* mkdir /root/.ceph/ cp -ar /etc/ceph/ /root/.ceph/ cp -ar /etc/ceph/* /root/.ceph/
(2)创建RBD的供应商Provisioner
kubectl apply -f rbd-provisioner.yaml
(3)创建StorageClass
kubectl apply -f storageclass.yaml
(4)创建PVC,自动生成PV
kubectl apply -f rbd-pvc.yaml kubectl get pvc
(5)创建Pod,挂载PVC
kubectl apply -f pod-sto.yaml
4、K8S对接CephFS实现数据持久化
(1)创建MDS
ceph-deploy mds create master-1 node-1 node-2
(2)创建存储池
一个CephFS至少要求两个librados存储池,一个为data,一个为metadata。配置这两个存储池时,请注意以下几点:
为metadatapool设置较高级别的副本级别,以避免metadata损坏导致整个文件系统无法使用。
建议metadatapool使用低延时存储,如SSD,以提高客户端响应速度。
ceph osd pool create cephfs_data 128 ceph osd pool create cephfs_metadata 128
pg_num取值是强制性的,常用值如下:
- 少于5个OSD时可设置为128;
- OSD数量在5到10个时可设置为512;
- OSD数量在10到50个时可设置为4096;
- 当OSD数量大于50时,需根据权衡方法自行计算pg_num取值。
(3)创建文件系统
ceph fs new k8sfs cephfs_metadata cephfs_data
(4)查看状态
(5)创建目录,将CephFS挂载到此目录
mkdir -p /data/ceph_data/qinzt chmod 0777 /data/ceph_data/qinzt
(6)创建Secret,用于K8S连接Ceph
将”/etc/ceph/ceph.client.admin.keyring”中的key值转换为base64:
kubectl apply -f cephfs-secret.yaml
(7)创建PV、PVC
kubectl apply -f cephfs-pv-pvc.yaml kubectl get pvc cephfs-pvc
(8)创建Pods,挂载CephFS
kubectl apply -f cephfs-deployment.yaml
(9)验证
在Pod中创建文件,查看本地是否存在。
-
广告合作
-
QQ群号:707632017