Проблемы с монтированием постоянного тома как ReadOnlyMany в нескольких модулях

У меня возникли проблемы с подключением постоянного тома ReadOnlyMany к нескольким модулям на GKE. Сейчас он монтируется только на одном модуле и не может монтироваться на других (из-за того, что том используется на первом модуле), что приводит к ограничению развертывания одним модулем.

Я подозреваю, что проблема связана с заполнением тома из моментального снимка тома.

Просматривая связанные вопросы, я проверил, что 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

ПВХ:

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

person Mike Perrow    schedule 16.10.2020    source источник
comment
Вот конкретное событие ошибки, которое я получаю от 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 / zone / europe-west2-a / disks / pvc-0bf664-e721» уже находится используется 'projects / monsoon-273916 / zone / europe-west2-a / instance / gke-cluster-1-default-pool-3d6123cf-kcjo'   -  person Mike Perrow    schedule 16.10.2020
comment
Открыта проблема, github.com/kubernetes/kubernetes/issues/70505, связанная с Настройки ROX, могут помочь!   -  person bUff23    schedule 16.10.2020
comment
Я предполагаю, что PersistentVolume был создан? Как выглядит сам клип? было ли оно помечено как spec.gcePersistentDisk.readOnly = true?   -  person Ian Lewis    schedule 21.10.2020
comment
Спецификации PV не существует, так как это был динамически подготовленный PVC. Вот соответствующие части kubectl, описанные для подготовленного PV: StorageClass: sample-ssd Состояние: Режимы привязанного доступа: ROX VolumeMode: Filesystem Source: Type: CSI (Источник тома интерфейса хранилища контейнеров (CSI)) Драйвер: pd.csi. storage.gke.io VolumeHandle: ‹snip› Только для чтения: false   -  person Mike Perrow    schedule 21.10.2020
comment
Я обращаю внимание на то, что Source.ReadOnly = false в динамически подготовленном PV. Интересно, есть ли что-то, что я должен добавить в PVC в дополнение к режиму доступа.   -  person Mike Perrow    schedule 21.10.2020
comment
@MikePerrow Какую версию Kubernet вы используете?   -  person Mr.KoopaKiller    schedule 26.10.2020
comment
Кластер сейчас находится на 1.17.9-гке.1504   -  person Mike Perrow    schedule 27.10.2020


Ответы (1)


Инженеры Google знают об этой проблеме.

Более подробную информацию об этой проблеме вы можете найти в отчете о проблеме и запрос на вытягивание на GitHub.

Есть временный обходной путь, если вы пытаетесь подготовить PD из снимка и сделать его ROX:

  1. Предоставить PVC с источником данных как RWO;

Будет создан новый вычислительный диск с содержимым исходного диска
2. Возьмите подготовленный PV и скопируйте его в новый PV, который называется ROX, в соответствии с docs

Вы можете выполнить это с помощью следующих команд:

Шаг 1

Предоставить PVC с источником данных как RWO;

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

Шаг 2

Возьмите PV, который был подготовлен, и скопируйте его в новый PV, который называется ROX.

Как указано в документах, вы необходимо создать другой диск, используя предыдущий диск (созданный на шаге 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

Добавьте readOnly: true на свои volumes и volumeMounts, как указано здесь

readOnly: true
person Mr.KoopaKiller    schedule 20.11.2020