简介

ceph作为一个统一的分布式存储系统,提供了高性能,高可用性,高扩展性。ceph的统一体现在其可以提供文件系统、块存储、对象存储,在云环境中,通常采用ceph作为后端存储来保证数据的高可用性。

ceph发表于2004年,随后开源给社区。进过十几年发展,目前得到众多云厂商支持并广泛使用。比如openstack\kubernetes\虚拟机系统等。。。

架构图:

特点

  • 高性能

    采用CRUSH算法,数据分布均衡,并行度高。

    容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。

    能够支持上千个存储节点的规模,支持TB到PB级的数据。
  • 高可用性

    副本数可以灵活控制。

    支持故障域分隔,数据强一致性。

    多种故障场景自动进行修复自愈。

    没有单点故障,自动管理。
  • 高可扩展性

    去中心化。

    扩展灵活。

    随着节点增加而线性增长。

    支持三种存储接口:块存储、文件存储、对象存储

    支持自定义接口,支持多种语言驱动

部署方式

1、部署到裸机,作为独立的存储集群,为kubernetes提供存储服务(线上环境推荐)

2、部署到kubernetes集群之上,使用Rook管理ceph。Rook是一个可以提供Ceph集群管理能力的Operator,它使用CRD控制器来对ceph的资源进行部署和管理。相比部署到裸机。更接近kubernetes,但是属于一个新的东西,稳定性和故障处理难易程度有不确定性,生成环境需要自行评估。

3、作为测试,本文就采用rook来部署ceph集群。

先看下架构图





从以上两张官方给的图可以看出,

Rook Operator是核心组件,它主要用来其中存储集群,并监控存储守护进程,确保存储集群的健康。

Rook Agent运行到每一个存储节点,并配置了FlexVolume插件和Kubernetes 的存储卷控制框架(CSI)进行集成。

Rook 用 Kubernetes Pod 的形式,部署 Ceph的MON、OSD 以及 MGR守护进程。

4、部署ceph前,需要确保你的服务器有空闲的硬盘给ceph集群使用,一般是三块或者更多,如果只是测试最少一块。

如下所示,sdb就是给ceph用的

fdisk  -l

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0001ce60 Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 209715199 103808000 8e Linux LVM

部署rook-ceph

安装root-operator,本文部署到命名空间:rook

1、部署common资源

[root@k8s-master001 rook]# kubectl  apply -f common.yaml
namespace/rook created
Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
。。中间省略N行
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role created

2、部署operator资源

[root@k8s-master001 rook]# kubectl label node k8s-master003 app.storage=rook-ceph
node/k8s-master003 labeled
[root@k8s-master001 rook]# kubectl label node k8s-master002 app.storage=rook-ceph
node/k8s-master002 labeled
[root@k8s-master001 rook]# kubectl label node k8s-master001 app.storage=rook-ceph
node/k8s-master001 labeled [root@k8s-master001 rook]# kubectl apply -f operator.yaml
configmap/rook-ceph-operator-config created
deployment.apps/rook-ceph-operator created [root@k8s-master001 rook]# kubectl get po -n rook
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-87f875bbc-zz9lb 0/1 Pending 0 106s
再次查看,知道全部Pod为Running状态,表示安装成功
如果不是Runing状态,可以使用例如:kubectl describe po rook-discover-5qrc6 -n rook 查看详情,一般情况可能是镜像下载失败,如果是其他情况,请根据实际情况自行解决。。。
[root@k8s-master001 rook]# kubectl get po -n rook
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-87f875bbc-zz9lb 1/1 Running 3 27m
rook-discover-5qrc6 1/1 Running 0 3m42s
rook-discover-fzfz5 1/1 Running 0 3m52s
rook-discover-fzg7r 1/1 Running 0 20m

3、创建ceph集群

这里需要根据实际情况修改cluster.yaml文件

设置ceph存储节点,使用的硬盘,否则会把系统可用的磁盘都格式化了,这里需要设置如下

  storage: # cluster level storage configuration and selection
