KubernetesでMountVolume.SetUp failed for volume: mount failed exit status 32を修正する

intermediate☸️ Kubernetes2026-03-18| Kubernetes 1.20以降、Linuxノード(Ubuntu/RHEL/Amazon Linux)、AWS EBS / GCE PD / NFS / iSCSIストレージバックエンド

Error Message

MountVolume.SetUp failed for volume "my-pv" : mount failed: exit status 32
#kubernetes#persistent-volume#mount#storage#pvc

TL;DR

PodがContainerCreatingで止まり、イベントに以下が表示されている場合:

MountVolume.SetUp failed for volume "my-pv" : mount failed: exit status 32

原因はたいてい3つのうちのどれかです。ボリュームがダウンまたは終了中のノードにまだアタッチされている(Multi-Attach)。ノードにファイルシステムユーティリティが不足している(e2fsckxfs_repairなど)。あるいは前のPodから残留マウントが残っている。まず古いPodが動作していたノードを確認し、そこから順に調べていきましょう。

何かする前にエラー全文を読む

すぐに以下を実行して、実際のエラーチェーンを確認します:

kubectl describe pod <pod-name> -n <namespace>

Eventsセクションまでスクロールしてください。通常、以下のいずれかのパターンが表示されます:

  • Multi-Attach error for volume ... Volume is already exclusively attached to one node
  • mount failed: exit status 32 — ファイルシステムツールが不足しているか破損している
  • Unable to attach or mount volumes: unmounted volumes=[my-pv] — PVCが古いノードにバインドされたまま
  • Output: mount: /var/lib/kubelet/pods/.../mount: can't read superblock — ボリュームが破損している

どのパターンに該当するかによって、修正すべき内容が決まります。

原因1:Multi-Attach — ボリュームが別ノードにロックされている

ノードがクラッシュまたはコードンされ、古いPodが正常に終了しなかった場合です。新しいPodが別のノードに配置されますが、AWS EBSやGCE PDは同時に1つのアタッチしか許可しません。Kubernetesは古いノードが完全に消えたことを確認するまで、強制的にボリュームをデタッチしません。

# 現在PVがアタッチされているノードを確認する
kubectl get pv <pv-name> -o jsonpath='{.spec.nodeAffinity}'

# VolumeAttachmentオブジェクトを確認する
kubectl get volumeattachment

# そのクレームを持つ古いPodを探す
kubectl get pods --all-namespaces -o wide | grep <pvc-name>

古いPodがTerminatingで止まっている場合:

# 止まったPodを強制削除する — ノードが確実にダウン/交換済みの場合のみ実行
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0

VolumeAttachment自体が孤立している場合(ノードがすでに消えている):

# 古いVolumeAttachmentを一覧表示する
kubectl get volumeattachment

# 孤立したものを削除する
kubectl delete volumeattachment <attachment-name>

削除後、30〜60秒待ちます。新しいPodがマウントを開始するはずです。

原因2:ノードにファイルシステムユーティリティが不足している

mountからのexit status 32は、カーネルが必要なものを持っていないというサインです。ファイルシステム用のモジュールまたはユーザースペースツールがインストールされていません。OSアップグレード後や最小構成のノードイメージ使用時によく発生します。例えば、Ubuntu 22.04の最小インストールではxfsprogsはデフォルトで含まれていません。

# 対象ノードにSSH接続する
ssh <node-ip>

# PVが使用するファイルシステムを確認する — まずkubectlで取得する
kubectl get pv <pv-name> -o jsonpath='{.spec.csi.fsType}'

# ノード上でツールが存在するか確認する
which mkfs.ext4
which mkfs.xfs
which mount.nfs  # NFSボリュームの場合

不足しているものをインストールします:

# Debian/Ubuntu
apt-get install -y e2fsprogs xfsprogs nfs-common

# RHEL/CentOS/Amazon Linux
yum install -y e2fsprogs xfsprogs nfs-utils

インストール後、kubeletは自動的にリトライします。1分以内に反映されない場合は、Podを削除して新たなマウントを強制します:

kubectl delete pod <pod-name> -n <namespace>

原因3:残留マウントポイントまたはファイルシステムの破損

以前に失敗したマウントが、新しいマウント試行をブロックするゴーストエントリを残すことがあります。ノードを直接確認してください:

# ボリュームの残留マウントを探す
cat /proc/mounts | grep <pv-name>
# またはPVC UIDで確認する
ls /var/lib/kubelet/pods/ | xargs -I{} ls /var/lib/kubelet/pods/{}/volumes/

残留エントリが見つかった場合はクリーンアップします:

# 残留パスをアンマウントする
umount -l /var/lib/kubelet/pods/<pod-uid>/volumes/<plugin>/<pv-name>

# kubeletを再起動して状態をクリアする
systemctl restart kubelet

ext4またはxfsファイルシステムが破損している場合は、クラウドコンソールからノードのボリュームをデタッチし、適切な修復ツールを実行します:

# ext4の場合
e2fsck -f /dev/<device>

# xfsの場合
xfs_repair /dev/<device>

原因4:PVCアクセスモードの不一致

ReadWriteOnce(RWO)ボリュームを使用しながら、異なるノードに複数のPodレプリカを実行しようとしていませんか?それは動作しません。RWOは1ノード専用です。

kubectl get pvc <pvc-name> -o jsonpath='{.spec.accessModes}'

対応策:

  • ReadWriteManyをサポートするストレージクラスに切り替える — NFS、AWS EFS、CephFSはこれに対応しています
  • nodeSelectorまたはpodAffinityを使用して、PVCを共有するすべてのPodを同じノードに固定する
  • RWXが利用できない場合は、Deploymentのreplicas: 1に落とす

原因5:対象ノードでCSIドライバーが動作していない

# 対象ノードでCSIノードプラグインが正常かどうか確認する
kubectl get pods -n kube-system -o wide | grep csi

# そのノードのCSIノードDaemonSetポッドのログを確認する
kubectl logs -n kube-system <csi-node-pod> -c <csi-driver-container>

CSIポッドがCrashLoopBackOffになっているか、そのノードに存在しない場合、他の何をやっても意味がありません — ドライバーが正常になるまでボリュームはマウントできません。まずCSIの問題を修正してから、Podに戻りましょう。

確認

# Podイベントをリアルタイムで監視する
kubectl get events -n <namespace> --watch --field-selector involvedObject.name=<pod-name>

# PodがRunningに遷移するか確認する
kubectl get pod <pod-name> -n <namespace> -w

# コンテナ内でボリュームがマウントされているか確認する
kubectl exec -it <pod-name> -n <namespace> -- df -h
kubectl exec -it <pod-name> -n <namespace> -- ls <mount-path>

PodがRunningになり、df -hで期待したパスにボリュームが表示されれば、マウント問題は解決です。

予防策

  • terminationGracePeriodSecondsをPodがボリュームを正常にリリースできる十分な値に設定する — データベースワークロードでは60〜120秒が合理的な基準値です
  • PodDisruptionBudgetsを追加して、ローリング動作を制御し、ノードドレイン中のデタッチ競合状態を防ぐ
  • ブロックストレージ上のステートフルワークロードにはStatefulSetを使用する — Deploymentよりもボリュームのライフサイクル管理がはるかに安定しています
  • CSIドライバーを最新の状態に保つ。ドライバーのリリースにはマウントの信頼性向上の修正が頻繁に含まれています

Related Error Notes