试用 Rook/Ceph

首先

Kubernetes 的 PersistentVolume 有多种类型可供选择。
迄今为止,我已在以下文章中尝试了2种类型。

    • Longhorn(v1.0) with Rancher

 

    glusterfs on k8s

我想尝试一下 Ceph 这次。
我们将使用一个名为 Rook 的存储操作器来进行构建。

环境信息

在使用kubeadm搭建的Kubernetes上进行部署。

    • OS:Ubuntu 18.04.5 LTS

 

    • Kubernetes:v1.19.7

Node は3台構成です
Node にはルートディスクの他に PV 用の空ディスクをアタッチしています(※1)

Ceph:15.2.11
Rook:v1.6.1

只需一个选项,将以下内容用中文进行释义:
关于 Rook / Ceph 的详细前提条件,请参考以下内容。
由于本次满足了基本条件,因此没有进行额外设置。

    • Rook Prerequisites

 

    Ceph Prerequisites
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda      8:0    0  10G  0 disk
  sda1   8:1    0  10G  0 part /
sdb      8:16   0  10M  0 disk
sdc      8:32   0  50G  0 disk  ★ 空のディスク

车轮/锤子部署

首先,先准备好 Rook 并进行 Ceph 部署的准备工作。

# Rook の資材をダウンロード
$ git clone --single-branch --branch v1.6.1 https://github.com/rook/rook.git

# example 内を確認
# Ceph 以外にも Cassandra / NFS を構築できます
$ ls rook/cluster/examples/kubernetes/
README.md  cassandra  ceph  mysql.yaml  nfs  wordpress.yaml

# 資材の配置ディレクトリに移動
# 今回の資材以外にも様々なパターンの yaml が用意されている
$ cd rook/cluster/examples/kubernetes/ceph/
$ ls
ceph-client.yaml                      dashboard-external-http.yaml   object-bucket-claim-delete.yaml   pool-test.yaml
cluster-external-management.yaml      dashboard-external-https.yaml  object-bucket-claim-retain.yaml   pool.yaml
cluster-external.yaml                 dashboard-ingress-https.yaml   object-ec.yaml                    pre-k8s-1.16
cluster-on-pvc.yaml                   dashboard-loadbalancer.yaml    object-external.yaml              rbdmirror.yaml
cluster-stretched.yaml                direct-mount.yaml              object-multisite-pull-realm.yaml  rgw-external.yaml
cluster-test.yaml                     filesystem-ec.yaml             object-multisite.yaml             scc.yaml
cluster.yaml                          filesystem-mirror.yaml         object-openshift.yaml             storageclass-bucket-delete.yaml
common-external.yaml                  filesystem-test.yaml           object-test.yaml                  storageclass-bucket-retain.yaml
common-second-cluster.yaml            filesystem.yaml                object-user.yaml                  test-data
common.yaml                           flex                           object.yaml                       toolbox-job.yaml
crds.yaml                             import-external-cluster.sh     operator-openshift.yaml           toolbox.yaml
create-external-cluster-resources.py  monitoring                     operator.yaml
create-external-cluster-resources.sh  nfs-test.yaml                  osd-purge.yaml
csi                                   nfs.yaml                       pool-ec.yaml

# 共通設定(Namespace / Role・RoleBindings など)を作成
$ kubectl create -f common.yaml
・・・

# Namespace が作成されていることを確認
$ kubectl get ns rook-ceph
NAME        STATUS   AGE
rook-ceph   Active   6m54s

# Rook の CRD(CustomResourceDefinitions)を作成
$ kubectl create -f crds.yaml
・・・

