GKE:使用基于只读 GCP 持久磁盘的 PV 时无法以只读方式挂载 /dev/sdb

问题描述 投票:0回答:2

我正在尝试将基于现有 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 上?

google-cloud-platform google-kubernetes-engine
2个回答
0
投票

我今天在只读模式下遇到了同样的问题。希望我的经历能给你一些想法。

我有两张快照,一张是别人创建的,一张是我创建的。两个磁盘上的文件是相同的。

但是当我安装由其他人创建的屏幕截图配置的磁盘时,

readOnly
工作正常。但我的一直遇到和你一样的错误。

所以我在没有

readOnly
模式的情况下登录pod来查看两个磁盘之间的差异。我发现的唯一区别是好的有
userId: 1003
groupId 1004
,而我的是
root:root
。所以我运行
chown 1003:1004 -R ./
到我的磁盘,用它创建一个新的快照,然后它就顺利工作了......

我还没找到原因,但至少有效。如果我弄清楚了会告诉你的。


0
投票

您可以使用 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
选项,以减少文件系统脏时挂载失败。

希望这有帮助。从讨论中不清楚是否应归咎于文件系统权限或只读方面,但由于我刚刚写了一篇关于只读永久磁盘的博客,我想分享我最近学到的东西。

© www.soinside.com 2019 - 2024. All rights reserved.