【问题标题】:Problems mounting Persistent Volume as ReadOnlyMany across multiple pods跨多个 pod 将持久卷安装为 ReadOnlyMany 时出现问题
【发布时间】:2021-01-31 05:38:38
【问题描述】:

我在将 ReadOnlyMany 持久卷挂载到 GKE 上的多个 pod 时遇到了一些问题。目前它只能安装在一个 pod 上,而无法安装在任何其他 pod 上(由于第一个 pod 上正在使用该卷),导致部署仅限于一个 pod。

我怀疑该问题与从卷快照填充的卷有关。

查看相关问题后,我已经进行了理智检查 spec.containers.volumeMounts.readOnly = true 和 spec.containers.volumes.persistentVolumeClaim.readOnly = true 这似乎是相关问题的最常见修复。

我在下面包含了相关的 yaml。任何帮助将不胜感激!

这是(大部分)部署规范:

spec:
  containers:
  - env:
    - name: GOOGLE_APPLICATION_CREDENTIALS
      value: /var/secrets/google/key.json
    image: eu.gcr.io/myimage
    imagePullPolicy: IfNotPresent
    name: monsoon-server-sha256-1
    resources:
      requests:
        cpu: 100m
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /mnt/sample-ssd
      name: sample-ssd
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: gke-cluster-1-default-pool-3d6123cf-kcjo
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 29
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: sample-ssd
    persistentVolumeClaim:
      claimName: sample-ssd-read-snapshot-pvc-snapshot-5
      readOnly: true

存储类(也是本集群的默认存储类):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sample-ssd
provisioner: pd.csi.storage.gke.io
volumeBindingMode: Immediate
parameters:
    type: pd-ssd

PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sample-ssd-read-snapshot-pvc-snapshot-5
spec:
  storageClassName: sample-ssd
  dataSource:
    name: sample-snapshot-5
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 20Gi

【问题讨论】:

  • 这是我从 GKE 获得的特定错误事件:AttachVolume.Attach failed for volume "pvc-0bf664e7-4cb0-4621-9ef0-f24d00115a27" : rpc error: code = Internal desc = unknown附加错误:等待区域操作时失败:操作 operation-1602875581480-5b1ce8da74009-eb0dd671-6821f2b2 失败(RESOURCE_IN_USE_BY_ANOTHER_RESOURCE):磁盘资源 'projects/monsoon-273916/zones/europe-west2-a/disks/pvc-0bf664e7-4b -4621-9ef0-f24d00115a27' 已被 'projects/monsoon-273916/zones/europe-west2-a/instances/gke-cluster-1-default-pool-3d6123cf-kcjo' 使用
  • 有一个与 ROX 设置相关的问题打开 github.com/kubernetes/kubernetes/issues/70505,可能会有所帮助!
  • 我假设创建了 PersistentVolume? PV 本身看起来像吗?是否标记为 spec.gcePersistentDisk.readOnly=true?
  • 没有 PV 规范,因为这是动态配置的 PVC。以下是已配置 PV 上“kubectl describe”的相关部分: StorageClass: sample-ssd Status: Bound Access Modes: ROX VolumeMode: Filesystem Source: Type: CSI (a Container Storage Interface (CSI) volume source) Driver: pd. csi.storage.gke.io VolumeHandle: ReadOnly: false
  • @MikePerrow 您使用的 kubernet 版本是什么?

标签: kubernetes google-kubernetes-engine persistent-volumes


【解决方案1】:

Google 工程师已意识到此问题。

您可以在 GitHub 上的 issue reportpull request 中找到有关此问题的更多详细信息。

如果您尝试从快照配置 PD 并使其成为 ROX,则有一个临时解决方法

  1. 提供数据源为 RWO 的 PVC;

它将使用源磁盘的内容创建一个新的计算磁盘
2. 根据docs将配置好的PV复制到ROX的新PV

您可以使用以下命令执行它:

步骤 1

提供数据源为 RWO 的 PVC;

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: workaround-pvc
spec:
  storageClassName: ''
  dataSource:
    name: sample-ss
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

您可以使用以下命令检查磁盘名称

kubectl get pvc 并检查 VOLUME 列。这是disk_name

第二步

获取已配置的 PV 并将其复制到一个新的 PV 即 ROX

docs 中所述,您需要使用之前的磁盘(在步骤 1 中创建)作为源创建另一个磁盘:

# Create a disk snapshot:
gcloud compute disks snapshot <disk_name>

# Create a new disk using snapshot as source
gcloud compute disks create pvc-rox --source-snapshot=<snapshot_name>

创建一个新的 PV 和 PVC ReadOnlyMany

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-readonly-pv
spec:
  storageClassName: ''
  capacity:
    storage: 20Gi
  accessModes:
    - ReadOnlyMany
  claimRef:
    namespace: default
    name: my-readonly-pvc
  gcePersistentDisk:
    pdName: pvc-rox
    fsType: ext4
    readOnly: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-readonly-pvc
spec:
  storageClassName: ''
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 20Gi

volumesvolumeMounts 上添加readOnly: true,如上所述here

readOnly: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多