お試し CephFS
はじめに
次の記事であるプロダクトを Kubernetes 上に構築する話を書いていたときのことです。Kuberentes 上で検証してとりあえず起動した!まで確認して、いざブログを書き始めてあることに気づきました・・・ PV の設定がダメってことに・・・。RBD(Rook / Ceph)の PV で構築していたのですが、AccessModes
が RWO(ReadWriteOnce)
となり複数での書き込み(RWX
)ができないことに気づきました。
そこで Ceph には RWX(ReadWriteMany)
可能な CephFS があるため、プロダクト再検証のために、今回は CephFS を試していきたいと思います。
※各 PV アクセスモード対応表は以下のURLより。
環境情報
Kubernetes:v1.20.6
Ceph:15.2.11
Rook:v1.6.1
Ceph のクラスタは以下を参考に構築しています。
※Kuberentes のバージョンが違いますが、機能的には問題ありませんでした。
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つのマニフェストを作成します。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: rook-cephfs
---
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 ではなくノードにあると調べてわかりました。。。
ReadWriteOnce –ボリュームは単一のNodeで読み取り/書き込みとしてマウントできます
ReadOnlyMany –ボリュームは多数のNodeで読み取り専用としてマウントできます
ReadWriteMany –ボリュームは多数のNodeで読み取り/書き込みとしてマウントできます
つまり同一ノードに Pod が構築されてさえあれば RWO
でも問題なかったんですね・・・。使ったことは無いのですが、「Inter-Pod-Affinity」を使えば、この辺りは解消できそうですね。
参考
CephFS の設定は弊社Y氏の以下の記事が勉強になりました、いつもお世話になってます!
Discussion