简介

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. go module 获取码云私有仓库代码

    因为码云免费组织有5人限制,其他人想获得代码 只能通过别的方式 go mod 底层使用的git 获取代码, 所以首先解决如何通过git clone代码 思路为通过ssh密钥的方式获取 首先在码云仓库部 ...

  2. OVS DPDK VXLAN隧道处理

    原文链接: OVS DPDK VXLAN隧道处理

  3. golang学习笔记:Interface类型断言详情

    原文链接:https://www.2cto.com/kf/201712/703563.html 1. 用于判断变量类型 demo如下: switch t := var.(type){ case str ...

  4. 操作系统-进程(3)Linux下的进程相关命令

    操作系统给予这个内存中的单元一个标识符(PID)依据登入者的UID/GID(/etc/passwd) 衍生出的其它程序(子程序),一般情况也,也会沿用这个程序(父程序)的相关权限 ParentID(P ...

  5. mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的区别

    1. Normal 普通索引 2. Unique 唯一索引 3. Full Text 全文索引 4. SPATIAL 空间索引 5. btree索引和hash索引的区别 6. 在实际操作过程中,应该选 ...

  6. 第三篇 Scrum冲刺博客

    一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 商品列表,商品详情轮播图 商品底部工具栏,购物车列表 陈泽佳 历史足迹,静态页面 渲染搜索结果,防抖的实现 徐伟浩 未完成 商品信息录入 ...

  7. 发布 npm遇到的问题

    npm publish 遇到 403 怎么办? 这说明你没有切换到 npm 原始源,那么你只需要用 npm config delete registry 删除淘宝源,然后再 publish. publ ...

  8. Java面试题(设计模式篇+Spring/Spring MVC篇)

    设计模式 88.说一下你熟悉的设计模式? 自行熟悉. 89.简单工厂和抽象工厂有什么区别? 简单理解简单工厂:对 一个对象的创建进行封装.抽象工厂:对 一组对象的创建进行封装. 比如生产 陶瓷马 和  ...

  9. 华为云服务器安装hadoop2.7.5

    1. 安装环境 1.1硬件环境 1.1.1 NameNode 配置项 详细参数 主机 k8s-master CPU Intel(R) Xeon(R) Gold 6278C CPU @ 2.60GHz ...

  10. PHP使用FilesystemIterator迭代器遍历目录

    /**  * PHP高效遍历文件夹(大量文件不会卡死)  * @param string $path 目录路径  * @param integer $level 目录深度  */ function f ...