前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tke集群如何使用ceph存储

tke集群如何使用ceph存储

原创
作者头像
聂伟星
修改2022-05-11 20:45:45
9700
修改2022-05-11 20:45:45
举报
文章被收录于专栏:腾讯云容器运维

Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性,不管你是想为云平台提供Ceph 对象存储和/或 Ceph 块设备,还是想部署一个 Ceph 文件系统或者把 Ceph 作为他用,所有 Ceph 存储集群的部署都始于部署一个个 Ceph 节点、网络和 Ceph 存储集群。 Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。

  • Ceph OSDsCeph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态( Ceph 默认有3个副本,但你可以调整副本数)。
  • MonitorsCeph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。 Ceph 保存着发生在Monitors 、 OSD 和 PG上的每一次状态变更的历史信息(称为 epoch )。
  • MDSsCeph 元数据服务器( 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对应的代码

代码语言:javascript
复制
git clone --single-branch --branch v1.9.2 https://github.com/rook/rook.git

然后部署下rook

代码语言:javascript
复制
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

rook对应的pod运行正常则说明部署成功

代码语言:javascript
复制
[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上的镜像,修改后如下。

代码语言:javascript
复制
[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。

代码语言:javascript
复制
spec:
  dashboard:
    urlPrefix: /ceph-dashboard
    port: 8443
    ssl: true

修改完后执行命令创建集群即可

代码语言:javascript
复制
kubectl create -f cluster.yaml

所有pod运行成功后,则说明ceph集群搭建好了

代码语言:javascript
复制
[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集群

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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对外提供的文件系统服务

代码语言:javascript
复制
kubectl apply -f examples/filesystem.yaml

创建好之后,就可以查看到对应的文件系统,Ceph 文件系统至少需要两个 RADOS 池,一个用于数据,一个用于元数据

代码语言:javascript
复制
[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来引用这个文件系统

代码语言:javascript
复制
kubectl apply -f deploy/examples/csi/cephfs/storageclass.yaml

接着用sc来创建一个pvc

代码语言:javascript
复制
kubectl apply -f deploy/examples/csi/cephfs/pvc.yaml -n weixnie

查看下pvc是否正常创建,显示bound,则说明创建成功

代码语言:javascript
复制
[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

代码语言:javascript
复制
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

代码语言:javascript
复制
kubectl create -f deploy/examples/csi/rbd/storageclass.yaml

然后创建下pvc

代码语言:javascript
复制
kubectl create -f deploy/examples/csi/rbd/pvc.yaml -n weixnie

查看下pvc是否正常创建,bound则显示正常,同时dashborad可以在block查看到一个image

代码语言:javascript
复制
[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的示例

代码语言:javascript
复制
kubectl create -f deploy/examples/mysql.yaml
kubectl create -f deploy/examples/wordpress.yaml

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 部署rook
  • 2. 部署ceph集群
  • 3. 登录Dashboard
  • 4. CephFilesystem方式挂载到ceph
  • 5. RBD方式挂载到ceph
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档