🐥

お試し CephFS

2021/07/26に公開

はじめに

次の記事であるプロダクトを Kubernetes 上に構築する話を書いていたときのことです。Kuberentes 上で検証してとりあえず起動した!まで確認して、いざブログを書き始めてあることに気づきました・・・ PV の設定がダメってことに・・・。RBD(Rook / Ceph)の PV で構築していたのですが、AccessModesRWO(ReadWriteOnce) となり複数での書き込み(RWX)ができないことに気づきました。

そこで Ceph には RWX(ReadWriteMany) 可能な CephFS があるため、プロダクト再検証のために、今回は CephFS を試していきたいと思います。

※各 PV アクセスモード対応表は以下のURLより。
https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/#アクセスモード

環境情報

Kubernetes:v1.20.6
Ceph:15.2.11
Rook:v1.6.1

Ceph のクラスタは以下を参考に構築しています。
※Kuberentes のバージョンが違いますが、機能的には問題ありませんでした。
https://qiita.com/t_ume/items/4ac37f746bf07146d5f9

CephFS

Ceph クラスタが構築されたところから始めます。
StorageClass と Ceph の カスタムリソースである CephFilesystem を作成していきます。

# github からソースをダウンロードしてあるため、マニフェストファイルの配置ディレクトリまで移動
# https://github.com/rook/rook
cd rook/cluster/examples/kubernetes/ceph

# 初期パラメータで CephFileSystem デプロイ
$ kubectl apply -f filesystem.yaml
cephfilesystem.ceph.rook.io/myfs created

$ kubectl get cephfilesystems
NAME   ACTIVEMDS   AGE
myfs   1           45s

# CephFS 利用のため StorageClass を作成
$ kubectl apply -f csi/cephfs/storageclass.yaml
storageclass.storage.k8s.io/rook-cephfs created

$ kubectl get sc
NAME                        PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block (default)   rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   33d
rook-cephfs                 rook-ceph.cephfs.csi.ceph.com   Delete          Immediate           true                   14s

ceph コマンドで、状態を確認します。

# ceph コマンドを実行できる Pod を作成
$ 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-wclkf   1/1     Running   0          38s

# POD 情報を変数に。
$ POD=`kubectl get po -l app=rook-ceph-tools -n rook-ceph -o jsonpath='{.items[*].metadata.name}'`

# Ceph の状態確認
$ kubectl exec $POD -n rook-ceph -- ceph status
  cluster:
    id:     2d8d26a0-8e43-4b7a-99cf-cec265f1966e
    health: HEALTH_WARN
            mons are allowing insecure global_id reclaim
            1 daemons have recently crashed

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

  data:
    pools:   4 pools, 97 pgs
    objects: 227 objects, 472 MiB
    usage:   4.3 GiB used, 146 GiB / 150 GiB avail
    pgs:     97 active+clean

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

# CephFS の状態確認
$ kubectl exec $POD -n rook-ceph -- ceph fs status
myfs - 0 clients
====
RANK      STATE        MDS       ACTIVITY     DNS    INOS
 0        active      myfs-a  Reqs:    0 /s    10     13
0-s   standby-replay  myfs-b  Evts:    0 /s     0      3
     POOL        TYPE     USED  AVAIL
myfs-metadata  metadata  1536k  46.0G
  myfs-data0     data       0   46.0G
MDS version: ceph version 15.2.11 (e3523634d9c2227df9af89a4eac33d16738c49cb) octopus (stable)

お試し PVC

状態が確認できたので PVC を作成し、2 つの Pod でアクセスします。
2つのマニフェストを作成します。

pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-cephfs
pods.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    app: busybox
spec:
  containers:
    - name: bb
      image: busybox:1.28.4-glibc
      command: ["sleep", "3600" ]
      volumeMounts:
        - mountPath: /mnt
          name: mypvc
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: cephfs-pvc
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    app: busybox
spec:
  containers:
    - name: bb
      image: busybox:1.28.4-glibc
      command: ["sleep", "3600" ]
      volumeMounts:
        - mountPath: /mnt
          name: mypvc
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: cephfs-pvc

マニフェストファイルが作成できのたで、デプロイして確認してみます。

# PVC 作成
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/cephfs-pvc created

$ kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cephfs-pvc   Bound    pvc-dcf1e610-d047-4ec9-ab5e-fb4c2e4b5a77   1Gi        RWX            rook-cephfs    31s

# Pod デプロイ
$ kubectl apply -f pods.yaml
pod/busybox1 created
pod/busybox2 created

$ kubectl get po -l app=busybox -o wide
NAME       READY   STATUS    RESTARTS   AGE     IP              NODE   NOMINATED NODE   READINESS GATES
busybox1   1/1     Running   1          4h15m   172.16.246.8    nd01   <none>           <none>
busybox2   1/1     Running   1          4h15m   172.16.86.182   nd03   <none>           <none>

# マウント確認
$ kubectl exec -it busybox1 -- /bin/sh
> df -hT
overlay              overlay        29.0G     19.7G      9.3G  68% /
tmpfs                tmpfs          64.0M         0     64.0M   0% /dev
tmpfs                tmpfs           7.8G         0      7.8G   0% /sys/fs/cgroup
10.108.203.233:6789,10.105.135.67:6789,10.110.207.49:6789:/volumes/csi/csi-vol-55995f48-ed32-11eb-b54e-daf77c574214/018f32d4-6eb9-4763-83ea-e139857d0790
                     ceph           46.1G         0     46.1G   0% /mnt
・・・

各々の Pod で PV に書き込みをしていきます。

# 1 で書き込み
$ kubectl exec busybox1 -- /bin/sh -c "echo hello1 >> /mnt/test.txt"
$ kubectl exec busybox1 -- cat /mnt/test.txt
hello1

# 2 で書き込み
$ kubectl exec busybox2 -- /bin/sh -c "echo hello2 >> /mnt/test.txt"
$ kubectl exec busybox2 -- cat /mnt/test.txt
hello1
hello2

# 1 で再確認
$ kubectl exec busybox1 -- cat /tmp/test.txt
hello1
hello2

無事に両方の Pod から書き込むことができました。

まとめ

今回は CephFS を使った PV を利用して RWX(ReadWriteMany)を試してみました。
書き始めてすぐに、RWO(ReadWriteOnece)の制約は Pod ではなくノードにあると調べてわかりました。。。

https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/#アクセスモード

ReadWriteOnce –ボリュームは単一のNodeで読み取り/書き込みとしてマウントできます
ReadOnlyMany –ボリュームは多数のNodeで読み取り専用としてマウントできます
ReadWriteMany –ボリュームは多数のNodeで読み取り/書き込みとしてマウントできます

つまり同一ノードに Pod が構築されてさえあれば RWO でも問題なかったんですね・・・。使ったことは無いのですが、「Inter-Pod-Affinity」を使えば、この辺りは解消できそうですね。

参考

CephFS の設定は弊社Y氏の以下の記事が勉強になりました、いつもお世話になってます!

https://techstep.hatenablog.com/entry/2020/02/02/134831

Discussion