useAllNodes: false
useAllDevices: false
#deviceFilter:
config:
# metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.
# databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB
# journalSizeMB: "1024" # uncomment if the disks are 20 GB or smaller
# osdsPerDevice: "1" # this value can be overridden at the node or device level
# encryptedDevice: "true" # the default value for this option is "false"
# Individual nodes and their config can be specified as well, but 'useAllNodes' above must be set to false. Then, only the named
# nodes below will be used as storage resources. Each node's 'name' field should match their 'kubernetes.io/hostname' label.
nodes:
- name: "10.26.25.20" #这个地方最好写hostname
devices:
- name: "sdb"
- name: "10.26.25.21"
devices:
- name: "sdb"
- name: "10.26.25.22"
devices:
- name: "sdb"

修改节点情和性,把ceph安装到固定标签的节点,这里使用app.storage=rook-ceph这个标签。

  placement:
all:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: app.storage
operator: In
values:
- rook-ceph

执行部署命令,这个环节需要下载ceph的一些镜像,根据网络情况,耗时可能会比较长。。。

[root@k8s-master001 rook]# kubectl  apply -f cluster.yaml
cephcluster.ceph.rook.io/rook-ceph created [root@k8s-master001 rook]# kubectl get po -n rook
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-2fsl9 3/3 Running 0 6m54s
csi-cephfsplugin-4r5cg 3/3 Running 0 6m55s
csi-cephfsplugin-htdjs 3/3 Running 0 6m54s
csi-cephfsplugin-provisioner-7646976d94-9kfd6 5/5 Running 1 6m53s
csi-cephfsplugin-provisioner-7646976d94-rbztr 5/5 Running 0 6m53s
csi-rbdplugin-56jpj 3/3 Running 0 6m59s
csi-rbdplugin-8h25h 3/3 Running 0 6m59s
csi-rbdplugin-provisioner-55c946c8c-d25g4 6/6 Running 2 6m58s
csi-rbdplugin-provisioner-55c946c8c-g77s8 6/6 Running 1 6m57s
csi-rbdplugin-z4qpw 3/3 Running 0 6m59s
rook-ceph-crashcollector-k8s-master001-6975bdf888-bpm7r 1/1 Running 0 2m6s
rook-ceph-crashcollector-k8s-master002-746b76cd87-5xzz4 1/1 Running 0 3m18s
rook-ceph-crashcollector-k8s-master003-5b54f4496-hntgb 1/1 Running 0 2m34s
rook-ceph-mgr-a-58594cfb7d-l7wjg 1/1 Running 0 2m7s
rook-ceph-mon-a-84b755686-c6cxr 1/1 Running 0 3m18s
rook-ceph-mon-b-776469c655-d5jb7 1/1 Running 0 3m1s
rook-ceph-mon-c-64648fbd69-n5jh4 1/1 Running 0 2m35s
rook-ceph-operator-87f875bbc-cgvwm 1/1 Running 3 7m35s
rook-discover-d9fpp 1/1 Running 0 7m31s
rook-discover-kxmdx 1/1 Running 0 7m31s
rook-discover-z9kzt 1/1 Running 0 7m31s

从以上输出可以看到,没有任何OSD的pod在运行。



查看rook-discover-kxmdx日志发现。能够找到硬盘sdb,但是没有对硬盘进程任何操作

,突然想到ceph也是通过关键lvm来格式化硬盘的,然后查看系统,果然没有安装lvm2,果断重来吧:

kubectl delete -f cluster.yaml
kubectl delete -f operator.yaml
kubectl delete -f common.yaml
在所有节点删除
rm -rf /var/lib/rook/*

安装lvm2

yum install -y lvm2

再次部署

[root@k8s-master001 rook]#  kubectl  get po -n rook
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-9l55s 3/3 Running 0 10m
csi-cephfsplugin-czwlx 3/3 Running 0 10m
csi-cephfsplugin-np7n7 3/3 Running 0 10m
csi-cephfsplugin-provisioner-7646976d94-579qz 5/5 Running 3 10m
csi-cephfsplugin-provisioner-7646976d94-v68wg 5/5 Running 0 10m
csi-rbdplugin-9q82d 3/3 Running 0 10m
csi-rbdplugin-l55zq 3/3 Running 0 10m
csi-rbdplugin-provisioner-55c946c8c-ft4xl 6/6 Running 0 10m
csi-rbdplugin-provisioner-55c946c8c-zkzh7 6/6 Running 1 10m
csi-rbdplugin-wk7cw 3/3 Running 0 10m
rook-ceph-crashcollector-k8s-master001-6c4c78b6cd-gcfvn 1/1 Running 0 6m17s
rook-ceph-crashcollector-k8s-master002-746b76cd87-47k84 1/1 Running 0 9m7s
rook-ceph-crashcollector-k8s-master003-5b54f4496-ts64m 1/1 Running 0 8m43s
rook-ceph-mgr-a-66779c74c5-cnxbm 1/1 Running 0 8m16s
rook-ceph-mon-a-5b7bcd77ff-sb4fz 1/1 Running 0 9m25s
rook-ceph-mon-b-779c8467d4-bfd4g 1/1 Running 0 9m7s
rook-ceph-mon-c-574fd97c79-v5qcd 1/1 Running 0 8m44s
rook-ceph-operator-87f875bbc-z7rwn 1/1 Running 1 11m
rook-ceph-osd-0-66775549dc-g2ttv 1/1 Running 0 6m11s
rook-ceph-osd-2-6c5b4fc67-gtqjf 1/1 Running 0 6m20s
rook-ceph-osd-prepare-k8s-master001-jbpgg 0/1 Completed 0 8m13s
rook-ceph-osd-prepare-k8s-master002-vfvnp 0/1 Completed 0 8m12s
rook-ceph-osd-prepare-k8s-master003-ffd6r 0/1 Completed 0 6m28s
rook-discover-74qf2 1/1 Running 0 10m
rook-discover-fk4wn 1/1 Running 0 10m
rook-discover-fvbcf 1/1 Running 0 10m

终于看到rook-ceph-osd-*的Pod在运行了。osd如果没有运行,ceph是不能提供存储能力的。

4、创建ceph-dashboard

[root@k8s-master001 rook]# kubectl apply -f dashboard-external-https.yaml
service/rook-ceph-mgr-dashboard-external-https created 使用如下命令查询dashboard的admin密码
MGR_POD=`kubectl get pod -n rook | grep mgr | awk '{print $1}'`
kubectl -n rook-ceph logs $MGR_POD | grep password

5、安装ceph-tool工具,就是一个ceph客户端工具,可以使用ceph命令管理ceph集群

[root@k8s-master001 rook]# kubectl apply -f toolbox.yaml

6、创建kubernetes集群存储类,默认reclaimPolicy:策略从Delete改成Retain,看自己需求改

[root@k8s-master001 rook]# kubectl  apply -f storageclass.yaml
cephblockpool.ceph.rook.io/k8spool created
storageclass.storage.k8s.io/rook-ceph created

使用ceph为kubernetes提供存储

验证存储类是否可使用,这里使用了nodeSelector,把pod指定到特定机器,也可以不设置

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: demo001
labels:
app: demo00
spec:
serviceName: demo001
replicas: 1
selector:
matchLabels:
app: demo001
template:
metadata:
labels:
app: demo001
spec:
terminationGracePeriodSeconds: 180
nodeSelector:
kubernetes.io/hostname: k8s-master001
containers:
- name: demo001
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: port
volumeMounts:
- name: volume
mountPath: /var/www/html
volumeClaimTemplates:
- metadata:
name: volume
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: rook-ceph
resources:
requests:
storage: 1Gi

执行部署kubectl apply -f demo.yaml

[root@k8s-master001 rook]# kubectl  get po
NAME READY STATUS RESTARTS AGE
demo001-0 1/1 Running 0 78s
查看可提供服务的存储类
[root@k8s-master001 rook]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph rook.rbd.csi.ceph.com Retain Immediate true 8m15s
看已经创建的存储卷
[root@k8s-master001 rook]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 1Gi RWO Retain Bound default/volume-demo001-0 rook-ceph 104s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/volume-demo001-0 Bound pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 1Gi RWO rook-ceph 110s

从以上输出可以看出,kubernetes通过调用存储类创建了PV:pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 ,并把它和PVC:volume-demo001-0绑定。

现在我们进入nginx pod,查看挂载的磁盘情况

[root@k8s-master001 rook]# kubectl  exec -ti demo001-0  /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 50G 5.6G 45G 12% /
/dev/rbd0 976M 2.6M 958M 1% /var/www/html

这里/dev/rbd0就是ceph集群为nginx提供的后端存储,大小为1G,在demo.yaml部署文件中指定。

避坑总结

1、因为ceph在穿件osd的时候需要用到系统工具lvm2,部署之前最好提前装好。

2、在cluster.yaml中指定硬盘信息是,最好使用hostname,或者保证DNS系统解析正确。

nodes:
- name: "10.26.25.20" #这个地方最好写hostname
devices:
- name: "sdb"

3、用来给ceph使用的硬盘不要手动建分区。

4、如果重新部署,记得再次部署之前先删除/var/lib/rook/目录,避免有老的集群信息残留。

5、生产环境最好使用标签,把ceph安装到指定的节点,同时避免安装到master节点。

容器云平台No.6~企业级分布式存储Ceph的更多相关文章

  1. 容器云平台No.5~企业级私有镜像仓库Harbor V2.02

    镜像仓库 仓库,顾名思义,就是存放东西的地方,Docker仓库,理所当然,就是存放docker镜像的地方了. Docker仓库分公有仓库和私有仓库.共有仓库有hub.docker.com.gcr.io ...

  2. 轻量化安装 TKEStack:让已有 K8s 集群拥有企业级容器云平台的能力

    关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...

  3. 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台

    开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...

  4. Kubernetes容器云平台建设实践

    [51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...

  5. 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)

    [编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...

  6. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  7. 微服务与K8S容器云平台架构

    微服务与K8S容器云平台架构 微服务与12要素 网络 日志收集 服务网关 服务注册 服务治理- java agent 监控 今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, ...

  8. 容器云平台使用体验:DaoCloud

    容器技术风起云涌,在国内也涌现出了很多容器技术创业公司,本文介绍容器厂商DaoCloud提供的容器云平台,通过使用容器云平台,可以让大家更加了解容器,并可以学习不同容器云平台的优势. 1.       ...

  9. 容器云平台No.4~kubernetes 服务暴露之Ingress

    这是容器云平台第四篇,接上一篇继续, 首先kubernetes服务暴露有如下几种方式: NodePort Loadbalance ClusterIP Ingress 本文紧贴第一篇架构图,只介绍Ing ...

随机推荐

  1. onlyoffice在线编辑

    一.安装ONLYOFFICE Document Server 二.集成onlyoffice的二次开发 三.故障排除: 四.缺陷 五.总结 ONLYOFFICE Document Server提供文档协 ...

  2. Python方法oslo_service.loopingcall.LoopingCallDone代码示例

    Python方法oslo_service.loopingcall.LoopingCallDone代码示例 demo: from oslo_service import loopingcall def ...

  3. Linux下安装mysql时报错:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:Data::Dumper

    如题,安装mysql过程中,执行scripts/mysql_install_db --user=mysql命令时报错: FATAL ERROR: please install the followin ...

  4. Alpha阶段项目复审(小菜鸡联盟)

    Alpha项目复审 小队:小菜鸡联盟 团队名称 项目名称 评价 排名 『S.L.N』 OnTime 优点:团队分工合理明确,每个成员有一定的开发经验,能用到自己较为熟悉的技术进行开发:在开发初期制定了 ...

  5. SPSSAU数据分析思维培养系列4:数据可视化篇

    本文章为SPSSAU数据分析思维培养的第4期文章. 前3期内容分别讲述数据思维,分析方法和分析思路.本文讲述如何快速使用SPSSAU进行高质量作图,以及如何选择使用正确的图形. 本文分别从五个角度进行 ...

  6. Mysql安装错误

    [问题一]在安装mysql时遇到以下错误 执行./mysqld --initialize 后 ./bin/mysqld: error while loading shared libraries: l ...

  7. FormData格式的数据

    向服务器提交的是FormData格式的数据 || 必须添加以下两个配置项 contentType:false, processData:false,

  8. codeblocks显示:不支持的16位应用程序 解决办法

    我是win10 64位系统,写c++运行就会显示不兼容16位应用程序.以前编出来的exe还能用,今天编出的就炸了. 试了用vs编译.vs能用. 试了网上找的各种解决方案, 360修复, 注册表, 重构 ...

  9. windows 下编译libcurl

    因为linux平台采用了libcurl,有一个程序移植到到windows平台,再linux采用libcurl.在windows下准备也采用该库.在网上搜索了几位同行写的,步骤上面有缺失. 本文将以详细 ...

  10. 微信小程序事件绑定

    一 通过实例来认识 (一) 给出代码 我们直接通过一个实例来引入我们想要讲解的内容: <input type="text" bindinput="handleInp ...