在kubernetes 中,想实现 pod 数据的持久化。在调研的过程中,发现 ceph 在最近几年发展火热,也有很多案例落地企业。在选型方面,个人更加倾向于社区火热的项目,GlusterFS、Ceph 都在考虑的范围之内,但是由于 GlusterFS 只提供对象存储和文件系统存储,而 Ceph 则提供对象存储、块存储以及文件系统存储。怀着对新事物的向往,果断选择 Ceph 来实现 Ceph 块存储对接 kubernetes 来实现 pod 的数据持久化。

ceph是无中心化的存储,它没有管理节点、计算节点的之分。

ceph的文件是被分片的,每一个数据块是 一个对象,对象保存在不同的服务器上。当节点失效,自动迁移数据,重新复制副本。可以动态的添加元数据服务器和存储节点,容量可以动态扩展。

ceph分为mon监视器节点(至少一个)、osd对象存储节点(至少2个)、mds元数据节点。

osd进程负责存储数据、处理数据的复制、恢复、回填、再平衡。并通过其他的osd守护进程的心跳,来向mon提供一些监控信息。当你设置osd有2个副本的时候,至少需要2个osd守护进程才能达到archive+clean的状态,默认有3个副本。

mon负责维护集群状态的各种图表,包括监视图和osd图等。

mds负责为ceph文件系统存储数据的时候才使用。

存储的过程:存储的文件数据归类为对象object;对象放在对应的池子里面(pool);pool由若干个pg组成;pg是由若干个osd组成;osd是由硬盘组成。

环境

k8s-node1 172.16.1.201管理节点 数据节点

k8s-node2 172.16.1.202数据节点

k8s-node3 172.16.1.203 数据节点

上述要加入/etc/hosts文件里面。

该实验的操作系统为centos 7,ceph k版本。

ceph的部署

1、关闭系统上的防火墙 以及selinux

2、拷贝管理节点的秘钥到其他节点实现无密码登录

ssh-keygen-trsassh-copy-idroot@ceph-node1.....

3、在各个节点上配置需要的yum源

[Ceph]name=Cephpackagesfor$basearchbaseurl=http://mirrors.163.com/ceph/rpm-kraken/el7/$basearchenabled=1priority=1gpgcheck=1gpgkey=https://download.ceph.com/keys/release.asc[Ceph-noarch]name=Cephnoarchpackagesbaseurl=http://mirrors.163.com/ceph/rpm-kraken/el7/noarchenabled=1priority=1gpgcheck=1gpgkey=https://download.ceph.com/keys/release.asc[ceph-source]name=Cephsourcepackagesbaseurl=http://mirrors.163.com/ceph/rpm-kraken/el7/SRPMSenabled=0priority=1gpgcheck=1gpgkey=https://download.ceph.com/keys/release.asc

4、管理节点安装ceph-deploy工具

[root@k8s-node1yum.repos.d]#yum-yinstallceph-deploy

5、管理节点创建工作目录

[root@k8s-node1~]#mkdir-p/etc/ceph

6 、创建两个mon

[root@k8s-node1~]#cd/etc/ceph[root@k8s-node1ceph]#ls[root@k8s-node1ceph]#ceph-deploynewk8s-node1k8s-node2##这个意思是在k8s-node1和k8s-node2上分别创建一个mon,[root@k8s-node1ceph]#lsceph.confceph-deploy-ceph.logceph.mon.keyring

7、默认情况下最少是需要一个mon、 2个osd

在配置文件ceph.conf 中加入我们的业务网段配置public network =172.16.22.0/24,结果如下:

[root@k8s-node1ceph]#vimceph.conf[global]fsid=2e6519d9-b733-446f-8a14-8622796f83efmon_initial_members=k8s-node1,k8s-node2mon_host=172.16.22.201,172.16.22.202auth_cluster_required=cephxauth_service_required=cephxauth_client_required=cephxpublicnetwork=172.16.22.0/24

8、 安装ceph 集群

