TECHSTEP

ITインフラ関連の記事を公開してます。

Rook-Cephの機能紹介(File Storage編)

はじめに

Rook-Cephの設定や機能について、公式ドキュメントをベースにまとめています。今回はCephで利用できるストレージのうち、ファイルストレージを利用するために必要な情報を紹介します。

検証環境

Shared Filesystem

Rook-Cephでファイルストレージを利用する場合、以下の流れで構築を行います。

  1. CephClusterの作成
  2. CephFilesystemの作成
  3. StorageClassの作成
  4. ファイルストレージの利用

1. CephClusterの作成

ファイルストレージを利用する場合、事前にCephClusterを用意する必要があります。今回は以下のyamlファイルを利用し、3つのノードの/dev/sddバイスを利用してクラスターを作成します。

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: ceph/ceph:v14.2.5
    allowUnsupported: true
  dataDirHostPath: /data
  skipUpgradeChecks: false
  continueUpgradeAfterChecksEvenIfNotHealthy: false
  mon:
    count: 1
    allowMultiplePerNode: true
  dashboard:
    enabled: true
    ssl: true
  storage:
    useAllNodes: true
    useAllDevices: false
    config:
      databaseSizeMB: "1024" # this value can be removed for environments with normal sized disks (100 GB or larger)
      journalSizeMB: "1024"  # this value can be removed for environments with normal sized disks (20 GB or larger)
      osdsPerDevice: "1" # this value can be overridden at the node or device level
    devices:
    - name: "sdd"
[root@vm0 ceph]# kubectl apply -f common.yaml
[root@vm0 ceph]# kubectl apply -f operator.yaml
[root@vm0 ceph]# kubectl apply -f cluster-test-clusterwide-device.yaml
[root@vm0 ceph]# kubectl get pods -n rook-ceph
NAME                                            READY   STATUS        RESTARTS   AGE
csi-cephfsplugin-cs9hb                          3/3     Running       0          108s
csi-cephfsplugin-kkwmk                          3/3     Running       0          108s
csi-cephfsplugin-pc2qj                          3/3     Running       0          108s
csi-cephfsplugin-provisioner-8b9d48896-87b9h    4/4     Running       0          108s
csi-cephfsplugin-provisioner-8b9d48896-8qx9w    4/4     Running       0          108s
csi-rbdplugin-gk4pt                             3/3     Running       0          108s
csi-rbdplugin-k5hzh                             3/3     Running       0          108s
csi-rbdplugin-lnsff                             3/3     Running       0          108s
csi-rbdplugin-provisioner-6d465d6c6f-dngzn      5/5     Running       0          108s
csi-rbdplugin-provisioner-6d465d6c6f-pfp28      5/5     Running       0          108s
rook-ceph-crashcollector-vm1-87d7886d4-pl294    1/1     Running       0          19s
rook-ceph-crashcollector-vm2-d9879bccc-6rv48    1/1     Running       0          92s
rook-ceph-crashcollector-vm3-5dddcf7994-z8dkt   1/1     Running       0          18s
rook-ceph-crashcollector-vm3-845d97d8d-5j6wt    1/1     Terminating   0          83s
rook-ceph-mgr-a-64446df586-flf9g                1/1     Running       0          83s
rook-ceph-mon-a-d464687fb-r4qt2                 1/1     Running       0          92s
rook-ceph-operator-678887c8d-st8jr              1/1     Running       0          31m
rook-ceph-osd-0-579f675c4c-mmvv5                1/1     Running       0          35s
rook-ceph-osd-1-d65796fc-sr8rh                  1/1     Running       0          19s
rook-ceph-osd-2-88dff7fdb-tz6rj                 1/1     Running       0          18s
rook-ceph-osd-prepare-vm1-2wzd6                 0/1     Completed     0          61s
rook-ceph-osd-prepare-vm2-kthkd                 0/1     Completed     0          61s
rook-ceph-osd-prepare-vm3-6rvdl                 0/1     Completed     0          61s
rook-discover-95d8z                             1/1     Running       0          31m
rook-discover-dp42g                             1/1     Running       0          31m
rook-discover-jktqn                             1/1     Running       0          31m
[root@vm0 ceph]#

2. CephFilesystemの作成

ファイルストレージを利用する場合、まずCephFilesystemリソースを作成します。CephFilesystemを作成すると、Rook Operatorが各種ストレージプールや必要なリソースを自動的に作成します。

Ceph Shared Filesystem CRD

CephFilesystemリソースで利用できる項目を載せておきます。

