StatefulSetがFailedSchedulingになる原因と解決方法

kubenetesロゴ

pod has unbound immediate PersistentVolumeClaims」エラーの対処手順

StatefulSet をデプロイした際に、Pod が起動せず FailedScheduling エラーになることがあります。

kubectl describe を確認すると、以下のようなエラーが表示されました。

FailedScheduling  23s   default-scheduler  
0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims. 
preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
PVCエラー画面

この記事では、このエラーの原因と解決方法をわかりやすく解説します。

エラーの原因

このエラーは、PersistentVolumeClaim(PVC)がバインドされていない状態のときに発生します。

つまり、

  • Pod は PVC を使おうとしている
  • しかし PVC に対応する PersistentVolume(PV)が存在しない
  • または StorageClass が一致していない

という状態です。

まず確認すること

① PVC の状態を確認

以下のコマンドを実行します。

kubectl get pvc

もし STATUS が Pending になっている場合、PVC に対応する PV が存在していません。

PVC がバインドされない原因

PVC が PV にバインドされるためには、以下の条件が一致している必要があります。

  • StorageClass
  • アクセスモード(ReadWriteOnce など)
  • ストレージサイズ

今回の環境では、StatefulSet で指定していた StorageClass「standard-2」が存在していませんでした。

解決方法

StorageClass を作成してから、StatefulSet を再デプロイします。

① StorageClass を作成

standard-retain.yaml を作成

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard-2
provisioner: k8s.io/minikube-hostpath
reclaimPolicy: Retain
volumeBindingMode: Immediate

適用します。

kubectl apply -f standard-retain.yaml

② 作成できているか確認

kubectl get storageclass

standard-2 が表示されていれば OK です。

③ StatefulSet を再デプロイ

kubectl replace --force -f statefulSet-write-podName.yaml

結果

StatefulSet を再デプロイすると、Pod は正常に起動し Running 状態になりました 🎉

まとめ

StatefulSet が FailedScheduling になる原因の多くは、PVC がバインドされていないことです。

トラブルが発生したら、以下の順番で確認しましょう。

  1. kubectl get pvc
  2. STATUS が Pending か確認
  3. StorageClass が存在するか確認
  4. 一致する PV があるか確認