[root@k8s-node1ceph]#ceph-deployinstallk8s-node1k8s-node2

9、 初始化mon 并收集所有的秘钥

[root@k8s-node1ceph]#ceph-deploymoncreate-initial[root@k8s-node1ceph]#lsceph.bootstrap-mds.keyringceph.bootstrap-osd.keyringceph.client.admin.keyringceph-deploy-ceph.logrbdmapceph.bootstrap-mgr.keyringceph.bootstrap-rgw.keyringceph.confceph.mon.keyring

10、查看创建的集群用户

[root@k8s-node1ceph]#cephauthlistinstalledauthentries:client.adminkey:AQBavtVb2irGJBAAsbJcna7p5fdAXykjVbxznA==caps:[mds]allow*caps:[mgr]allow*caps:[mon]allow*caps:[osd]allow*client.bootstrap-mdskey:AQBavtVbbNgXOxAAkvfj6L49OUfFX5XWd651AQ==caps:[mon]allowprofilebootstrap-mdsclient.bootstrap-mgrkey:AQBbvtVbwiRJExAAdsh2uG+nL8l3UECzLT4+vw==caps:[mon]allowprofilebootstrap-mgrclient.bootstrap-osdkey:AQBbvtVbUV0NJxAAJAQ/yBs0c37C7ShBahwzsw==caps:[mon]allowprofilebootstrap-osdclient.bootstrap-rgwkey:AQBbvtVb/h/pOhAAmwK9r8DeqlOpQHxz9F/9eA==caps:[mon]allowprofilebootstrap-rgwmgr.k8s-node1key:AQBXvtVbeW/zKBAAfntYBheS7AkCwimr77PqEQ==caps:[mon]allow*

11、创建osd

创建osd有两种方式

a、使用系统裸盘,作为存储空间;

b、使用现有文件系统,以目录或分区作为存储空间,官方建议为 OSD 及其日志使用独立硬盘或分区作为存储空间

1)、使用分区

[root@k8s-node1ceph]#ceph-deploydiskzapk8s-node1:/dev/sdbk8s-node2:/dev/sdb##通过zap命令清除分区及磁盘内容[root@k8s-node1ceph]#ceph-deployosdpreparek8s-node1:/dev/sdbk8s-node2:/dev/sdb[root@k8s-node1ceph]#ceph-deployosdactivatek8s-node1:/dev/sdbk8s-node2:/dev/sdb

2)、 使用目录

[root@k8s-node1ceph]#sshk8s-node1“mkdir/data/osd0;chown-Rceph:ceph/data/osd0"[root@k8s-node1ceph]#sshk8s-node2“mkdir/data/osd0;chown-Rceph:ceph/data/osd0

[root@k8s-node1ceph]#ceph-deployosdpreparek8s-node1:/data/osd0k8s-node2:/data/osd0[root@k8s-node1ceph]#ceph-deployosdactivatek8s-node1:/data/osd0k8s-node2:/data/osd0

12、使用ceph-deploy把配置文件和admin 秘钥下发到所有节点

[root@k8s-node1ceph]#ceph-deployadmink8s-node1k8s-node2

13 、给每一个节点的keyring 增加 r 权限

chmod+r/etc/ceph/ceph.client.admin.keyring

14、检查集群的健康状况

[root@k8s-node1ceph]#ceph-scluster2e6519d9-b733-446f-8a14-8622796f83efhealthHEALTH_WARN#这个警告可以忽略64pgsdegraded64pgsstuckunclean64pgsundersizedmonmape2:1monsat{k8s-node1=172.16.22.201:6789/0}electionepoch4,quorum0k8s-node1mgractive:k8s-node1osdmape9:2osds:2up,2in##看这,个数是否对flagssortbitwise,require_jewel_osds,require_kraken_osdspgmapv21:64pgs,1pools,0bytesdata,0objects22761MBused,15722MB/38484MBavail64active+undersized+degraded[root@k8s-node1ceph]#cephhealthHEALTH_WARN64pgsdegraded;64pgsstuckunclean;64pgsundersized

