我正在尝试将基于现有 GCP 永久性磁盘的 PV 以只读方式安装到我的 pod 上。 我的配置看起来像这样(为了保密,其中部分内容被屏蔽)
apiVersion: v1
kind: PersistentVolume
metadata:
name: data-and-models-pv
namespace: lipsync
spec:
storageClassName: ""
capacity:
storage: 10Gi
accessModes:
- ReadOnlyMany
claimRef:
namespace: lipsync
name: data-and-models-pvc
# csi:
# driver: pd.csi.storage.gke.io
# volumeHandle: projects/***/zones/***/disks/g-lipsync-data-and-models
gcePersistentDisk:
pdName: g-lipsync-data-and-models
fsType: ext4
readOnly: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-and-models-pvc
namespace: lipsync
spec:
storageClassName: ""
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 10Gi
然后,在 pod 定义中:
volumeMounts:
- mountPath: /app/models
subPath: models
name: data-and-models-v
readOnly: true
- [...]
volumes:
- name: data-and-models-v
persistentVolumeClaim:
claimName: data-and-models-pvc
readOnly: true
但是,当我执行 kubectl apply 时,pod 永远不会被创建,并且我遇到了这个事件:
0s Warning FailedMount pod/lipsync-api-67c784dfb7-4tlln MountVolume.MountDevice failed for volume "data-and-models-pv" : rpc error: code = Internal desc = Failed to format and mount device from ("/dev/disk/by-id/google-g-lipsync-data-and-models") to ("/var/lib/kubelet/plugins/kubernetes.io/csi/pv/data-and-models-pv/globalmount") with fstype ("ext4") and options ([]): mount failed: exit status 32
Mounting command: mount
Mounting arguments: -t ext4 -o defaults /dev/disk/by-id/google-g-lipsync-data-and-models /var/lib/kubelet/plugins/kubernetes.io/csi/pv/data-and-models-pv/globalmount
Output: mount: /var/lib/kubelet/plugins/kubernetes.io/csi/pv/data-and-models-pv/globalmount: cannot mount /dev/sdb read-only.
如果我手动 ssh 到充当支持 pod 的节点的虚拟机,我可以观察到在挂载选项中添加 noload 可以使我成功挂载磁盘:
sudo mount -o ro,noload,defaults /dev/sdb .
但我不知道有什么方法可以让 Kubernetes 使用这个额外的挂载选项。
如何成功让 GKE 将此磁盘挂载到我的 pod 上?
我今天在只读模式下遇到了同样的问题。希望我的经历能给你一些想法。
我有两张快照,一张是别人创建的,一张是我创建的。两个磁盘上的文件是相同的。
但是当我安装由其他人创建的屏幕截图配置的磁盘时,
readOnly
工作正常。但我的一直遇到和你一样的错误。
所以我在没有
readOnly
模式的情况下登录pod来查看两个磁盘之间的差异。我发现的唯一区别是好的有 userId: 1003
和 groupId 1004
,而我的是 root:root
。所以我运行 chown 1003:1004 -R ./
到我的磁盘,用它创建一个新的快照,然后它就顺利工作了......
我还没找到原因,但至少有效。如果我弄清楚了会告诉你的。
您可以使用 mountOptions
字段在
StorageClass定义中包含挂载选项。
这是一个 GCE 平衡 PD 的示例,当我想包含
discard
安装选项时:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: pd-balanced
namespace: blog-ns
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
mountOptions:
- discard
parameters:
type: pd-balanced
稍后,当您在其他资源中引用此
StorageClass
时,它将导致在实际将存储挂载到节点上时包含挂载选项。
专门针对只读磁盘,GKE(可能继承自 k8s,实际上不知道)会自动为您添加
norecovery
选项,以减少文件系统脏时挂载失败。
希望这有帮助。从讨论中不清楚是否应归咎于文件系统权限或只读方面,但由于我刚刚写了一篇关于只读永久磁盘的博客,我想分享我最近学到的东西。