はじめに
Rook-Cephの設定や機能について、公式ドキュメントをベースにまとめています。今回はCephで利用できるストレージのうち、ファイルストレージを利用するために必要な情報を紹介します。
検証環境
- Rook version: ver 1.2
- Kubernetes version: 1.17.0
- Masterノード: 1台
- Workerノード: 3台
- Kubernetes環境: Azure上に仮想マシンを構築し、Kubeadmを用いてクラスターを作成
Shared Filesystem
Rook-Cephでファイルストレージを利用する場合、以下の流れで構築を行います。
CephCluster
の作成CephFilesystem
の作成StorageClass
の作成- ファイルストレージの利用
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
のいずれかを指定可能spec.preservePoolsOnDelete
:true
の場合、CephObjectStore
が削除されてもプールは削除されない。デフォルトではfalse
※参考リンク:
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が自動的にアサインすることで復旧することが可能です。
※参考リンク:
サンプル例(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
は``dataChunks、
m=1は
codingChunks```に該当します。その他パラメータの情報は、以下の参考リンク先に記載があります。
※参考リンク:
Ceph Doc - JERASURE ERASURE CODE PLUGIN
サンプル例(activeCount
activeStandby
を変更した場合)
以下のyamlファイルでは、metadataServer.activeCount
を3
に設定し、Active状態のMDS Podを3つ作成します。またactiveStandby
をtrue
に設定しているので、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)
また、activeStandby
をfalse
にした場合も以下に載せておきます。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.yaml
のROOK_ALLOW_MULTIPLE_FILESYSTEMS
をtrue
にする必要があります。
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