简介

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. Jmeter 常用函数(17)- 详解 __substring

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 从字符串中获取指定范围的子串 语法格式 ...

  2. 文章目录&友情链接

    文章目录&友情链接 1:<公告:本博客开始写博文了> 2.本人网络图书馆

  3. docker flannel网络部署和路由走向分析

    1.flannel介绍 flannel是coreos开发的容器网络解决方案.flannel为每个host分配一个subnet,容器从此subnet中分配ip.这些ip可以在host间路由,容器间无需n ...

  4. Docker系列——Docker安装&基础命令

    Docker 概述 Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. ...

  5. ID3\C4.5\CART

    目录 树模型原理 ID3 C4.5 CART 分类树 回归树 树创建 ID3.C4.5 多叉树 CART分类树(二叉) CART回归树 ID3 C4.5 CART 特征选择 信息增益 信息增益比 基尼 ...

  6. JS获取时间(当前-过去-未来)

    /** * 获取时间格式为:1970-01-01 00:00 * @param {参数} params * 属性 类型 默认值 必填 说明 * date Date new Date() 否 Date对 ...

  7. python yaml文件数据按原有的数据顺序dump

    yml文件的更新后工具类: import os import yaml class YamlUtils(): def __init__(self,folder_name='config'): self ...

  8. 关键词seo优化的核心和重点

    http://www.wocaoseo.com/thread-197-1-1.html        网站SEO优化是很多站长所必须要面对的问题,但是很多新手站长对关键词应如何选择,关键词要如何布局一 ...

  9. discuz论坛替换logo之后不显示该怎么办

    http://www.wocaoseo.com/thread-2-1-1.html 这个虽然不算是seo的问题,但是在平时的操作之中经常性的遇到,常常是我用FTP已经上传替换了原来的logo,但是前台 ...

  10. 项目介入EF Core

    目前.Net主流的ORM有SqlSugar.Entity Framework.Dapper,其它的我就不列举了.其实和Java那边ibatis相比,他们都比较轻量.之前用ibatis开发,真的很麻烦, ...