# CRD が登録されていることを確認
$ kubectl api-resources | grep rook
cephblockpools                           ceph.rook.io    true   CephBlockPool
cephclients                              ceph.rook.io    true   CephClient
cephclusters                             ceph.rook.io    true   CephCluster
cephfilesystemmirrors                    ceph.rook.io    true   CephFilesystemMirror
cephfilesystems                          ceph.rook.io    true   CephFilesystem
cephnfses              nfs               ceph.rook.io    true   CephNFS
cephobjectrealms                         ceph.rook.io    true   CephObjectRealm
cephobjectstores                         ceph.rook.io    true   CephObjectStore
cephobjectstoreusers   rcou,objectuser   ceph.rook.io    true   CephObjectStoreUser
cephobjectzonegroups                     ceph.rook.io    true   CephObjectZoneGroup
cephobjectzones                          ceph.rook.io    true   CephObjectZone
cephrbdmirrors                           ceph.rook.io    true   CephRBDMirror
volumes                rv                rook.io         true   Volume

# Rook の Ceph 用 Operator をデプロイします
$ kubectl create -f operator.yaml

# Operator の起動を確認
$  kubectl get cm,po -n rook-ceph
NAME                                  DATA   AGE
configmap/rook-ceph-operator-config   13     87s

NAME                                     READY   STATUS    RESTARTS   AGE
pod/rook-ceph-operator-95f44b96c-zfbhv   1/1     Running   0          87s

由于准备工作已经完成,我们立即开始部署 Ceph 集群。
由于先前的 yaml 列表中包含了自定义资源定义(CRD)的示例,我们将使用它们进行部署。
顺便提一下,提供的 yaml 文件中有几个示例,可根据需求进行使用。

    • cluster-test.yaml

開発環境用
ノードは1台から利用可能
Ceph のバージョンは v16 が指定されている

cluster.yaml

本番環境用
ノードは3台必要
Ceph のバージョンは v15.2.11 が指定されている
今回はこちらを利用する

cluster-on-pvc.yaml

パブクラ環境で PVC を利用する場合に利用?

参考了以下的 Ceph 部署文档,您可以根据提供的 yaml 进行适当的配置更改,来定制化地部署 Ceph。

    Ceph Examples

立即使用预先准备的 yaml 文件部署 Ceph。

# CR(CustomResource) である cephclusster のデプロイ
$ kubectl create -f cluster.yaml
cephcluster.ceph.rook.io/rook-ceph created

# しばらくするとコンテナが起動してくるので状況を確認
$ kubectl get po -n rook-ceph
NAME                                            READY   STATUS              RESTARTS   AGE
csi-cephfsplugin-7cm6r                          0/3     ContainerCreating   0          2s
csi-cephfsplugin-krs4r                          0/3     ContainerCreating   0          2s
csi-cephfsplugin-provisioner-5b989b9977-2t9dq   0/6     ContainerCreating   0          2s
csi-cephfsplugin-provisioner-5b989b9977-shwr9   0/6     ContainerCreating   0          2s
csi-cephfsplugin-xdnlf                          0/3     ContainerCreating   0          2s
csi-rbdplugin-56rlt                             3/3     Running             0          3s
・・・

# 作成された CR でも状況を確認できる
$  kubectl get cephclusters.ceph.rook.io  -n rook-ceph
NAME       DATADIRHOSTPATH  MONCOUNT  AGE    PHASE        MESSAGE                HEALTH  EXTERNAL
rook-ceph  /var/lib/rook    3         4m23s  Progressing  Configuring Ceph Mons

