データベースやメッセージキューなどのステートフルアプリケーションにおいて、Kubernetes の StatefulSet は volumeClaimTemplates フィールドを使用し、各 Pod に専用の永続ボリューム要求 (PVC) を動的に作成・アタッチします。この PVC は独立した永続ボリューム (PV) にバインドされます。Pod が再作成または再スケジュールされた場合でも、PVC は自動的に元の PV に再マウントされるため、データの永続化とサービスの継続性が保証されます。
以下は、volumeClaimTemplates の設定例です。
apiVersion: apps/v1
kind: StatefulSet
# ...
spec:
# ...
volumeClaimTemplates:
- metadata:
name: data-volume # PVC テンプレートの名前
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-essd" # ストレージタイプを指定
resources:
requests:
storage: 20Gi # 要求されたストレージ容量仕組み
作成とスケールアウト
初回作成時またはスケールアウト時に、StatefulSet コントローラーは
volumeClaimTemplatesを使用して、各 Pod レプリカに一意の名前を持つ PVC を作成してバインドします。PVC は[template-name]-[pod-name]のパターンに従って命名されます。たとえば、テンプレート名がdata-volumeの場合、コントローラーは Podweb-0とweb-1に対して、それぞれdata-volume-web-0とdata-volume-web-1という名前の PVC を作成し、Pod とそのストレージ間に安定したマッピングを確立します。テンプレート内のパラメーター (
storageClassName、storage、accessModesなど) に基づいて、Container Storage Interface (CSI) は、タイプ、サイズ、アクセスモードが一致する PV を自動的に作成し、その PV をバインドしてマウントします。スケールイン
StatefulSet がスケールインされると、コントローラーは Pod 自体のみを削除します。関連付けられた PVC と基盤となる PV は、データを保護するために保持されます。
再スケールと障害回復
再度スケールアウト (レプリカ数を増やす) する場合や、障害回復 (Pod が削除されてから再作成) の際に、コントローラーは以前に保持されていた同じ名前の PVC を自動的に見つけて再利用します。
PVC が存在する場合、同じ名前の新しい Pod は既存の PV を自動的にマウントし、状態とデータを迅速に回復できます。
PVC が存在しない場合 (例えば、スケールアウト操作が過去のピークレプリカ数を超えた場合など)、新しい PVC とそれに対応する PV が作成されます。
ステップ 1: 永続ストレージを持つ StatefulSet のデプロイ
この例では、Service と 2 つのレプリカを持つ StatefulSet をデプロイします。StatefulSet は volumeClaimTemplates を使用して、各レプリカに 20 GiB のクラウドディスクを自動的に作成します。
statefulset.yamlという名前のファイルを作成します。次の表に、
volumeClaimTemplatesのパラメーターを説明します。パラメーター
説明
accessModesボリュームのアクセスモードです。
ReadWriteOnceは、ボリュームが一度に 1 つのノードによって読み取り/書き込みとしてマウントできることを意味します。storageClassName使用するストレージクラスの名前です。
alicloud-disk-essdは、デフォルトのパフォーマンスレベル (PL) が PL1 のエンタープライズ SSD (ESSD) を作成するために Container Service for Kubernetes (ACK) が提供するデフォルトのストレージクラスです。これらのディスクは従量課金制を使用します。詳細については、「ブロックストレージの課金」および「ブロックストレージの価格」をご参照ください。
storageディスクボリュームの容量。
StatefulSet をデプロイします。
kubectl create -f statefulset.yamlPod が実行中であることを確認します。
kubectl get pod -l app=nginxPVC を表示し、システムが各 Pod に対応する PVC を自動的に作成してバインドしたことを確認します。
kubectl get pvc期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 3m31s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 48s
ステップ 2: ストレージのライフサイクルの検証
スケールアウト、スケールイン、そして再度スケールアウトを行うことで、関連する PVC の作成、保持、再利用を観察します。
アプリケーションのスケールアウト
StatefulSet のレプリカ数を 3 に増やします。
kubectl scale sts web --replicas=3Pod が実行中であることを確認します。
kubectl get pod -l app=nginxPVC を表示して、システムが Pod
web-2とそれに対応する PVCdisk-essd-web-2を自動的に作成したことを確認します。kubectl get pvc期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m1s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 78s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 16s
アプリケーションのスケールイン
StatefulSet のレプリカ数を 2 に減らします。
kubectl scale sts web --replicas=2ポッドが実行中であることを確認します。
kubectl get pod -l app=nginxPVC を表示します。
kubectl get pvc期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m21s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 98s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 36sこの時点で、Pod
web-2は削除されましたが、PVCdisk-essd-web-2はデータの永続性を確保するためにまだ保持されます。
アプリケーションの再度スケールアウト
StatefulSet のレプリカ数を再び 3 に増やします。
kubectl scale sts web --replicas=3Pod が実行中であることを確認します。
kubectl get pod -l app=nginxPVC を表示します。
kubectl get pvc期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m50s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 2m7s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 65s新しく作成された Pod
web-2は、以前保持されていた PVCdisk-essd-web-2を自動的に再利用します。
ステップ 3: Pod 障害後のデータ永続性の検証
Pod の再作成後もデータが永続することを確認するため、Pod にデータを書き込んでから削除し、再度データを確認します。
Pod にテストデータを書き込みます。
Pod
web-1を例として、マウントされたディスクパス/dataにtestファイルを作成します。kubectl exec web-1 -- touch /data/test kubectl exec web-1 -- ls /data期待される出力:
lost+found testPod を削除して、Pod の障害をシミュレートします。
kubectl delete pod web-1kubectl get pod -l app=nginxを再度実行すると、web-1という名前の新しい Pod が自動的に作成されていることがわかります。新しい Pod のデータを確認します。
新しい
web-1Pod の/dataディレクトリを確認します。kubectl exec web-1 -- ls /data作成した
testファイルはまだ存在しています。これにより、Pod が削除されて再作成された場合でもデータが永続することが確認できます。lost+found test
本番運用時の注意点
コストとリソースの管理: StatefulSet をスケールインまたは削除すると、関連する PVC とディスクはデフォルトで保持されます。これらの保持されたリソースには引き続き料金が発生し続けます。不要な料金を回避するために、未使用の PVC と PV を手動でクリーンアップしてください。
データセキュリティとバックアップ: 永続ストレージは Pod の障害時に高可用性を確保しますが、データバックアップソリューションではありません。重要なデータについては、バックアップセンターを使用して定期的なバックアップを実行してください。
高可用性と災害復旧: ディスクはゾーンリソースであり、ゾーンをまたいでマウントすることはできません。クロスゾーン災害復旧には、リージョン ESSD など、クロスゾーンのデータレプリケーションをサポートするディスクタイプを使用してください。
関連ドキュメント
トラブルシューティングについては、「ディスクボリュームに関する FAQ」をご参照ください。