StatefulSetがFailedSchedulingになる原因と解決方法
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.
この記事では、このエラーの原因と解決方法をわかりやすく解説します。
記事の目次
エラーの原因
このエラーは、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 がバインドされていないことです。
トラブルが発生したら、以下の順番で確認しましょう。
- kubectl get pvc
- STATUS が Pending か確認
- StorageClass が存在するか確認
- 一致する PV があるか確認
- タグ:
- Kubenetes