Filesystem Settings

  • spec.metadataPool: メタデータプールに関する設定を指定。データ冗長化の方式はreplicatedのみ指定可能
    • replicated: データ冗長化方式replicatedの設定を指定
      • size: データ複製数を指定
  • spec.dataPools: データプールに関する設定を指定。データ冗長化の方式はreplicated erasureCodedのいずれかを指定可能
    • failureDomain: データ複製時のfailureDomainを指定。host osdのほか、ノードに付与されたラベルも指定できる(利用可能なラベルはこちらを参照
    • replicated: データ冗長化方式replicatedの設定を指定
      • size: データ複製数を指定
    • erasureCoded: データ複製方式をErasure Codeにする場合の設定項目を指定
      • dataChunks: 元のオブジェクトデータをいくつのチャンクに分割するかを指定
      • codingChunks: 復旧用のチャンクをいくつ作成するかを指定
  • spec.preservePoolsOnDelete: trueの場合、CephObjectStoreが削除されてもプールは削除されない。デフォルトではfalse

※参考リンク:

Ceph Doc - Erasure Code

Ceph Doc - Erasure Code Profile

Metadata Server Settings

  • spec.metadataServer: MDSに関する設定を指定
    • activeCount: Active状態のMDS Pod数を指定
    • activeStandby: trueの場合、ActiveなMDS Podと同数のStandby-Replay状態のMDS Podを作成。falseの場合は同数のStandby状態のMDS Podを作成。
    • annotations: MDS Podに付与するAnnotationを指定
    • placement: MDS Podの配置場所の制御方法を指定。
      • nodeAffinity: KubernetesのNode Affinityを利用
      • podAffinity: KubernetesのPod Affinityを利用
      • podAntiAffinity: KubernetesのPod Anti-Affinityを利用
      • tolerations: KubernetesのTaints/Tolerationsを利用
    • resources: MDS Podのリソース制限を設定
      • requests: リソース下限を指定。cpu memoryを指定可能
      • limits: リソース上限を指定。cpu memoryを指定可能
    • priorityClassName: Priority Class Nameを指定

なお、MDSのStandby-Replay状態とStandby状態の違いについて、Standby-Replay状態のMDSはほかのActive状態のMDSのジャーナルを追跡し、Active MDSがfail状態になったときにジャーナルをもとに「再現」することで素早く復旧することができます。一方Standby状態のMDSは、Active状態のMDSがfail状態になったのち、MON Podが自動的にアサインすることで復旧することが可能です。

※参考リンク:

Ceph Doc - MDS States

サンプル例(metadataPool: replicatedの場合)

以下のyamlファイルでは、データプールをreplicated方式で、Active状態のMDS Podを1つ作成します。

apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: myfs
  namespace: rook-ceph
spec:
##### メタデータプールの設定 #####
  metadataPool:
    replicated:
      size: 3
##### データプールの設定 #####
  dataPools:
    - failureDomain: host
      replicated:
        size: 3
  preservePoolsOnDelete: true
  metadataServer:
    activeCount: 1
    activeStandby: true
# CephFilesystemの作成

[root@vm0 ceph]# kubectl apply -f filesystem.yaml
cephfilesystem.ceph.rook.io/myfs created

[root@vm0 ceph]# kubectl get cephfilesystem.ceph.rook.io -n rook-ceph
NAME   ACTIVEMDS   AGE
myfs   1           2m51s


# デプロイ結果の確認

[root@vm0 ceph]# kubectl get pods -n rook-ceph
NAME                                            READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-cs9hb                          3/3     Running     0          167m
csi-cephfsplugin-kkwmk                          3/3     Running     0          167m
csi-cephfsplugin-pc2qj                          3/3     Running     0          167m
csi-cephfsplugin-provisioner-8b9d48896-87b9h    4/4     Running     0          167m
csi-cephfsplugin-provisioner-8b9d48896-8qx9w    4/4     Running     0          167m
csi-rbdplugin-gk4pt                             3/3     Running     0          167m
csi-rbdplugin-k5hzh                             3/3     Running     0          167m
csi-rbdplugin-lnsff                             3/3     Running     0          167m
csi-rbdplugin-provisioner-6d465d6c6f-dngzn      5/5     Running     0          167m
csi-rbdplugin-provisioner-6d465d6c6f-pfp28      5/5     Running     0          167m
rook-ceph-crashcollector-vm1-87d7886d4-pl294    1/1     Running     0          166m
rook-ceph-crashcollector-vm2-589b44d85f-87nb5   1/1     Running     0          3m16s
rook-ceph-crashcollector-vm3-845d97d8d-rljvz    1/1     Running     0          3m15s
rook-ceph-mds-myfs-a-7676b75d5c-hff8p           1/1     Running     0          3m16s  ★
rook-ceph-mds-myfs-b-7d77db7cc4-tq5s8           1/1     Running     0          3m16s  ★
rook-ceph-mgr-a-64446df586-flf9g                1/1     Running     0          167m
rook-ceph-mon-a-d464687fb-r4qt2                 1/1     Running     0          167m
rook-ceph-operator-678887c8d-st8jr              1/1     Running     0          3h17m
rook-ceph-osd-0-579f675c4c-mmvv5                1/1     Running     0          166m
rook-ceph-osd-1-d65796fc-sr8rh                  1/1     Running     0          166m
rook-ceph-osd-2-88dff7fdb-tz6rj                 1/1     Running     0          166m
rook-ceph-osd-prepare-vm1-p9tk9                 0/1     Completed   0          134m
rook-ceph-osd-prepare-vm2-8zj7d                 0/1     Completed   0          134m
rook-ceph-osd-prepare-vm3-cnkl7                 0/1     Completed   0          134m
rook-discover-95d8z                             1/1     Running     0          3h17m
rook-discover-dp42g                             1/1     Running     0          3h17m
rook-discover-jktqn                             1/1     Running     0          3h17m
[root@vm0 ceph]#

上記の通り、MDS Podが2つ(Active + StandBy-Replay)作成されました。Cephのクラスター情報をceph statusコマンドで確認すると、MDS Podの状態を確認することができ、Active状態のPodがどちらかを確認できます。またceph fs statusコマンドを実行すると、作成したファイルストレージの状態を確認でき、その中にはMDS Podの情報も含まれています。

# ceph statusコマンド

[root@vm0 ceph]# kubectl apply -f toolbox.yaml
[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-dbtr2 -n rook-ceph -- ceph status
  cluster:
    id:     5367b9be-67d2-4147-8905-461fa05392ff
    health: HEALTH_WARN
            too few PGs per OSD (16 < min 30)

  services:
    mon: 1 daemons, quorum a (age 2h)
    mgr: a(active, since 2h)
    mds: myfs:1 {0=myfs-a=up:active} 1 up:standby-replay
    osd: 3 osds: 3 up (since 2h), 3 in (since 2h)

  data:
    pools:   2 pools, 16 pgs
    objects: 22 objects, 2.2 KiB
    usage:   3.0 GiB used, 186 GiB / 189 GiB avail
    pgs:     16 active+clean

  io:
    client:   853 B/s rd, 1 op/s rd, 0 op/s wr


# ceph fs statusコマンド

[root@vm0 cephfs]# kubectl exec -it rook-ceph-tools-7f96779fb9-dbtr2 -n rook-ceph -- ceph fs status
myfs - 0 clients
====
+------+----------------+--------+---------------+-------+-------+
| Rank |     State      |  MDS   |    Activity   |  dns  |  inos |
+------+----------------+--------+---------------+-------+-------+
|  0   |     active     | myfs-a | Reqs:    0 /s |   15  |   17  |
| 0-s  | standby-replay | myfs-b | Evts:    0 /s |    7  |    8  |
+------+----------------+--------+---------------+-------+-------+
+---------------+----------+-------+-------+
|      Pool     |   type   |  used | avail |
+---------------+----------+-------+-------+
| myfs-metadata | metadata | 1536k | 58.8G |
|   myfs-data0  |   data   |    0  | 58.8G |
+---------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 14.2.5 (ad5bd132e1492173c85fda2cc863152730b16a92) nautilus (stable)

上記の通り、ここではmyfs-aがActive状態、myfs-bがStandBy-Replay状態であることがわかります。

サンプル例(metadataPool: erasureCodedの場合)

以下のyamlファイルでは、データプールをerasureCoded方式で、Active状態のMDS Podを1つ作成します。

apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: myfs-ec
  namespace: rook-ceph
spec:
  metadataPool:
    replicated:
      size: 3
##### データプールの設定 #####
  dataPools:
    - erasureCoded:
        dataChunks: 2
        codingChunks: 1
  preservePoolsOnDelete: false
  metadataServer:
    activeCount: 1
    activeStandby: true
[root@vm0 ceph]# kubectl apply -f  filesystem-ec.yaml
cephfilesystem.ceph.rook.io/myfs-ec created

[root@vm0 ceph]# kubectl get cephfilesystem.ceph.rook.io -n rook-ceph
NAME      ACTIVEMDS   AGE
myfs-ec   1           58s

[root@vm0 ceph]# kubectl get pods -n rook-ceph
NAME                                            READY   STATUS        RESTARTS   AGE
csi-cephfsplugin-cs9hb                          3/3     Running       0          3h28m
csi-cephfsplugin-kkwmk                          3/3     Running       0          3h28m
csi-cephfsplugin-pc2qj                          3/3     Running       0          3h28m
csi-cephfsplugin-provisioner-8b9d48896-87b9h    4/4     Running       0          3h28m
csi-cephfsplugin-provisioner-8b9d48896-8qx9w    4/4     Running       0          3h28m
csi-rbdplugin-gk4pt                             3/3     Running       0          3h28m
csi-rbdplugin-k5hzh                             3/3     Running       0          3h28m
csi-rbdplugin-lnsff                             3/3     Running       0          3h28m
csi-rbdplugin-provisioner-6d465d6c6f-dngzn      5/5     Running       0          3h28m
csi-rbdplugin-provisioner-6d465d6c6f-pfp28      5/5     Running       0          3h28m
rook-ceph-crashcollector-vm1-87d7886d4-pl294    1/1     Running       0          3h26m
rook-ceph-crashcollector-vm2-589b44d85f-czvc8   1/1     Running       0          12s
rook-ceph-crashcollector-vm2-d9879bccc-jd8mn    1/1     Terminating   0          7m18s
rook-ceph-crashcollector-vm3-5dddcf7994-7gd65   1/1     Terminating   0          7m11s
rook-ceph-crashcollector-vm3-845d97d8d-rww4r    1/1     Running       0          13s
rook-ceph-mds-myfs-ec-a-89c4bf859-kh8nb         1/1     Running       0          13s  ★
rook-ceph-mds-myfs-ec-b-5765d59c6-xvj28         1/1     Running       0          13s  ★
rook-ceph-mgr-a-64446df586-flf9g                1/1     Running       0          3h27m
rook-ceph-mon-a-d464687fb-r4qt2                 1/1     Running       0          3h28m
rook-ceph-operator-678887c8d-st8jr              1/1     Running       0          3h58m
rook-ceph-osd-0-579f675c4c-mmvv5                1/1     Running       0          3h27m
rook-ceph-osd-1-d65796fc-sr8rh                  1/1     Running       0          3h26m
rook-ceph-osd-2-88dff7fdb-tz6rj                 1/1     Running       0          3h26m
rook-ceph-osd-prepare-vm1-p9tk9                 0/1     Completed     0          175m
rook-ceph-osd-prepare-vm2-8zj7d                 0/1     Completed     0          175m
rook-ceph-osd-prepare-vm3-cnkl7                 0/1     Completed     0          175m
rook-ceph-tools-7f96779fb9-dbtr2                1/1     Running       0          39m
rook-discover-95d8z                             1/1     Running       0          3h58m
rook-discover-dp42g                             1/1     Running       0          3h58m
rook-discover-jktqn                             1/1     Running       0          3h58m
[root@vm0 ceph]#

上記の通りMDS Podが2つ作成されました。先ほどと同様ceph statusコマンドに加え、ceph osd erasure-code-profile ls ceph osd erasure-code-profile getコマンドを実行し、Erasure Codeに関する情報を確認できます。

# ceph statusコマンド

[root@vm0 ceph]# kubectl apply -f toolbox.yaml
[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-gwmdb -n rook-ceph -- ceph status
  cluster:
    id:     5367b9be-67d2-4147-8905-461fa05392ff
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum a (age 3h)
    mgr: a(active, since 2h)
    mds: myfs-ec:1 {0=myfs-ec-a=up:active} 1 up:standby-replay
    osd: 3 osds: 3 up (since 3h), 3 in (since 3h)

  data:
    pools:   4 pools, 32 pgs
    objects: 45 objects, 36 KiB
    usage:   3.0 GiB used, 186 GiB / 189 GiB avail
    pgs:     32 active+clean

  io:
    client:   853 B/s rd, 1 op/s rd, 0 op/s wr

[root@vm0 ceph]#


# ceph osd erasure-code-profile lsコマンド(Erasure Code Profileのリスト確認)

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-gwmdb -n rook-ceph -- ceph osd erasure-code-profile ls
default
myfs-ec-data0_ecprofile


# ceph osd erasure-code-profile getコマンド(Erasure Code Profileの内容確認)

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-gwmdb -n rook-ceph -- ceph osd erasure-code-profile get myfs-ec-data0_ecprofile
crush-device-class=
crush-failure-domain=host
crush-root=default
jerasure-per-chunk-alignment=false
k=2
m=1
plugin=jerasure
technique=reed_sol_van
w=8

ceph osd erasure-code-profile getコマンドの結果の中で、k=2は``dataChunksm=1codingChunks```に該当します。その他パラメータの情報は、以下の参考リンク先に記載があります。

※参考リンク:

Ceph Doc - JERASURE ERASURE CODE PLUGIN

サンプル例(activeCount activeStandbyを変更した場合)

以下のyamlファイルでは、metadataServer.activeCount3に設定し、Active状態のMDS Podを3つ作成します。またactiveStandbytrueに設定しているので、StandBy-Replay状態のMDS Podも3つ作成されます。

apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: myfs
  namespace: rook-ceph
spec:
  metadataPool:
    replicated:
      size: 3
  dataPools:
    - failureDomain: host
      replicated:
        size: 3
  preservePoolsOnDelete: true
##### MDSの設定 #####
  metadataServer:
##### Active MDSの数を指定 #####
    activeCount: 3
##### StandBy-Replay状態を指定 #####
    activeStandby: true
# CephFileSystem作成結果

[root@vm0 ceph]# kubectl get pods -n rook-ceph -l app=rook-ceph-mds
NAME                                    READY   STATUS    RESTARTS   AGE
rook-ceph-mds-myfs-a-7676b75d5c-6xxc2   1/1     Running   0          3m9s
rook-ceph-mds-myfs-b-7d77db7cc4-jtzbp   1/1     Running   0          3m8s
rook-ceph-mds-myfs-c-7d74ff868c-ngj2d   1/1     Running   0          3m8s
rook-ceph-mds-myfs-d-788dd4f6dd-fphch   1/1     Running   0          3m7s
rook-ceph-mds-myfs-e-7f66b5f457-72h8k   1/1     Running   0          3m5s
rook-ceph-mds-myfs-f-df68b4cbb-nhdpc    1/1     Running   0          3m3s
[root@vm0 ceph]#


# ceph statusコマンド

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-8d95v -n rook-ceph -- ceph status
  cluster:
    id:     5367b9be-67d2-4147-8905-461fa05392ff
    health: HEALTH_WARN
            too few PGs per OSD (16 < min 30)

  services:
    mon: 1 daemons, quorum a (age 5h)
    mgr: a(active, since 4h)
    mds: myfs:3 {0=myfs-d=up:active,1=myfs-a=up:active,2=myfs-b=up:active} 3 up:standby-replay
    osd: 3 osds: 3 up (since 5h), 3 in (since 5h)

  data:
    pools:   2 pools, 16 pgs
    objects: 61 objects, 4.8 KiB
    usage:   3.0 GiB used, 186 GiB / 189 GiB avail
    pgs:     16 active+clean

  io:
    client:   2.5 KiB/s rd, 4 op/s rd, 0 op/s wr


# ceph fs lsコマンド

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-8d95v -n rook-ceph -- ceph fs ls
name: myfs, metadata pool: myfs-metadata, data pools: [myfs-data0 ]


# ceph fs statusコマンド

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-8d95v -n rook-ceph -- ceph fs status
myfs - 0 clients
====
+------+----------------+--------+---------------+-------+-------+
| Rank |     State      |  MDS   |    Activity   |  dns  |  inos |
+------+----------------+--------+---------------+-------+-------+
|  0   |     active     | myfs-d | Reqs:    0 /s |   10  |   13  |
|  1   |     active     | myfs-a | Reqs:    0 /s |   10  |   13  |
|  2   |     active     | myfs-b | Reqs:    0 /s |   10  |   13  |
| 2-s  | standby-replay | myfs-f | Evts:    0 /s |    0  |    3  |
| 1-s  | standby-replay | myfs-e | Evts:    0 /s |    0  |    3  |
| 0-s  | standby-replay | myfs-c | Evts:    0 /s |    0  |    3  |
+------+----------------+--------+---------------+-------+-------+
+---------------+----------+-------+-------+
|      Pool     |   type   |  used | avail |
+---------------+----------+-------+-------+
| myfs-metadata | metadata | 3840k | 58.8G |
|   myfs-data0  |   data   |    0  | 58.8G |
+---------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 14.2.5 (ad5bd132e1492173c85fda2cc863152730b16a92) nautilus (stable)

また、activeStandbyfalseにした場合も以下に載せておきます。Active状態のMDS Podが3つ、そしてStandby状態のMDS Podが3つ作成されていることがわかります。

# ceph statusコマンド

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-wxln6 -n rook-ceph -- ceph status
  cluster:
    id:     5367b9be-67d2-4147-8905-461fa05392ff
    health: HEALTH_WARN
            too few PGs per OSD (16 < min 30)

  services:
    mon: 1 daemons, quorum a (age 5h)
    mgr: a(active, since 4h)
    mds: myfs:3 {0=myfs-a=up:active,1=myfs-b=up:active,2=myfs-c=up:active} 3 up:standby
    osd: 3 osds: 3 up (since 5h), 3 in (since 5h)

  data:
    pools:   2 pools, 16 pgs
    objects: 61 objects, 4.8 KiB
    usage:   3.0 GiB used, 186 GiB / 189 GiB avail
    pgs:     16 active+clean


# ceph fs lsコマンド

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-wxln6 -n rook-ceph -- ceph fs ls
name: myfs, metadata pool: myfs-metadata, data pools: [myfs-data0 ]


# ceph fs statusコマンド

[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-wxln6 -n rook-ceph -- ceph fs status
myfs - 0 clients
====
+------+--------+--------+---------------+-------+-------+
| Rank | State  |  MDS   |    Activity   |  dns  |  inos |
+------+--------+--------+---------------+-------+-------+
|  0   | active | myfs-a | Reqs:    0 /s |   10  |   13  |
|  1   | active | myfs-b | Reqs:    0 /s |   10  |   13  |
|  2   | active | myfs-c | Reqs:    0 /s |   10  |   13  |
+------+--------+--------+---------------+-------+-------+
+---------------+----------+-------+-------+
|      Pool     |   type   |  used | avail |
+---------------+----------+-------+-------+
| myfs-metadata | metadata | 3840k | 58.8G |
|   myfs-data0  |   data   |    0  | 58.8G |
+---------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
|    myfs-d   |
|    myfs-e   |
|    myfs-f   |
+-------------+
MDS version: ceph version 14.2.5 (ad5bd132e1492173c85fda2cc863152730b16a92) nautilus (stable)

3. StorageClassの作成

作成したファイルストレージを利用するため、StorageClassリソースを用意します。

  • parameters: CephFSについての情報を指定
    • clusterID: Rook OperatorのNamespaceを指定
    • fsName: CephFileSystemの名称を指定
    • pool: CephFileSystemのデータプール名を指定

※参考リンク:

Kubernetes Doc - Storage Classes

サンプル例

以下のyamlファイルでは、作成したファイルストレージを指定したStorageClassが作成されます。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-cephfs
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
##### Operator Namespaceの指定 #####
  clusterID: rook-ceph

##### CephFS ファイルシステム名の指定 #####
  fsName: myfs

##### データプール名を指定 #####
  pool: myfs-data0

  csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete

上記ファイルを利用してStorageClassリソースを作成します。

[root@vm0 cephfs]# pwd
/root/rook/cluster/examples/kubernetes/ceph/csi/cephfs

[root@vm0 cephfs]# kubectl apply -f storageclass.yaml
storageclass.storage.k8s.io/csi-cephfs created

[root@vm0 cephfs]# kubectl get sc
NAME         PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
csi-cephfs   rook-ceph.cephfs.csi.ceph.com   Delete          Immediate           false                  3s

4. ファイルストレージの利用

上記で作成したStorageClassを、PersistentVolumeClaimリソースを通じて利用します。

サンプル例

ここでは以下のようなPersistentVolumeClaim、Pod用yamlファイルをデプロイします。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-cephfs
---
apiVersion: v1
kind: Pod
metadata:
  name: csicephfs-demo-pod
spec:
  containers:
   - name: web-server
     image: nginx
     volumeMounts:
       - name: mypvc
         mountPath: /var/lib/www/html
  volumes:
   - name: mypvc
     persistentVolumeClaim:
       claimName: cephfs-pvc
       readOnly: false

上記2つのリソースをデプロイし、デプロイ後の結果を確認します。

# デプロイ後の各種リソース確認

[root@vm0 cephfs]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cephfs-pvc   Bound    pvc-0a252601-9797-4690-a876-2934d5790860   1Gi        RWO            csi-cephfs     4s
[root@vm0 cephfs]#


[root@vm0 cephfs]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
pvc-0a252601-9797-4690-a876-2934d5790860   1Gi        RWO            Delete           Bound    default/cephfs-pvc   csi-cephfs              12m
[root@vm0 cephfs]#


[root@vm0 cephfs]# kubectl get pods
NAME                 READY   STATUS    RESTARTS   AGE
csicephfs-demo-pod   1/1     Running   0          64s

テスト用Podをデプロイしたのち、Cephファイルストレージの状態を確認します。ceph fs statusコマンドを実行すると、myfs - 1 clientsという表示があり、クライアントがファイルストレージを利用していることが確認できます。

[root@vm0 cephfs]# kubectl exec -it rook-ceph-tools-7f96779fb9-dbtr2 -n rook-ceph -- ceph status
  cluster:
    id:     5367b9be-67d2-4147-8905-461fa05392ff
    health: HEALTH_WARN
            too few PGs per OSD (16 < min 30)

  services:
    mon: 1 daemons, quorum a (age 2h)
    mgr: a(active, since 2h)
    mds: myfs:1 {0=myfs-a=up:active} 1 up:standby-replay
    osd: 3 osds: 3 up (since 2h), 3 in (since 2h)

  data:
    pools:   2 pools, 16 pgs
    objects: 24 objects, 21 KiB
    usage:   3.0 GiB used, 186 GiB / 189 GiB avail
    pgs:     16 active+clean

  io:
    client:   853 B/s rd, 1 op/s rd, 0 op/s wr

[root@vm0 cephfs]# kubectl exec -it rook-ceph-tools-7f96779fb9-dbtr2 -n rook-ceph -- ceph fs ls
name: myfs, metadata pool: myfs-metadata, data pools: [myfs-data0 ]


[root@vm0 cephfs]# kubectl exec -it rook-ceph-tools-7f96779fb9-dbtr2 -n rook-ceph -- ceph fs status
myfs - 1 clients
====
+------+----------------+--------+---------------+-------+-------+
| Rank |     State      |  MDS   |    Activity   |  dns  |  inos |
+------+----------------+--------+---------------+-------+-------+
|  0   |     active     | myfs-a | Reqs:    0 /s |   13  |   16  |
| 0-s  | standby-replay | myfs-b | Evts:    0 /s |    3  |    6  |
+------+----------------+--------+---------------+-------+-------+
+---------------+----------+-------+-------+
|      Pool     |   type   |  used | avail |
+---------------+----------+-------+-------+
| myfs-metadata | metadata | 1536k | 58.8G |
|   myfs-data0  |   data   |    0  | 58.8G |
+---------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 14.2.5 (ad5bd132e1492173c85fda2cc863152730b16a92) nautilus (stable)
[root@vm0 cephfs]#

その他

Multiple Filesystems Not Supported

Cephではクラスター内に複数のファイルシステムを作成する機能はExperimentalの状態です。Rookではデフォルトで無効化されており、有効にする場合はoperator.yamlROOK_ALLOW_MULTIPLE_FILESYSTEMStrueにする必要があります。

apiVersion: apps/v1
kind: Deployment

(中略)

        # Allow rook to create multiple file systems. Note: This is considered
        # an experimental feature in Ceph as described at
        # http://docs.ceph.com/docs/master/cephfs/experimental-features/#multiple-filesystems-within-a-ceph-cluster
        # which might cause mons to crash as seen in https://github.com/rook/rook/issues/1027
        - name: ROOK_ALLOW_MULTIPLE_FILESYSTEMS
          value: "false"

※参考リンク:

Ceph Doc - Experimental Features # MULTIPLE FILE SYSTEMS WITHIN A CEPH CLUSTER

PersistentVolumeClaim is Pending

StorageClassを利用した際、PersistentVolumeClaimがPending状態となる場合がありました。

# PVC is Pending

[root@vm0 cephfs]# kubectl get pvc
NAME         STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cephfs-pvc   Pending                                      csi-cephfs     12s
[root@vm0 cephfs]#


# kubectl describeコマンドでログを確認

[root@vm0 cephfs]# kubectl describe pvc cephfs-pvc
Name:          cephfs-pvc
Namespace:     default
StorageClass:  csi-cephfs
Status:        Pending
Volume:
Labels:        <none>
Annotations:   kubectl.kubernetes.io/last-applied-configuration:
                 {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"cephfs-pvc","namespace":"default"},"spec":{"accessM...
               volume.beta.kubernetes.io/storage-provisioner: rook-ceph.cephfs.csi.ceph.com
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type     Reason                Age                From                                                                                                             Message
  ----     ------                ----               ----                                                                                                             -------
  Warning  ProvisioningFailed    30s                rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-8b9d48896-8qx9w_1d60a07b-533e-4243-b0da-077503c09345  failed to provision volume with StorageClass "csi-cephfs": rpc error: code = Internal desc = an error occurred while running (537) ceph [fs subvolume create myfs-ec csi-vol-d0bdbf07-44cf-11ea-9059-46109b31d3c4 1073741824 --group_name csi --mode 777 -m 10.96.229.29:6789 -c /etc/ceph/ceph.conf -n client.csi-cephfs-provisioner --keyfile=***stripped*** --pool_layout myfs-ec-data0]: exit status 2: Error ENOENT: Subvolume group 'csi' not found, create it with `ceph fs subvolumegroup create` before creating subvolumes
  Warning  ProvisioningFailed    27s                rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-8b9d48896-8qx9w_1d60a07b-533e-4243-b0da-077503c09345  failed to provision volume with StorageClass "csi-cephfs": rpc error: code = Internal desc = an error occurred while running (753) ceph [fs subvolume create myfs-ec csi-vol-d214df56-44cf-11ea-9059-46109b31d3c4 1073741824 --group_name csi --mode 777 -m 10.96.229.29:6789 -c /etc/ceph/ceph.conf -n client.csi-cephfs-provisioner --keyfile=***stripped*** --pool_layout myfs-ec-data0]: exit status 2: Error ENOENT: Subvolume group 'csi' not found, create it with `ceph fs subvolumegroup create` before creating subvolumes
  Warning  ProvisioningFailed    25s                rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-8b9d48896-8qx9w_1d60a07b-533e-4243-b0da-077503c09345  failed to provision volume with StorageClass "csi-cephfs": rpc error: code = Internal desc = an error occurred while running (969) ceph [fs subvolume create myfs-ec csi-vol-d3bb211b-44cf-11ea-9059-46109b31d3c4 1073741824 --group_name csi --mode 777 -m 10.96.229.29:6789 -c /etc/ceph/ceph.conf -n client.csi-cephfs-provisioner --keyfile=***stripped*** --pool_layout myfs-ec-data0]: exit status 2: Error ENOENT: Subvolume group 'csi' not found, create it with `ceph fs subvolumegroup create` before creating subvolumes
  Warning  ProvisioningFailed    21s                rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-8b9d48896-8qx9w_1d60a07b-533e-4243-b0da-077503c09345  failed to provision volume with StorageClass "csi-cephfs": rpc error: code = Internal desc = an error occurred while running (1185) ceph [fs subvolume create myfs-ec csi-vol-d5fb2f28-44cf-11ea-9059-46109b31d3c4 1073741824 --group_name csi --mode 777 -m 10.96.229.29:6789 -c /etc/ceph/ceph.conf -n client.csi-cephfs-provisioner --keyfile=***stripped*** --pool_layout myfs-ec-data0]: exit status 2: Error ENOENT: Subvolume group 'csi' not found, create it with `ceph fs subvolumegroup create` before creating subvolumes
  Warning  ProvisioningFailed    15s                rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-8b9d48896-8qx9w_1d60a07b-533e-4243-b0da-077503c09345  failed to provision volume with StorageClass "csi-cephfs": rpc error: code = Internal desc = an error occurred while running (1401) ceph [fs subvolume create myfs-ec csi-vol-d96714af-44cf-11ea-9059-46109b31d3c4 1073741824 --group_name csi --mode 777 -m 10.96.229.29:6789 -c /etc/ceph/ceph.conf -n client.csi-cephfs-provisioner --keyfile=***stripped*** --pool_layout myfs-ec-data0]: exit status 2: Error ENOENT: Subvolume group 'csi' not found, create it with `ceph fs subvolumegroup create` before creating subvolumes
  Normal   ExternalProvisioning  10s (x3 over 31s)  persistentvolume-controller                                                                                      waiting for a volume to be created, either by external provisioner "rook-ceph.cephfs.csi.ceph.com" or manually created by system administrator
  Normal   Provisioning          7s (x6 over 31s)   rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-8b9d48896-8qx9w_1d60a07b-533e-4243-b0da-077503c09345  External provisioner is provisioning volume for claim "default/cephfs-pvc"
  Warning  ProvisioningFailed    5s                 rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-8b9d48896-8qx9w_1d60a07b-533e-4243-b0da-077503c09345  failed to provision volume with StorageClass "csi-cephfs": rpc error: code = Internal desc = an error occurred while running (1617) ceph [fs subvolume create myfs-ec csi-vol-df3eb5b3-44cf-11ea-9059-46109b31d3c4 1073741824 --group_name csi --mode 777 -m 10.96.229.29:6789 -c /etc/ceph/ceph.conf -n client.csi-cephfs-provisioner --keyfile=***stripped*** --pool_layout myfs-ec-data0]: exit status 2: Error ENOENT: Subvolume group 'csi' not found, create it with `ceph fs subvolumegroup create` before creating subvolumes
[root@vm0 cephfs]#

failed to provision volume with StorageClassというメッセージが確認できます。

こちらの記載を参考に、csi-cephfsplugin-provisioner Podを一度削除し、もう一度PVCをデプロイした結果、Bound状態となり利用可能となりました。

[root@vm0 cephfs]# kubectl delete pod -n rook-ceph -l app=csi-cephfsplugin-provisioner --grace-period=0 --force
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "csi-cephfsplugin-provisioner-8b9d48896-87b9h" force deleted
pod "csi-cephfsplugin-provisioner-8b9d48896-8qx9w" force deleted
[root@vm0 cephfs]#

※参考リンク:

Github Issues - PersistentVolumeClaim is pending when using Shared File System with csi #4012

参考ドキュメント

Rook Doc - Shared Filesystem

Rook Doc - Ceph Shared Filesystem CRD