# デプロイ完了後の状態
$ kubectl get po -n rook-ceph
NAME                                             READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-5qcsr                           3/3     Running     0          3m29s
csi-cephfsplugin-8rh7q                           3/3     Running     0          3m29s
csi-cephfsplugin-m5rwp                           3/3     Running     0          3m29s
csi-cephfsplugin-provisioner-5b989b9977-2nfwd    6/6     Running     0          3m28s
csi-cephfsplugin-provisioner-5b989b9977-kmpzd    6/6     Running     0          3m28s
csi-rbdplugin-5vgnh                              3/3     Running     0          3m30s
csi-rbdplugin-provisioner-55f998c984-dfjzt       6/6     Running     0          3m30s
csi-rbdplugin-provisioner-55f998c984-sbqd8       6/6     Running     0          3m30s
csi-rbdplugin-qtkf5                              3/3     Running     0          3m30s
csi-rbdplugin-r2qm9                              3/3     Running     0          3m30s
rook-ceph-crashcollector-nd01-5b6f6c8974-wgw9s   1/1     Running     0          69s
rook-ceph-crashcollector-nd02-84bc45b685-cvvvc   1/1     Running     0          91s
rook-ceph-crashcollector-nd03-66b4dd645b-nk22j   1/1     Running     0          102s
rook-ceph-mgr-a-5c67fd5c76-ggrlg                 1/1     Running     0          79s
rook-ceph-mon-a-677c4fc69b-prvq7                 1/1     Running     0          3m18s
rook-ceph-mon-b-5b86596d64-w7mk5                 1/1     Running     0          111s
rook-ceph-mon-c-56598d55f5-g5559                 1/1     Running     0          91s
rook-ceph-operator-95f44b96c-gzh69               1/1     Running     0          8m25s
rook-ceph-osd-0-7754f799b8-dcdl7                 1/1     Running     0          70s
rook-ceph-osd-1-566b84474b-hzjht                 1/1     Running     0          70s
rook-ceph-osd-2-85b456dd84-2grnl                 1/1     Running     0          69s
rook-ceph-osd-prepare-nd01-gqbrq                 0/1     Completed   0          52s
rook-ceph-osd-prepare-nd02-d98t8                 0/1     Completed   0          49s
rook-ceph-osd-prepare-nd03-xg5z2                 0/1     Completed   0          47s

$ kubectl get cephclusters
NAME       DATADIRHOSTPATH  MONCOUNT  AGE    PHASE  MESSAGE                       HEALTH        EXTERNAL
rook-ceph  /var/lib/rook    3         5m35s  Ready  Cluster created successfully  HEALTH_WARN

Ceph已顺利启动。
若Ceph在中途出现挂起或初始化停止的情况,请尝试使用kubectl describe或kubectl log命令确认各个Pod的情况。另外,建议通过kubectl log命令查看rook-ceph-operator-XXXX的日志,以了解其进展情况等,也可以根据需要进行适时确认。

在无法解决问题时,尝试先删除,然后重新创建也是个办法。
以下是一些步骤供参考。我在遇到失败时也曾这样删除并重新创建过…

    Cleaning up a Cluster

确认行动

因为Ceph已经部署好了,所以我们立即开始试用。
首先,我们通过CLI访问Ceph。由于有一个被称为Toolbox的ceph命令可以执行的Pod的yaml文件,我们将部署并使用它。

# toolbox のデプロイ
$ kubectl apply -f toolbox.yaml
deployment.apps/rook-ceph-tools created

$ kubectl get po -l app=rook-ceph-tools
NAME                               READY   STATUS    RESTARTS   AGE
rook-ceph-tools-57787758df-s596f   1/1     Running   0          2m38s

# ceph コマンドでバージョンと状態を確認
$ kubectl exec rook-ceph-tools-57787758df-s596f -- ceph version
ceph version 15.2.11 (e3523634d9c2227df9af89a4eac33d16738c49cb) octopus (stable)

