尽管等效 gcloud/mnt 工作正常,但 Kubernetes 部署无法挂载卷
Kubernetes deployment cannot mount volume despite equivalent gcloud/mnt works fine
我有一个 Kubernetes 部署,其中 pod 应该挂载 PD。
在spec.template.spec.containers.[*]
下我有这个:
volumeMounts:
- name: app-volume
mountPath: /mnt/disk/app-pd
在 spec.template.spec
下:
volumes:
- name: app-volume
gcePersistentDisk:
pdName: app-pd
fsType: ext4
app-pd
是一个 GCE 永久磁盘,上面有一个 ext4
文件系统(因此没有分区)。如果我 运行 kubectl create
我从 kubectl describe pod
:
得到这些错误信息
Warning FailedMount Unable to mount volumes for pod "<id>":
timeout expired waiting for volumes to attach/mount for pod"<id>"/"default".
list of unattached/unmounted volumes=[app-volume]
Warning FailedSync Error syncing pod, skipping:
timeout expired waiting for volumes to attach/mount for pod "<id>"/"default".
list of unattached/unmounted volumes=[app-volume]
在 运行 作为 pod 的 VM 实例上,/var/log/kubelet.log
包含这些错误消息的重复,这些错误消息可能与以上内容相关甚至导致:
reconciler.go:179]
VerifyControllerAttachedVolume operation started for volume "kubernetes.io/gce-pd/<id>"
(spec.Name: "<id>") pod "<id>" (UID: "<id>")
goroutinemap.go:155]
Operation for "kubernetes.io/gce-pd/<id>" failed.
No retries permitted until <date> (durationBeforeRetry 2m0s).
error: Volume "kubernetes.io/gce-pd/<id>" (spec.Name: "<id>") pod "<id>" (UID: "<id>")
is not yet attached according to node status.
但是,如果我尝试将 PD 附加到 运行 带有 gcloud compute instances attach-disk
和 gcloud compute ssh
的 pod 的 VM 实例,我可以看到以下内容文件已创建。
/dev/disk/by-id/google-persistent-disk-1
如果我安装它(PD),我可以看到并使用预期的文件。
如何进一步诊断这个问题并最终解决它?
问题可能是文件被称为 /dev/disk/google-persistent-disk-1
而不是 /dev/disk/google-<id>
如果我从云控制台安装它们会发生什么 UI?
UPDATE 我通过使用单个 ext4
文件系统(因此没有分区)格式化磁盘来简化设置,并相应地编辑上面的描述。我还添加了来自 kubelet.log
.
的更具体的错误指示
UPDATE 如果我在部署到将托管 pod 的实例 VM 之前手动添加 PD(在 Cloud Console UI 中),问题仍然存在。 PD和实例VM都在同一个可用区。
UPDATE 根据 GCE #211.
,观察到同一永久性磁盘的块设备名称差异是正常的
我还不知道为什么,但在部署之前删除并重新创建 GKE 集群显然解决了这个问题。
我有一个 Kubernetes 部署,其中 pod 应该挂载 PD。
在spec.template.spec.containers.[*]
下我有这个:
volumeMounts:
- name: app-volume
mountPath: /mnt/disk/app-pd
在 spec.template.spec
下:
volumes:
- name: app-volume
gcePersistentDisk:
pdName: app-pd
fsType: ext4
app-pd
是一个 GCE 永久磁盘,上面有一个 ext4
文件系统(因此没有分区)。如果我 运行 kubectl create
我从 kubectl describe pod
:
Warning FailedMount Unable to mount volumes for pod "<id>":
timeout expired waiting for volumes to attach/mount for pod"<id>"/"default".
list of unattached/unmounted volumes=[app-volume]
Warning FailedSync Error syncing pod, skipping:
timeout expired waiting for volumes to attach/mount for pod "<id>"/"default".
list of unattached/unmounted volumes=[app-volume]
在 运行 作为 pod 的 VM 实例上,/var/log/kubelet.log
包含这些错误消息的重复,这些错误消息可能与以上内容相关甚至导致:
reconciler.go:179]
VerifyControllerAttachedVolume operation started for volume "kubernetes.io/gce-pd/<id>"
(spec.Name: "<id>") pod "<id>" (UID: "<id>")
goroutinemap.go:155]
Operation for "kubernetes.io/gce-pd/<id>" failed.
No retries permitted until <date> (durationBeforeRetry 2m0s).
error: Volume "kubernetes.io/gce-pd/<id>" (spec.Name: "<id>") pod "<id>" (UID: "<id>")
is not yet attached according to node status.
但是,如果我尝试将 PD 附加到 运行 带有 gcloud compute instances attach-disk
和 gcloud compute ssh
的 pod 的 VM 实例,我可以看到以下内容文件已创建。
/dev/disk/by-id/google-persistent-disk-1
如果我安装它(PD),我可以看到并使用预期的文件。
如何进一步诊断这个问题并最终解决它?
问题可能是文件被称为 /dev/disk/google-persistent-disk-1
而不是 /dev/disk/google-<id>
如果我从云控制台安装它们会发生什么 UI?
UPDATE 我通过使用单个 ext4
文件系统(因此没有分区)格式化磁盘来简化设置,并相应地编辑上面的描述。我还添加了来自 kubelet.log
.
UPDATE 如果我在部署到将托管 pod 的实例 VM 之前手动添加 PD(在 Cloud Console UI 中),问题仍然存在。 PD和实例VM都在同一个可用区。
UPDATE 根据 GCE #211.
,观察到同一永久性磁盘的块设备名称差异是正常的我还不知道为什么,但在部署之前删除并重新创建 GKE 集群显然解决了这个问题。