EMQXクラスターでのパーシステンス有効化
目的
persistentVolumeClaimSpec フィールドを使用して、EMQXクラスターのCoreノードに対して永続ストレージを構成します。
EMQXクラスターのパーシステンス設定
apps.emqx.io/v3beta1 EMQX CRDの .spec.coreTemplate.spec.persistentVolumeClaimSpec フィールドは、各Coreノードの永続ストレージを構成します。このフィールドはKubernetesの PersistentVolumeClaimSpec スキーマおよびセマンティクスを使用します。
EMQX Operator 3.0は、単一のStatefulSetでCoreノードを管理します。各Core Podはイメージの更新やローリングアップデートを通じて安定したIDと安定したPVCを持ちます。このフィールドを設定すると、EMQX OperatorはEMQXコンテナの /opt/emqx/data ボリュームをPersistent Volume Claim(PVC)でバックアップされるように構成します。PVCは指定されたStorageClassを使用してPersistent Volume(PV)をプロビジョニングします。
PVCのライフサイクル
CoreノードのPVCはStatefulSetのPodオーディナルに紐づいています。例えば、emqx-core-0 のPVCはイメージ更新やローリングアップデート中も emqx-core-0 にアタッチされたままであり、ノードは同じデータボリュームを使い続けます。
EMQX Operatorは不要になったCoreノードのPVCをKubernetesに削除させるように設定しています。
Coreノードをスケールダウンすると、削除されたPodオーディナルに対応するPVCが削除されます。
例えば、Coreレプリカ数を5から3にスケールダウンすると、オーディナル3と4のPVCが削除されます。StatefulSetのスケールダウン前に、EMQX OperatorはDurable Storageのデータを該当Coreノードからリバランスし、データと耐久性を保護します。
EMQXカスタムリソースを削除すると、KubernetesはCore StatefulSetとそれに関連付けられたPVCを削除します。
ローリングアップデート中は、StatefulSetの名前とPodオーディナルが変わらないため、PVCは保持されます。
この自動クリーンアップはKubernetesの StatefulSetAutoDeletePVC フィーチャーゲートに依存しており、Kubernetes 1.27以降ではデフォルトで有効です。クラスター管理者がこのフィーチャーゲートを無効化している場合、Kubernetesは削除ポリシーを無視し、未使用のPVCを手動でクリーンアップする必要があります。
PVおよびPVCの詳細については、Persistent Volumesのドキュメントを参照してください。
以下の内容をYAMLファイルとして保存し、
kubectl applyでデプロイします。yamlapiVersion: apps.emqx.io/v3beta1 kind: EMQX metadata: name: emqx spec: image: emqx/emqx:6.3.2 config: roots: license: key: "..." coreTemplate: spec: persistentVolumeClaimSpec: storageClassName: standard resources: requests: storage: 1Gi accessModes: - ReadWriteOnce replicas: 3 listenersServiceTemplate: spec: type: LoadBalancer dashboardServiceTemplate: spec: type: LoadBalancerTIP
storageClassNameフィールドを使って、EMQXデータに適したStorageClassを選択してください。kubectl get storageclassを実行すると、Kubernetesクラスターに既存のStorageClass一覧が表示されます。必要に応じてStorageClassを作成してください。EMQXクラスターが準備完了になるまで待ちます。
kubectl getでEMQXクラスターのステータスを確認し、STATUSがReadyになることを確認してください。準備完了までに時間がかかる場合があります。bash$ kubectl get emqx emqx NAME STATUS AGE emqx Ready 10m
パーシステンスの検証
Core Podが置き換えられた際にKubernetesが同じPVCを再アタッチすることを検証します。このテストではEMQXリソースを削除しないでください。EMQX OperatorはStatefulSetが削除されると関連するPVCも削除するように構成しています。
最初のCore PodにアタッチされているPVCのUIDを記録します。
bashpvc_name=emqx-core-data-emqx-core-0 pvc_uid_before=$(kubectl get pvc "${pvc_name}" -o jsonpath='{.metadata.uid}') kubectl get pvc "${pvc_name}"Podを削除し、StatefulSetが再作成するまで待ちます。
bashkubectl delete pod emqx-core-0 kubectl wait --for=condition=Ready pod/emqx-core-0 --timeout=10mPodが準備完了後のPVCのUIDを比較します。
bashpvc_uid_after=$(kubectl get pvc "${pvc_name}" -o jsonpath='{.metadata.uid}') test "${pvc_uid_before}" = "${pvc_uid_after}" && echo "Core Podは同じPVCを再利用しました。"
UIDが一致すれば、Kubernetesが元のPVCを保持しており、置き換えられたPodが同じ永続ボリュームを引き続き使用していることが確認できます。