はじめに
前回はDockerを利用して単体のコンテナでデータ永続化したDBコンテナを起動する方法を解説しました。
本ブログでは、Kubernetesにおけるデータ永続化について紹介します。
まず、Kubernetesと前回使用したDockerの違いについて簡潔に触れ、Kubernetesにおけるデータ永続化の仕組みやリソース、StatefulSetについて詳しく解説します。
KubernetesとDockerの違い
Kubernetesのデータ永続化の解説の前に前回使用したDockerとの違いを解説します。以下の表で示す通りDockerとKubernetesは規模や役割が違います。
Dockerはアプリケーションをコンテナという箱に入れることでどのような環境でも動かせるようにします。
一方、KubernetesはDockerコンテナを大規模に管理・運用するためのプラットフォームです。
Kubernetesにおけるデータ永続化
Kubernetesのデータ永続化はPodが削除されてもデータを保持する仕組みです。データ永続化で主に使用されるのはPV(PersistentVolume)とPVC(PersistentVolumeClaim)です。外部ストレージなどと連携をしてデータを安全に保存します。
PV
PVはざっくりと説明するとストレージを抽象化したものです。正確には物理的なストレージ(AWSのディスクや社内のNFSサーバーなど)を、Kubernetesが理解できる形に「抽象化」し、紐づけたものです。PVはPodと分離されているためPodが削除されてもデータの保持ができます。
PVC
PVCは開発者が具体的なストレージ要件(容量、アクセスモードなど)を宣言するためのものです。PVCをKubernetesに提出すると、Kubernetesが条件に合うPVを自動で紐付けてくれます。
コンテナDBに最適なリソース
KubernetesでDBを利用する際にはリソースが使われます。リソースとは、Kubernetes上でアプリケーションやサービスを動かすために必要な計算資源や制御対象のことです。KubernetesでのリソースはPod、Service、PersistentVolumeといったKubernetes内で管理されるオブジェクトを指します。
StatefulSetは、Kubernetesでデータの一貫性やノード間の順序が求められるステートフルなアプリケーションを実行する際に最適なリソースです。特にデータベースのように一貫性や永続性が必要なケースで使用されます。Podに固有の名前を付与し順序を維持することで、複数のインスタンス間で安定した動作を可能にします。
StatefulSetとDB永続化
StatefulSetを利用することでDBの永続化が可能になります。これにはStatefulSetの二つの機能が関係しています。
まず、StatefulSetはPodに固定の一意な名前を付与する機能を持っています。これによりPodが故障して新しいPodが作成されても同じ名前が引き継がれるため、リソースの識別をすることができます。これにより、DBクラスタ内で「プライマリ(データを管理・更新する役割)」や「レプリカ(データをコピーして保存する役割)」といったノードの役割を識別しやすくなり、クラスタ構成や役割の管理が簡単になります。
次に、Podごとに自動的にPVCを作成する仕組みがあります。この機能により、各Podが個別のストレージを持つことが可能となります。これら二つの機能によってデータの永続化が可能になっています。例として、db-1という名前のPodが故障し、新しいdb-1が作成された場合でも、db-1というPodに固有のPVCが結びついているためデータの永続化が保証されます。
DeploymentとStatefulSetの違い
DeploymentとStatefulSetはどちらもKubernetesでPodを管理するための機能です。
Deploymentは、KubernetesでアプリケーションのPodを管理・更新・スケーリングするためのリソースで、主にステートレスなワークロードに適しています。Deploymentは各Podに固有の名前がありません。どのPodも同じ仕事をするため、1つが故障しても別のPodが仕事を代替することができます。しかし、PodがPVCに紐づかないためデータベースのように永続的かつ固有のデータを持つワークロードには適していません。
StatefulSetは前述のとおりPodそれぞれに固有の名前があります。Podが故障しても以前と同じ名前で作成され、同じPVCに接続されるためデータの永続性が保たれます。
おわりに
今回はKubernetesにおけるデータ永続化について解説しました。
Kubernetesにおけるデータ永続化の知識を活用すると、クラウドネイティブ環境でのステートフルなアプリケーション運用をより効率的に行うことができます。特にデータベースのような一貫性が求められるワークロードをKubernetes上で運用する際には、StatefulSetや永続ボリュームの知識が不可欠です。
次回は実際にKubernetes上でコンテナDBを動かす方法を解説しますので、ぜひご覧ください。
参考文献
Kubernetes と Docker はどのように異なりますか?
https://aws.amazon.com/jp/compare/the-difference-between-kubernetes-and-docker/
Kubernetesのデータ永続化に重要なオブジェクトPVとPVCについて解説します!
https://www.rworks.jp/cloud/kubernetes-op-support/kubernetes-column/kubernetes-entry/29321/
 
					


