はじめまして、事業推進本部SE部の市川です。
普段はセールスエンジニアとして、IDCFクラウドなどサービスのご提案や導入支援を行っています。
今回はIDCFクラウドコンテナサービスでのパーシステントボリュームの利用方法、
さらにはNFSをパーシステントボリュームとして利用する方法をご紹介します。
コンテナ導入時の永続データの扱いについて
昨今、コンテナ技術を利用して商用サービスのシステム構築を行う企業が増えてきています。
当社でも、パブリッククラウドサービス「IDCFクラウド」の基盤の一部にコンテナ技術を採用しています。
今後も自社サービスの開発サイクルの高速化を目指し、コンテナ技術を導入する企業が増えていくと思われます。
コンテナ技術を利用する場合、
コンテナ内に保存したファイルは、そのコンテナが削除されたとき一緒に消えてしまいます。
このため、サーバ上で中間処理を行ったデータやログなど、動的なデータを永続化させるためにはコンテナ外に保存する必要があります。
コンテナ化しつつも永続データをファイルシステムに保存したい!
そんなときに使えるのがパーシステントボリュームです。
パーシステントボリューム [Persistent Volume (以下PVと略します)] とは、
Kubernetesにおける、Pod(≒コンテナ)にマウントすることのできる外部の永続化領域です。
PVはPersistent Volume Claim(以下PVCと略します)を使ってPod作成時にマウントすることができます。
マウントされたPodが削除されてもPVは削除されないので、PVにデータを置いておくことで、コンテナが削除されたときにもデータを消失しないようにできます。
簡単なPVとPVCの作成方法
コンテナサービスでIDCFクラウドにKubernetesクラスターを作った場合、簡単に動的なPV作成を行えます。
この手順についてはIDCFクラウドコンテナご利用ガイドの22ページ~を参照ください。
実はこの動作の裏では、コンテナサービスからAPIでIDCFクラウドを操作しています。
API操作により、要求された容量の仮想マシン用ディスクをノード(=仮想マシン)にアタッチし、Kubernetesがこの仮想マシン用ディスクをPVとして扱っているのです。
このPV作成方法はとても簡単ですが、仮想マシン用ディスクをベースとすることから、容量の上限が有ることや他のノードから参照できないことなどの制限があります*1。
そこで以下では、第2のPV作成方法として、NFSを利用してPVを作成する方法をご紹介します!
下準備 NFSの構築と冗長化
まずは仮想マシンでNFSサーバーを構築します。
当記事作成時の検証用環境では以下手順でNFSの構築および冗長化を行いました。
(本題ではないので詳細説明は割愛します。)
- NFSサーバーを下記通り2つ作成
- OSイメージにCentOSを選択し仮想マシンを作成
- nfs-utilsをインストールし有効化
- ストレージ容量が不足した場合に拡張できるよう、ディスクに関してはLVMを利用し論理ボリューム化
- 2つのNFSサーバーを冗長化
- rsyncとlsyncを用いデータを同期
- keepalivedを利用し、冗長化
2つのサーバで共有するVIPは下記FAQの一つ目の方法で採番しました。
これでNFSサーバー構築および冗長化ができました。
NFSをPVとして利用する手順
次にコンテナサービスによって作成したKubernetesクラスターで、NFSをPV化します。
Kubernetesクラスターの作成に関しては以下の記事も参考にしてください。
NFSとKubernetesクラスターを同じネットワーク上に構築したら、
以下3ステップでNFSをPVとして利用できます。
①上記で作成したNFSを使用し、Kubernetesクラスター上でPVを作成
②作成したPVを指定してPVCを作成
③Podを作成する際にこのPVCを使用してPVをPodにマウント
①NFSを使用してPVを作成
対象のクラスター内にて、上メニュー「ストレージ」→「永続ボリューム」にて「ボリュームを追加」。
必要項目を入力し「保存」。
ボリュームプラグイン:「NFS 共有」を選択
パス:NFSのexportsのパスを指定
サーバー:NFSサーバーのIPアドレス(VIP等で冗長化したもの)やFQDNを記載
読み取り専用:Writeもする場合は「いいえ」を選択
アクセスモード:複数のノードから利用する場合は「複数ノード読み取り/書き込み」を選択
登録が完了するとAvailableとしてリストされますが、この時点では接続性は確認されていません。
②PVCを作成
次に、対象のプロジェクトに移り、
上メニュー「リソース」→「ワークロード」にて、「ボリューム」タブを選び「ボリュームを追加」。
「既存の永続ボリュームを使用」を選択し、「永続ボリューム」にさきほど登録したNFSを選択。
複数ノードから利用する場合は、「複数ノード読み取り/書き込み」にもチェックし、「作成」。
Boundとしてリストされますが、この時点でも接続性は確認されていません。
③PVCを使ってPodにPVをマウント
ワークロードにNFSをPVとして利用
対象のプロジェクトに移り、上メニュー「リソース」→「ワークロード」にて「デプロイ」。
ここで、「ボリューム」の項目にて「既存の永続ボリューム(要求)を使用」を選択。
「永続ボリューム要求」では先ほど作成したNFSのボリュームを選択。
「マウントポイント」はコンテナ上でのNFSのマウント先を指定します。
「起動」デプロイします。
シェル上からNFSマウントできていることが確認できます。
以上で、コンテナ上からNFSをマウントできました。
NFS障害時の切り替わり確認
最後に、冗長化したNFSのマスター側で障害が発生したときに自動的に接続が切り替わるか、
PV上のファイルを読み書きできるかどうか、簡単に以下の手順で試験をしましょう。
- NFSマスター機の仮想マシンをクラウドコンソールから強制停止(擬似的な障害を発生させる)
- NFSはkeepalivedによりスレーブがマスターに昇格します
- コンテナのシェル上から、ファイルの読み込み/書き込みが問題なくできることを確認
- また、読み込み/書き込み先はマスターに昇格した方のNFSに対して行われていることを確認
この切り替わりは数秒で完了しました
このように、コンテナサービスや稼働しているコンテナ上で特別な操作は不要で、NFSサーバーとの接続が自動で切り替わることが確認できました。
最後に
サービス開発速度の向上を目指し、コンテナ技術を利用するシーンが今後ますます増えてくるかと思います。
一方で既存システムのコンテナ化やKubernetesの利用に対しまだまだハードルを感じていらっしゃる企業様が多いのではないでしょうか。
当社コンテナサービスでは、Kubernetesクラスター作成や操作がシンプルなWeb UIにより簡単に行なえます。
ぜひコンテナ化、Kubernetes化の第一歩にコンテナサービスをご利用を検討いただけましたら幸いです。
当テックブログでは、今後も当社コンテナサービスを利用したシステムのコンテナ化に役立つ記事をお送りしてまいりますのでご期待ください。
*1:仮想マシンディスクをベースとしたPVの制限事項
IDCFクラウドでは一つの仮想マシン用ディスクは最大1000GBまでという容量制限があります。
このため、1000GBよりも大きい容量のPVはこの方法では作れません。
また、仮想マシン用ディスクはアタッチされた仮想マシンからしか参照できないため、
この方法で作成されたPVは仮想マシン用ディスクがアタッチされたノード上に存在するPodからしかマウントできません。
このため例えば複数のノード上でPodを作りそれらで一つのPVを共有するというような使い方は出来ません
他にも一つの仮想マシンには13個までしかボリュームをアタッチできないため、ノードにつき作成できるPVの数は同じく最大13個までとなります。
例えば複数のエンドユーザーごとにPodを作成しそれぞれのPodでPVを一つずつ使う、といった構成をとる場合、ノード一つに付き13ユーザまでしか収容できない計算になります。
要件上1000GB以上の容量のPVが必要な場合や、あるいはどうしても複数Podで一つのPVを共有したいという場合、本記事でご紹介した方法でPVを作成することで実現ができます。