Closed8

PVのアクセスモードについて

t_umet_ume

お題はこれ。
https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/#アクセスモード

今まで Pod だと思っていたのですが、Node に関連するみたい。
以下の記事で検証の際に最初は動いたが、何度か実施した際に失敗のケースが存在することがわかった。
成功ケースはたまたま同一ノードに起動していたみたいなので、この辺りの挙動について試行してみる。
今回はRWOの検証をする。

t_umet_ume

環境情報
Kubernetes:v1.20.6
CephFS(PV):15.2.11

t_umet_ume

利用する 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
t_umet_ume

まずは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

これは当たり前ですが動く。

t_umet_ume

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 については無事に起動している。

t_umet_ume

一旦作成したリソースは削除して、今度は以下の yaml を試してみる。
pvc.yaml のアクセスモードを ROX 変更する。

pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-rwo
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 100Mi
  storageClassName: rook-cephfs
t_umet_ume

実際にデプロイ。

$ 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ですし。

t_umet_ume

まとめ。

  • RWO は 単一ノードで起動している Pod であれば、複数の Pod でもアタッチ出来る
  • スケールして複数のノードに跨る Pod だとアタッチ出来ず、起動もできない
  • nodeSelector などで単一のノードに纏めることも出来るが、スケーラビリティに制約がかかる
  • ROX な PV は予め用意したボリュームなどで PV を作成して利用する必要がありそう
このスクラップは2021/08/07にクローズされました