tke集群如何使用ceph存储
Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性,不管你是想为云平台提供Ceph 对象存储和/或 Ceph 块设备,还是想部署一个 Ceph 文件系统或者把 Ceph 作为他用,所有 Ceph 存储集群的部署都始于部署一个个 Ceph 节点、网络和 Ceph 存储集群。 Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。
- Ceph OSDs: Ceph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态( Ceph 默认有3个副本,但你可以调整副本数)。
- Monitors: Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。 Ceph 保存着发生在Monitors 、 OSD 和 PG上的每一次状态变更的历史信息(称为 epoch )。
- MDSs: Ceph 元数据服务器( MDS )为 Ceph 文件系统存储元数据(也就是说,Ceph 块设备和 Ceph 对象存储不使用MDS )。元数据服务器使得 POSIX 文件系统的用户们,可以在不对 Ceph 存储集群造成负担的前提下,执行诸如 ls、find 等基本命令。
Ceph 把客户端数据保存为存储池内的对象。通过使用 CRUSH 算法, Ceph 可以计算出哪个归置组(PG)应该持有指定的对象(Object),然后进一步计算出哪个 OSD 守护进程持有该归置组。 CRUSH 算法使得 Ceph 存储集群能够动态地伸缩、再均衡和修复。
Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监视和资源管理。
Rook 利用 Kubernetes 平台的强大功能,通过 Kubernetes Operator 为每个存储提供商提供服务。
下面我们来介绍下如何利用rook搭建ceph集群,然后pod通过pvc的方式挂载到ceph存储上。
本次测试环境:
- tke集群:1.18.4
- docker:19.03.8
- rook:1.9.2
1. 部署rook
首先从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即可。
2. 部署ceph集群
因为后续创建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
3. 登录Dashboard
集群安装了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集群的状态
4. CephFilesystem方式挂载到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
5. RBD方式挂载到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