スキップしてメイン コンテンツに移動

OpenShiftでの永続ストレージの設定とNFS on IBM Cloud

OpenShiftでいくつか検証をしている中で、永続ストレージを使用する必要が出てきた。
地味に初挑戦で戸惑う点もあったのでメモ。

TL;DR

  • クラウドのManagedの環境でPersistent Volume Claim(以下、PVC)を作ると、Persistent Volume(以下、PV)が作られ、そのPVに紐づくストレージがIBM Cloud上に払い出される、というところまでが自動的に実施される
  • どのストレージが払い出されるかは選んだStorage Classに依存する, IBM CloudだとProvisionerが “ibm.io/ibmc-file” だったらファイルストレージ、”ibm.io/ibmc-block”(註:大事なところを誤って-fileと書いていましたので訂正しました......)  だったらブロックストレージ
  • 払い出されたストレージのマウントパスを見てPVを同様に作り、そのPVを参照するPVCを作れば同じストレージのマウントパスを参照させることが可能になる

同僚(と言ってもOpenShiftの文脈では大先輩)と話し、PVはClusterのストレージとの紐付きのI/FでPVCはPVとNamespaceとの紐付きのI/Fだと聞いた。
以下で誤った素人理解をいくつか記載する。

誤り1:複数Deploymentでも同じNamespaceなら同じPVCを使いまわせる
こうすればできる:Deployment(Pods)の中でsubPathを使う

     volumeMounts:
     - mountPath: /var/www/html
       name: site-data
       subPath: html

出典:Volumes | Kubernetes https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath

この方法は軽量で望ましいと経験のある同僚は言っていた。
ただ、出典見る限り、同じPod内で複数使う場合だから複数のDeploymentで使えるのかは検討する必要がある気がした。
が、同僚が実績ありとのことなので取りうる方法なのだと思う。


誤り2:複数のPVCで同じPVを参照できる
こうすればできる:あるPVが指しているマウント先と同じマウント先を指すPVを複数作り、それぞれごとにPVCを作れば参照できる

感覚的にはPVはストレージから切り出した仮想ストレージ片みたいな雰囲気を感じるので、そうだとすれば、それを複数使いたい数だけPVCをすればいいのだと思いたくなる。
が、PVとPVCは1:1の関係性なのだという。確かにKubernatesの永続ボリュームの記事にもそう明記されている。

この辺の関係性を理解するには、次の図がとてもよかった。


出所:Kubernetesの永続化 [PersistentVolume/PersistentVolumeClaim] https://noumenon-th.net/programming/2019/04/19/persistentvolume/

この絵はもちろんとても正しいのだけど、素人的には、PodではなくてDeploymentを操作した結果のPodなので、この絵はあくまで実行時のViewとして抑えておくと良さそう。

というわけで無事同じストレージの同じマウントパスに複数のDeploymentから参照することができた。
この後はNFS Clientで当該ストレージのこれまた同じマウントパスをマウントして、Podから吐き出されたデータを見ることができるようになった。

ここに来るまでにそもそもファイルストレージではなくてブロックストレージを吐き出させてしまっていたり、画面上からPVCを作った時にストレージクラスを指定しないと勝手に指定された上で新たにPVが作られ、そのPVに紐づくストレージが払い出されてしまう、ということが起きたりした。

このあたりは、PVCがClaimしているのに合致するPVがないとBoundされない、という仕様に対して、Managedなクラウドが便利に、合致するのがない場合は合致するPVとストレージを払い出す、という対応をしてくれているのだと思う。その便利さを使いこなせずにちょっとばかし遠回りをしたのが今回の結果。


ちなみに、同僚からはOpenShift上にNFS Clientを立てる方法も教えてもらった。これを実現できるとoc rshとかoc rsyncで中身にアクセスするのも容易でとても良い。

oc create sa nfs-client
oc adm policy add-scc-to-user privileged -z nfs-client # NFS Clientコンテナはroot権限でかつprivilegedアクセスを要求するので新たにサービスアカウントを作成してprivileged権限をつける
oc run nfs-client --image=evansgp/nfs-client --env SHARE="ストレージのマウント先" --serviceaccount=nfs-client
oc edit dc nfs-cliet # 次の記述をspec.template.spec.containers以下に追加

       securityContext:
         privileged: true
         runAsUser: 0


参考:
* Volumes | Kubernetes https://kubernetes.io/docs/concepts/storage/volumes/
* 永続ボリューム | Kubernetes https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/
* ファイルストレージ、ブロックストレージ、オブジェクトストレージの比較 https://www.redhat.com/ja/topics/data-storage/file-block-object-storage
* evansgp/nfs-client - Docker Hub https://hub.docker.com/r/evansgp/nfs-client