5.8.4. RWO ストレージを使用したアプリケーションの復旧
ReadWriteOnce (RWO) ストレージを使用するアプリケーションには、この Kubernetes の問題 で説明されている既知の動作があります。この問題のため、データゾーンに障害が発生した場合は、RWO ボリュームをマウントしているそのゾーンのアプリケーション Pod(例: cephrbd ベースのボリューム) は 6〜8 分後に Terminating ステータスのままになり、手動の介入なしではアクティブゾーンに再作成されません。
ステータスが NotReady の OpenShift Container Platform ノードを確認します。ノードが OpenShift コントロールプレーンと通信できない問題が生じる可能性があります。ただし、ノードは永続ボリューム (PV) に対して I/O 操作を実行している可能性があります。
2 つの Pod が同じ RWO ボリュームに同時に書き込む場合は、データ破損のリスクが発生します。NotReady ノードのプロセスが終了するか、終了するまでブロックされていることを確認します。
ソリューションの例:
- 帯域外管理システムを使用してノードの電源をオフにし、確認を行うことは、プロセスを確実に終了させる例です。
障害が発生したサイトのノードによってストレージとの通信に使用されるネットワークルートを無効します。
注記障害のあるゾーンまたはノードにサービスを復元する前に、PV が指定されたすべての Pod が正常に終了していることを確認します。
Terminating Pod がアクティブなゾーンで再作成されるようにするには、Pod を強制的に削除するか、関連付けられた PV でファイナライザーを削除します。これら 2 つのアクションのいずれかが完了すると、アプリケーション Pod がアクティブゾーンで再作成され、その RWO ストレージが正常にマウントされます。
- Pod を強制的に削除
強制削除は、Pod が終了したという kubelet からの確認を待ちません。
$ oc delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE><PODNAME>- Pod の名前です。
<NAMESPACE>- プロジェクトの namespace です。
- 関連付けられた PV のファイナライザーの削除
Terminating Pod によってマウントされる永続ボリューム要求 (PVC) に関連付けられた PV を見つけ、
oc patchコマンドを使用してファイナライザーを削除します。$ oc patch -n openshift-storage pv/<PV_NAME> -p '{"metadata":{"finalizers":[]}}' --type=merge<PV_NAME>Pod の名前です。
関連付けられた PV を見つける簡単な方法として、Terminating Pod を記述することができます。複数割り当ての警告が表示される場合は、PV 名が警告に含まれるはずです (例:
pvc-0595a8d2-683f-443b-aee0-6e547f5f5a7c)。$ oc describe pod <PODNAME> --namespace <NAMESPACE><PODNAME>- Pod の名前です。
<NAMESPACE>プロジェクトの namespace です。
出力例:
[...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m5s default-scheduler Successfully assigned openshift-storage/noobaa-db-pg-0 to perf1-mz8bt-worker-d2hdm Warning FailedAttachVolume 4m5s attachdetach-controller Multi-Attach error for volume "pvc-0595a8d2-683f-443b-aee0-6e547f5f5a7c" Volume is already exclusively attached to one node and can't be attached to another