容器云平台No.6~企业级分布式存储Ceph~v14.2.10
Posted 菜鸟运维杂谈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器云平台No.6~企业级分布式存储Ceph~v14.2.10相关的知识,希望对你有一定的参考价值。
简介
ceph作为一个统一的分布式存储系统,提供了高性能,高可用性,高扩展性。ceph的统一体现在其可以提供文件系统、块存储、对象存储,在云环境中,通常采用ceph作为后端存储来保证数据的高可用性。
ceph发表于2004年,随后开源给社区。经过十几年发展,目前得到众多云厂商支持并广泛使用。比如openstackkubernetes虚拟机系统等。。。
架构图:
特点
高性能
采用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用的
1fdisk -l
2
3Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
4Units = sectors of 1 * 512 = 512 bytes
5Sector size (logical/physical): 512 bytes / 512 bytes
6I/O size (minimum/optimal): 512 bytes / 512 bytes
7
8
9Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
10Units = sectors of 1 * 512 = 512 bytes
11Sector size (logical/physical): 512 bytes / 512 bytes
12I/O size (minimum/optimal): 512 bytes / 512 bytes
13Disk label type: dos
14Disk identifier: 0x0001ce60
15
16 Device Boot Start End Blocks Id System
17/dev/sda1 * 2048 2099199 1048576 83 Linux
18/dev/sda2 2099200 209715199 103808000 8e Linux LVM
部署rook-ceph
安装root-operator,本文部署到命名空间:rook
1、部署common资源
1[root@k8s-master001 rook]# kubectl apply -f common.yaml
2namespace/rook created
3Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
4。。中间省略N行
5clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role created
2、部署operator资源
1[root@k8s-master001 rook]# kubectl label node k8s-master003 app.storage=rook-ceph
2node/k8s-master003 labeled
3[root@k8s-master001 rook]# kubectl label node k8s-master002 app.storage=rook-ceph
4node/k8s-master002 labeled
5[root@k8s-master001 rook]# kubectl label node k8s-master001 app.storage=rook-ceph
6node/k8s-master001 labeled
7
8[root@k8s-master001 rook]# kubectl apply -f operator.yaml
9configmap/rook-ceph-operator-config created
10deployment.apps/rook-ceph-operator created
11
12[root@k8s-master001 rook]# kubectl get po -n rook
13NAME READY STATUS RESTARTS AGE
14rook-ceph-operator-87f875bbc-zz9lb 0/1 Pending 0 106s
15
16再次查看,知道全部Pod为Running状态,表示安装成功
17如果不是Runing状态,可以使用例如:kubectl describe po rook-discover-5qrc6 -n rook
18查看详情,一般情况可能是镜像下载失败,如果是其他情况,请根据实际情况自行解决。。。
19
20[root@k8s-master001 rook]# kubectl get po -n rook
21NAME READY STATUS RESTARTS AGE
22rook-ceph-operator-87f875bbc-zz9lb 1/1 Running 3 27m
23rook-discover-5qrc6 1/1 Running 0 3m42s
24rook-discover-fzfz5 1/1 Running 0 3m52s
25rook-discover-fzg7r 1/1 Running 0 20m
3、创建ceph集群
这里需要根据实际情况修改cluster.yaml文件
设置ceph存储节点,使用的硬盘,否则会把系统可用的磁盘都格式化了,这里需要设置如下
1 storage: # cluster level storage configuration and selection
2 useAllNodes: false
3 useAllDevices: false
4 #deviceFilter:
5 config:
6 # metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.
7 # databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB
8 # journalSizeMB: "1024" # uncomment if the disks are 20 GB or smaller
9 # osdsPerDevice: "1" # this value can be overridden at the node or device level
10 # encryptedDevice: "true" # the default value for this option is "false"
11# Individual nodes and their config can be specified as well, but 'useAllNodes' above must be set to false. Then, only the named
12# nodes below will be used as storage resources. Each node's 'name' field should match their 'kubernetes.io/hostname' label.
13 nodes:
14 - name: "10.26.25.20" #这个地方最好写hostname
15 devices:
16 - name: "sdb"
17 - name: "10.26.25.21"
18 devices:
19 - name: "sdb"
20 - name: "10.26.25.22"
21 devices:
22 - name: "sdb"
修改节点情和性,把ceph安装到固定标签的节点,这里使用app.storage=rook-ceph这个标签。
1 placement:
2 all:
3 nodeAffinity:
4 requiredDuringSchedulingIgnoredDuringExecution:
5 nodeSelectorTerms:
6 - matchExpressions:
7 - key: app.storage
8 operator: In
9 values:
10 - rook-ceph
执行部署命令,这个环节需要下载ceph的一些镜像,根据网络情况,耗时可能会比较长。。。
1[root@k8s-master001 rook]# kubectl apply -f cluster.yaml
2cephcluster.ceph.rook.io/rook-ceph created
3
4[root@k8s-master001 rook]# kubectl get po -n rook
5NAME READY STATUS RESTARTS AGE
6csi-cephfsplugin-2fsl9 3/3 Running 0 6m54s
7csi-cephfsplugin-4r5cg 3/3 Running 0 6m55s
8csi-cephfsplugin-htdjs 3/3 Running 0 6m54s
9csi-cephfsplugin-provisioner-7646976d94-9kfd6 5/5 Running 1 6m53s
10csi-cephfsplugin-provisioner-7646976d94-rbztr 5/5 Running 0 6m53s
11csi-rbdplugin-56jpj 3/3 Running 0 6m59s
12csi-rbdplugin-8h25h 3/3 Running 0 6m59s
13csi-rbdplugin-provisioner-55c946c8c-d25g4 6/6 Running 2 6m58s
14csi-rbdplugin-provisioner-55c946c8c-g77s8 6/6 Running 1 6m57s
15csi-rbdplugin-z4qpw 3/3 Running 0 6m59s
16rook-ceph-crashcollector-k8s-master001-6975bdf888-bpm7r 1/1 Running 0 2m6s
17rook-ceph-crashcollector-k8s-master002-746b76cd87-5xzz4 1/1 Running 0 3m18s
18rook-ceph-crashcollector-k8s-master003-5b54f4496-hntgb 1/1 Running 0 2m34s
19rook-ceph-mgr-a-58594cfb7d-l7wjg 1/1 Running 0 2m7s
20rook-ceph-mon-a-84b755686-c6cxr 1/1 Running 0 3m18s
21rook-ceph-mon-b-776469c655-d5jb7 1/1 Running 0 3m1s
22rook-ceph-mon-c-64648fbd69-n5jh4 1/1 Running 0 2m35s
23rook-ceph-operator-87f875bbc-cgvwm 1/1 Running 3 7m35s
24rook-discover-d9fpp 1/1 Running 0 7m31s
25rook-discover-kxmdx 1/1 Running 0 7m31s
26rook-discover-z9kzt 1/1 Running 0 7m31s
从以上输出可以看到,没有任何OSD的pod在运行。
查看rook-discover-kxmdx日志发现。能够找到硬盘sdb,但是没有对硬盘进程任何操作
,突然想到ceph也是通过关键lvm来格式化硬盘的,然后查看系统,果然没有安装lvm2,果断重来吧:
1kubectl delete -f cluster.yaml
2kubectl delete -f operator.yaml
3kubectl delete -f common.yaml
4在所有节点删除
5rm -rf /var/lib/rook/*
安装lvm2
1yum install -y lvm2
再次部署
1[root@k8s-master001 rook]# kubectl get po -n rook
2NAME READY STATUS RESTARTS AGE
3csi-cephfsplugin-9l55s 3/3 Running 0 10m
4csi-cephfsplugin-czwlx 3/3 Running 0 10m
5csi-cephfsplugin-np7n7 3/3 Running 0 10m
6csi-cephfsplugin-provisioner-7646976d94-579qz 5/5 Running 3 10m
7csi-cephfsplugin-provisioner-7646976d94-v68wg 5/5 Running 0 10m
8csi-rbdplugin-9q82d 3/3 Running 0 10m
9csi-rbdplugin-l55zq 3/3 Running 0 10m
10csi-rbdplugin-provisioner-55c946c8c-ft4xl 6/6 Running 0 10m
11csi-rbdplugin-provisioner-55c946c8c-zkzh7 6/6 Running 1 10m
12csi-rbdplugin-wk7cw 3/3 Running 0 10m
13rook-ceph-crashcollector-k8s-master001-6c4c78b6cd-gcfvn 1/1 Running 0 6m17s
14rook-ceph-crashcollector-k8s-master002-746b76cd87-47k84 1/1 Running 0 9m7s
15rook-ceph-crashcollector-k8s-master003-5b54f4496-ts64m 1/1 Running 0 8m43s
16rook-ceph-mgr-a-66779c74c5-cnxbm 1/1 Running 0 8m16s
17rook-ceph-mon-a-5b7bcd77ff-sb4fz 1/1 Running 0 9m25s
18rook-ceph-mon-b-779c8467d4-bfd4g 1/1 Running 0 9m7s
19rook-ceph-mon-c-574fd97c79-v5qcd 1/1 Running 0 8m44s
20rook-ceph-operator-87f875bbc-z7rwn 1/1 Running 1 11m
21rook-ceph-osd-0-66775549dc-g2ttv 1/1 Running 0 6m11s
22rook-ceph-osd-2-6c5b4fc67-gtqjf 1/1 Running 0 6m20s
23rook-ceph-osd-prepare-k8s-master001-jbpgg 0/1 Completed 0 8m13s
24rook-ceph-osd-prepare-k8s-master002-vfvnp 0/1 Completed 0 8m12s
25rook-ceph-osd-prepare-k8s-master003-ffd6r 0/1 Completed 0 6m28s
26rook-discover-74qf2 1/1 Running 0 10m
27rook-discover-fk4wn 1/1 Running 0 10m
28rook-discover-fvbcf 1/1 Running 0 10m
终于看到rook-ceph-osd-*的Pod在运行了。osd如果没有运行,ceph是不能提供存储能力的。
4、创建ceph-dashboard
1[root@k8s-master001 rook]# kubectl apply -f dashboard-external-https.yaml
2service/rook-ceph-mgr-dashboard-external-https created
3
4使用如下命令查询dashboard的admin密码
5MGR_POD=`kubectl get pod -n rook | grep mgr | awk '{print $1}'`
6kubectl -n rook-ceph logs $MGR_POD | grep password
5、安装ceph-tool工具,就是一个ceph客户端工具,可以使用ceph命令管理ceph集群
1[root@k8s-master001 rook]# kubectl apply -f toolbox.yaml
6、创建kubernetes集群存储类,默认reclaimPolicy:策略从Delete改成Retain,看自己需求改
1[root@k8s-master001 rook]# kubectl apply -f storageclass.yaml
2cephblockpool.ceph.rook.io/k8spool created
3storageclass.storage.k8s.io/rook-ceph created
使用ceph为kubernetes提供存储
验证存储类是否可使用,这里使用了nodeSelector,把pod指定到特定机器,也可以不设置
1---
2apiVersion: apps/v1
3kind: StatefulSet
4metadata:
5 name: demo001
6 labels:
7 app: demo00
8spec:
9 serviceName: demo001
10 replicas: 1
11 selector:
12 matchLabels:
13 app: demo001
14 template:
15 metadata:
16 labels:
17 app: demo001
18 spec:
19 terminationGracePeriodSeconds: 180
20 nodeSelector:
21 kubernetes.io/hostname: k8s-master001
22 containers:
23 - name: demo001
24 image: nginx
25 imagePullPolicy: IfNotPresent
26 ports:
27 - containerPort: 80
28 name: port
29 volumeMounts:
30 - name: volume
31 mountPath: /var/www/html
32 volumeClaimTemplates:
33 - metadata:
34 name: volume
35 spec:
36 accessModes: ["ReadWriteOnce"]
37 storageClassName: rook-ceph
38 resources:
39 requests:
40 storage: 1Gi
执行部署kubectl apply -f demo.yaml
1[root@k8s-master001 rook]# kubectl get po
2NAME READY STATUS RESTARTS AGE
3demo001-0 1/1 Running 0 78s
4查看可提供服务的存储类
5[root@k8s-master001 rook]# kubectl get sc
6NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
7rook-ceph rook.rbd.csi.ceph.com Retain Immediate true 8m15s
8看已经创建的存储卷
9[root@k8s-master001 rook]# kubectl get pv,pvc
10NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
11persistentvolume/pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 1Gi RWO Retain Bound default/volume-demo001-0 rook-ceph 104s
12
13NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
14persistentvolumeclaim/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,查看挂载的磁盘情况
1[root@k8s-master001 rook]# kubectl exec -ti demo001-0 /bin/sh
2kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
3# df -h
4Filesystem Size Used Avail Use% Mounted on
5overlay 50G 5.6G 45G 12% /
6/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系统解析正确。
1nodes:
2 - name: "10.26.25.20" #这个地方最好写hostname
3 devices:
4 - name: "sdb"
3、用来给ceph使用的硬盘不要手动建分区。
4、如果重新部署,记得再次部署之前先删除/var/lib/rook/目录,避免有老的集群信息残留。
5、生产环境最好使用标签,把ceph安装到指定的节点,同时避免安装到master节点。
注:文中图片来源于网络,如有侵权,请联系我及时删除。
以上是关于容器云平台No.6~企业级分布式存储Ceph~v14.2.10的主要内容,如果未能解决你的问题,请参考以下文章
争议 | HDFSCephGFSGPFSSwiftLustre……容器云选择哪种分布式存储更好?
容器云在使用分布式存储时,HDFSCEPHGFSGPFSSwift 等哪种更好? | 争议