$ kubectl exec rook-ceph-tools-57787758df-s596f -- ceph status
  cluster:
    id:     25b3fce4-14e3-46c9-a9ce-f753ccaff570
    health: HEALTH_WARN
            mons are allowing insecure global_id reclaim
            mons a,c are low on available space

  services:
    mon: 3 daemons, quorum a,b,c (age 13m)
    mgr: a(active, since 12m)
    osd: 3 osds: 3 up (since 12m), 3 in (since 12m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 147 GiB / 150 GiB avail
    pgs:     1 active+clean

现在我们将使用Ceph来创建一个可以在容器上挂载的持久卷(PV)。
为了创建基于Ceph的PV,首先我们需要创建一个存储类(StorageClass)。
通过在PVC创建时指定存储类,我们可以动态地创建符合存储类定义的PV。
存储类的yaml文件已经准备好了,因此我们将使用该文件。

    rook/cluster/examples/kubernetes/ceph/csi/rbd
$ ls
pod.yaml        pvc-restore.yaml  snapshot.yaml       storageclass-ec.yaml    storageclass.yaml
pvc-clone.yaml  pvc.yaml          snapshotclass.yaml  storageclass-test.yaml

# StorageClass / CephBlockPool を登録
$ kubectl create -f storageclass.yaml
cephblockpool.ceph.rook.io/replicapool created
storageclass.storage.k8s.io/rook-ceph-block created

$ kubectl get sc
NAME              PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block   rook-ceph.rbd.csi.ceph.com   Delete          Immediate           true                   103s

由于准备工作已完成,我们将创建实际的PV = Ceph块存储(RBD)。
这次我们将部署提供的WordPress示例。
示例yaml文件存储在以下路径中。

    rook/cluster/examples/kubernetes
$ ls
README.md  cassandra  ceph  mysql.yaml  nfs  wordpress.yaml

# MySQL のデプロイ
$ kubectl apply -f mysql.yaml -n default
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
deployment.apps/wordpress-mysql created

# WordPress 用の Web サーバをデプロイ
$ kubectl apply -f wordpress.yaml -n default
service/wordpress created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created

# デプロイしたコンテナを確認
$ kubectl get deploy,po -n default
NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress         1/1     1            1           60s
deployment.apps/wordpress-mysql   1/1     1            1           2m41s

NAME                                   READY   STATUS    RESTARTS   AGE
pod/wordpress-7b989dbf57-7zrln         1/1     Running   0          60s
pod/wordpress-mysql-6965fc8cc8-jd8bm   1/1     Running   0          2m41s

# 作成された PV/PVC を確認
$ kubectl get pvc,pv -n default
NAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
persistentvolumeclaim/mysql-pv-claim   Bound    pvc-bd039533-b11e-415b-b2c6-d2f5a62c3cd0   20Gi       RWO            rook-ceph-block   2m41s
persistentvolumeclaim/wp-pv-claim      Bound    pvc-7617ba88-3fd1-4382-96b8-766510571dfa   20Gi       RWO            rook-ceph-block   60s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS      REASON   AGE
persistentvolume/pvc-7617ba88-3fd1-4382-96b8-766510571dfa   20Gi       RWO            Delete           Bound    default/wp-pv-claim      rook-ceph-block            60s
persistentvolume/pvc-bd039533-b11e-415b-b2c6-d2f5a62c3cd0   20Gi       RWO            Delete           Bound    default/mysql-pv-claim   rook-ceph-block            2m39s

# アクセス確認用に NodePort で定義されている Service を確認
# wordpress のポート(今回は 30541)を確認
$ kubectl get svc -n default
NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes        ClusterIP      10.96.0.1        <none>        443/TCP        9d
service/wordpress         LoadBalancer   10.111.139.194   <pending>     80:30541/TCP   60s
service/wordpress-mysql   ClusterIP      None             <none>        3306/TCP       2m41s

你可以通过以下的NodePort端口号和Node的IP地址访问部署的WordPress。

    http://:/
image.png
image.png

总结

这次我们尝试使用 Rook 来部署 Ceph。
使用 Rook 进行部署非常简单。
由于有丰富的 YAML 示例,根据使用需求进行自定义也很容易。
此外,Ceph 不仅可以作为块存储,还可以作为对象存储和文件存储,因此可用于各种用途。
由于 Ceph 本身是一款非常深奥的软件,所以使用起来可能会有一些困难…

下一次,我打算确认一下引入的 Ceph 的各种情况。

请在中国在线购物平台上购买,只需一种选项。

我阅读了前辈们的资料来了解有关 Rook/Ceph 的详细说明。很易懂的内容…

而且,我們也參考了我們團隊成員的部落格。

对我们的先辈们心存感激。

bannerAds