Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性,不管你是想为云平台提供Ceph 对象存储和/或 Ceph 块设备,还是想部署一个 Ceph 文件系统或者把 Ceph 作为他用,所有 Ceph 存储集群的部署都始于部署一个个 Ceph 节点、网络和 Ceph 存储集群。 Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。
Ceph 把客户端数据保存为存储池内的对象。通过使用 CRUSH 算法, Ceph 可以计算出哪个归置组(PG)应该持有指定的对象(Object),然后进一步计算出哪个 OSD 守护进程持有该归置组。 CRUSH 算法使得 Ceph 存储集群能够动态地伸缩、再均衡和修复。
Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监视和资源管理。
Rook 利用 Kubernetes 平台的强大功能,通过 Kubernetes Operator 为每个存储提供商提供服务。
下面我们来介绍下如何利用rook搭建ceph集群,然后pod通过pvc的方式挂载到ceph存储上。
本次测试环境:
首先从github上下载rook对应的代码
git clone --single-branch --branch v1.9.2 https://github.com/rook/rook.git
然后部署下rook
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
rook对应的pod运行正常则说明部署成功
[root@VM-0-4-centos examples]# kubectl get pod -n rook-ceph
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-dff857984-8x25r 1/1 Running 0 39s
需要注意的是,官方的部署镜像默认都是从k8s.gcr.io或者quay.io拉取,这里建议修改下operator.yaml的镜像名称,从dockerhub拉取,operator.yaml的镜像字段配置默认都是注释的,需要修改yaml文件去掉注释,然后配置下dockerhub上的镜像,修改后如下。
[root@VM-0-4-centos examples]# cat operator.yaml | grep -i image:
ROOK_CSI_CEPH_IMAGE: "cnplat/cephcsi:v3.5.1"
ROOK_CSI_REGISTRAR_IMAGE: "opsdockerimage/sig-storage-csi-node-driver-registrar:v2.5.0"
ROOK_CSI_RESIZER_IMAGE: "opsdockerimage/sig-storage-csi-resizer:v1.4.0"
ROOK_CSI_PROVISIONER_IMAGE: "opsdockerimage/sig-storage-csi-provisioner:v3.1.0"
ROOK_CSI_SNAPSHOTTER_IMAGE: "opsdockerimage/sig-storage-csi-snapshotter:v5.0.1"
ROOK_CSI_ATTACHER_IMAGE: "opsdockerimage/sig-storage-csi-attacher:v3.4.0"
# ROOK_CSI_NFS_IMAGE: "k8s.gcr.io/sig-storage/nfsplugin:v3.1.0"
# CSI_VOLUME_REPLICATION_IMAGE: "quay.io/csiaddons/volumereplication-operator:v0.3.0"
ROOK_CSIADDONS_IMAGE: "willdockerhub/k8s-sidecar:v0.2.1"
image: rook/ceph:v1.9.2
修改完之后重新apply下operator.yaml即可。
因为后续创建osd会挂载数据盘,所以我们提前在tke的节点挂载一块空的数据盘,创建集群默认会部署Ceph Dashboard,默认配置是https访问,可以配置为不使用ssl证书访问,修改下cluster.yaml,将ssl改成false。
spec:
dashboard:
urlPrefix: /ceph-dashboard
port: 8443
ssl: true
修改完后执行命令创建集群即可
kubectl create -f cluster.yaml
所有pod运行成功后,则说明ceph集群搭建好了
[niewx@VM-0-4-centos ~]$ k get pod -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-664fj 3/3 Running 0 21m
csi-cephfsplugin-fsn28 3/3 Running 0 21m
csi-cephfsplugin-provisioner-7cd67cd68b-6gwqk 6/6 Running 0 21m
csi-cephfsplugin-provisioner-7cd67cd68b-pz4qt 6/6 Running 0 21m
csi-cephfsplugin-v6kkc 3/3 Running 0 21m
csi-rbdplugin-d78hk 3/3 Running 0 21m
csi-rbdplugin-provisioner-577cc85bf6-26bxk 6/6 Running 0 21m
csi-rbdplugin-provisioner-577cc85bf6-ljlmf 6/6 Running 0 21m
csi-rbdplugin-v87n7 3/3 Running 0 21m
csi-rbdplugin-wkzvd 3/3 Running 0 21m
rook-ceph-crashcollector-172.16.22.23-6486d7bf95-kq5l9 1/1 Running 0 15m
rook-ceph-crashcollector-172.16.55.14-7bb7659987-wwcm8 1/1 Running 0 15m
rook-ceph-crashcollector-172.16.55.5-85b69574d7-d4fns 1/1 Running 0 15m
rook-ceph-mgr-a-849c846dc-jx59q 2/2 Running 0 15m
rook-ceph-mgr-b-54d4fc79d7-5zgmj 2/2 Running 0 15m
rook-ceph-mon-a-6f6dffc8dd-4bbdw 1/1 Running 0 21m
rook-ceph-mon-c-8685f67dc4-5b5wt 1/1 Running 0 18m
rook-ceph-mon-d-69d88db64d-k8rvr 1/1 Running 0 14m
rook-ceph-operator-dff857984-srg2f 1/1 Running 0 22m
rook-ceph-osd-0-dddd7cc85-rpv4s 1/1 Running 0 14m
rook-ceph-osd-1-bbdfd664d-wpzm8 1/1 Running 0 14m
rook-ceph-osd-2-5cb86c99b9-4q2pc 1/1 Running 0 14m
rook-ceph-osd-prepare-172.16.22.23-hgkqp 0/1 Completed 0 30s
rook-ceph-osd-prepare-172.16.55.14-j5wxr 0/1 Completed 4 28s
rook-ceph-osd-prepare-172.16.55.5-dmmmh 0/1 Completed 0 27s
部署完集群后,可以部署下ceph-tools的客户端工具,这样可以方便执行ceph命令来查看ceph集群
kubectl create -f deploy/examples/toolbox.yaml
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
集群安装了nginx-ingress,我们通过ingress来暴露一个域名来访问ceph的dashboard
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx-intranet
name: ceph-ingress
namespace: rook-ceph
spec:
rules:
- host: ceph.tke.niewx.cn
http:
paths:
- backend:
serviceName: rook-ceph-mgr-dashboard
servicePort: 7000
path: /
pathType: ImplementationSpecific
浏览器输入ceph.tke.niewx.cn就能访问登录页面
这里登录密码可以用下面命令获取,用户名默认是admin
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
登录后,就可以查看ceph集群的状态
如果需要创建pvc,需要先创建一个CephFilesystem,fs是Ceph对外提供的文件系统服务
kubectl apply -f examples/filesystem.yaml
创建好之后,就可以查看到对应的文件系统,Ceph 文件系统至少需要两个 RADOS 池,一个用于数据,一个用于元数据
[niewx@VM-0-4-centos ~]$ kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
[rook@rook-ceph-tools-688bf659c9-lzlt5 /]$ ceph fs ls
name: myfs, metadata pool: myfs-metadata, data pools: [myfs-replicated ]
创建好CephFilesystem后,创建一个storageclass来引用这个文件系统
kubectl apply -f deploy/examples/csi/cephfs/storageclass.yaml
接着用sc来创建一个pvc
kubectl apply -f deploy/examples/csi/cephfs/pvc.yaml -n weixnie
查看下pvc是否正常创建,显示bound,则说明创建成功
[root@VM-0-4-centos cephfs]# k get pvc -n weixnie | grep cephfs-pvc
cephfs-pvc Bound pvc-90c11374-7f87-4421-908a-3bcf0511b967 1Gi RWO rook-cephfs 18s
最好创建一个pod来挂载这个pvc
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: ceph-test
qcloud-app: ceph-test
name: ceph-test
namespace: weixnie
spec:
replicas: 1
selector:
matchLabels:
k8s-app: ceph-test
qcloud-app: ceph-test
template:
metadata:
labels:
k8s-app: ceph-test
qcloud-app: ceph-test
spec:
containers:
- args:
- 70d
command:
- sleep
image: centos:7
imagePullPolicy: IfNotPresent
name: ceph-test
resources: {}
securityContext:
privileged: false
volumeMounts:
- mountPath: /tmp
name: vol
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: qcloudregistrykey
restartPolicy: Always
volumes:
- name: vol
persistentVolumeClaim:
claimName: cephfs-pvc
pod能正常运行,登录pod显示挂载,则说明挂载到ceph正常,dashboard上也有查看fs有一个client,就是pod对应在节点的目录挂载到ceph
首先创建下sc,同时也会创建一个rbd的pool
kubectl create -f deploy/examples/csi/rbd/storageclass.yaml
然后创建下pvc
kubectl create -f deploy/examples/csi/rbd/pvc.yaml -n weixnie
查看下pvc是否正常创建,bound则显示正常,同时dashborad可以在block查看到一个image
[root@VM-0-4-centos rbd]# kubectl get pvc -n weixnie | grep rbd-pvc
rbd-pvc Bound pvc-9bb1f07c-b519-4290-bd99-8623031319de 1Gi RWO rook-ceph-block 18m
[root@VM-0-4-centos rbd]# kubectl get sc | grep rook-ceph-block
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 19m
pvc创建正常后,通过pvc的方式挂载到pod即可,当然也可以部署下wordpress和mysql的示例
kubectl create -f deploy/examples/mysql.yaml
kubectl create -f deploy/examples/wordpress.yaml
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。