Closed8
PVのアクセスモードについて
お題はこれ。
今まで Pod だと思っていたのですが、Node に関連するみたい。
以下の記事で検証の際に最初は動いたが、何度か実施した際に失敗のケースが存在することがわかった。
成功ケースはたまたま同一ノードに起動していたみたいなので、この辺りの挙動について試行してみる。
今回はRWOの検証をする。
環境情報
Kubernetes:v1.20.6
CephFS(PV):15.2.11
利用する yaml ファイル
pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-rwo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
storageClassName: rook-cephfs
deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
spec:
replicas: 1
selector:
matchLabels:
apps: busybox
template:
metadata:
labels:
apps: busybox
spec:
containers:
- image: busybox:1.33.1
name: busybox
command: ["sleep", "3600" ]
volumeMounts:
- mountPath: /mnt
name: pvc-rwo
volumes:
- name: pvc-rwo
persistentVolumeClaim:
claimName: pvc-rwo
まずは1台でデプロイ
$ kc apply -f pvc.yaml
persistentvolumeclaim/pvc-rwo unchanged
$ kubectl apply -f deployment.yaml
deployment.apps/busybox created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
busybox-67849595cf-lcwx9 1/1 Running 0 38s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
busybox-67849595cf-lcwx9 1/1 Running 0 38s
これは当たり前ですが動く。
5台くらいに増やしてみる
$ kubectl scale deployment busybox --replicas=5
deployment.apps/busybox scaled
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox-67849595cf-9vxkr 0/1 ContainerCreating 0 12s <none> nd01 <none> <none>
busybox-67849595cf-lcwx9 1/1 Running 0 4m1s 172.16.86.144 nd03 <none> <none>
busybox-67849595cf-rsngc 0/1 ContainerCreating 0 12s <none> nd02 <none> <none>
busybox-67849595cf-scktt 0/1 ContainerCreating 0 12s <none> nd01 <none> <none>
busybox-67849595cf-zwzc5 1/1 Running 0 12s 172.16.86.153 nd03 <none> <none>
nd01/02にスケジューリングされているPodがContainerCreating
で止まる。
$ kubectl describe pobusybox-67849595cf-9vxkr
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 72s default-scheduler Successfully assigned default/busybox-67849595cf-9vxkr to nd01
Warning FailedAttachVolume 73s attachdetach-controller Multi-Attach error for volume "pvc-dde878f4-4585-4bf4-a8de-bc2cd555c4a7" Volume is already used by pod(s) busybox-67849595cf-lcwx9, busybox-67849595cf-zwzc5
RWO の制約により 「単一ノード」からしかアタッチできない。
同一ノードで起動している Pod については無事に起動している。
一旦作成したリソースは削除して、今度は以下の yaml を試してみる。
pvc.yaml
のアクセスモードを ROX
変更する。
pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-rwo
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 100Mi
storageClassName: rook-cephfs
実際にデプロイ。
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/pvc-rwo created
$ kubectl apply -f deployment.yaml
deployment.apps/busybox created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
busybox-67849595cf-cz9xq 0/1 Pending 0 8s
あら・・・
$ kubectl describe po busybox-67849595cf-cz9xq
・・・
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 11s default-scheduler 0/6 nodes are available: 6 pod has unbound immediate PersistentVolumeClaims.
Warning FailedScheduling 11s default-scheduler 0/6 nodes are available: 6 pod has unbound immediate PersistentVolumeClaims.
あらら・・・
$ kubectl describe pvc pvc-rwo
・・・
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Provisioning 9s (x8 over 73s) rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-5b989b9977-7rbwh_9068b77f-32be-4b11-b5cf-d5ce4ce488a4 External provisioner is provisioning volume for claim "default/pvc-rwo"
Warning ProvisioningFailed 9s (x8 over 73s) rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-5b989b9977-7rbwh_9068b77f-32be-4b11-b5cf-d5ce4ce488a4 failed to provision volume with StorageClass "rook-cephfs": rpc error: code = InvalidArgument desc = readOnly accessMode is supported only with content source
Normal ExternalProvisioning 3s (x7 over 73s) 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
ROX
は予め存在するボリュームやNFSなどの、コンテンツを利用する際のみ利用可能っぽいです。
ダイナミックプロビジョニングの PVC ではそもそもコンテンツが無い空ボリュームは意味がないですよね・・・ReadOnlyですし。
まとめ。
-
RWO
は 単一ノードで起動している Pod であれば、複数の Pod でもアタッチ出来る - スケールして複数のノードに跨る Pod だとアタッチ出来ず、起動もできない
- nodeSelector などで単一のノードに纏めることも出来るが、スケーラビリティに制約がかかる
-
ROX
な PV は予め用意したボリュームなどで PV を作成して利用する必要がありそう
このスクラップは2021/08/07にクローズされました