[root@k8s-node1ceph]#cephosdtreeIDWEIGHTTYPENAMEUP/DOWNREWEIGHTPRIMARY-AFFINITY-10.03677rootdefault-20.01839hostk8s-node100.01839osd.0up1.000001.00000-30.01839hostk8s-node210.01839osd.1up1.000001.00000

[root@k8s-node1ceph]#cephdfGLOBAL:SIZEAVAILRAWUSED%RAWUSED38484M15719M22764M59.15POOLS:NAMEIDUSED%USEDMAXAVAILOBJECTSrbd0004570M0

这样,我们就搭建完了两个节点的ceph集群,其中1个mon,2个osd。

下面我们再介绍mon和osd的扩展

ceph集群的扩展新增一个osd k8s-node3

1、以下操作,大部分命令是在k8s-node1上执行的(前面我们让k8s-node1充当管理节点)

#切换到k8s-node1的/etc/ceph目录下[root@k8s-node1~]#cd/etc/ceph/#给k8s-node3上安装ceph-deploy软件,但是如下命令要在k8s-node1上执行[root@k8s-node1ceph]#ceph-deployinstallk8s-node3#下面这个命令在k8s-node3上执行[root@k8s-node3ceph]#mkdir/data/osd0-p[root@k8s-node3ceph]#chown-Rceph:ceph/data/osd0#给k8s-node3创建osd[root@k8s-node1ceph]#ceph-deployosdpreparek8s-node3:/data/osd0[root@k8s-node1ceph]#ceph-deployosdactivatek8s-node3:/data/osd0#查看k8s-node3已经被加入集群里面了[root@k8s-node1ceph]#ceph-scluster2e6519d9-b733-446f-8a14-8622796f83efhealthHEALTH_OKmonmape2:1monsat{k8s-node1=172.16.22.201:6789/0}electionepoch4,quorum0k8s-node1mgractive:k8s-node1osdmape14:3osds:3up,3inflagssortbitwise,require_jewel_osds,require_kraken_osdspgmapv7372:64pgs,1pools,0bytesdata,0objects35875MBused,21850MB/57726MBavail64active+clean[root@k8s-node1ceph]#[root@k8s-node1ceph]#[root@k8s-node1ceph]#cephosdtreeIDWEIGHTTYPENAMEUP/DOWNREWEIGHTPRIMARY-AFFINITY-10.05516rootdefault-20.01839hostk8s-node100.01839osd.0up1.000001.00000-30.01839hostk8s-node210.01839osd.1up1.000001.00000-40.01839hostk8s-node320.01839osd.2up1.000001.00000增加一个新的mon在k8s-node3 上面

在k8s-node1上执行

[root@k8s-node1ceph]#ceph-deploymonaddk8s-node3[root@k8s-node1ceph]#ceph-scluster2e6519d9-b733-446f-8a14-8622796f83efhealthHEALTH_OKmonmape4:3monsat{k8s-node1=172.16.22.201:6789/0,k8s-node2=172.16.22.202:6789/0,k8s-node3=172.16.22.203:6789/0}electionepoch8,quorum0,1,2k8s-node1,k8s-node2,k8s-node3mgractive:k8s-node1standbys:k8s-node3,k8s-node2osdmape14:3osds:3up,3inflagssortbitwise,require_jewel_osds,require_kraken_osdspgmapv7517:64pgs,1pools,0bytesdata,0objects35890MBused,21835MB/57726MBavail64active+clean

[root@k8s-node1ceph]#cephmonstate4:3monsat{k8s-node1=172.16.22.201:6789/0,k8s-node2=172.16.22.202:6789/0,k8s-node3=172.16.22.203:6789/0},electionepoch10,quorum0,1,2k8s-node1,k8s-node2,k8s-node3在k8s-node1增加一个元数据的角色

元数据是在文件系统时才有用,而我们用的是块设备,所以就没用了

[root@k8s-node1ceph]#ceph-deploymdscreatek8s-node1