Режимы доступа Kubernetes PersistentVolumes

Согласно официальной K8S документации:

Доступны следующие режимы:

ReadWriteOnce - том может быть смонтирован как чтение-запись одним узлом

ReadOnlyMany - том может быть установлен только для чтения многими узлами

ReadWriteMany - том может быть установлен как чтение-запись многими узлами

Я создал один постоянный том с RWO режимом доступа. Я применил ПВХ:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: readwriteonce-test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: ""

и развертывание:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: test-deployment
spec:
  selector:
    matchLabels:
      app: test-deployment
  replicas: 3
  template:
    metadata:
      labels:
        app: test-deployment
    spec:
      containers:
      - name: test-pod
        image: "gcr.io/google_containers/busybox:1.24"
        command:
          - "/bin/sh"
        args:
          - "-c"
          - "rm -R /data/*; while :; do ls /data/; name=$(date '+%s'); echo \"some data in file ${name}\" >> \"/data/${name}.txt\" ; sleep 10; cat \"/data/${name}.txt\"; done"
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: /data
          name: test-volume
      restartPolicy: Always
      volumes:
      - name: test-volume
        persistentVolumeClaim:
          claimName: readwriteonce-test

Постоянный том:

Name:            readwriteonce-test
Labels:          volume-name=readwriteonce-test
Annotations:     kubectl.kubernetes.io/last-applied-configuration:
                   {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"labels":{"volume-name":"readwriteonce-test"},"name":"readwriteo...
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    
Status:          Bound
Claim:           ***/readwriteonce-test
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        8Gi
Node Affinity:   <none>
Message:         
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    ***.efs.eu-west-1.amazonaws.com
    Path:      /readwriteonce-test
    ReadOnly:  false
Events:        <none>

Вопрос в том:

Может ли кто-нибудь объяснить мне, почему в такой конфигурации нет ошибки? Как видите, каждый модуль смонтирован на разных узлах. Каждый модуль может видеть файлы, созданные другими модулями.

снимок экрана


person leebake    schedule 26.02.2020    source источник
comment
Какой у него объемный провайдер? Режим доступа - это всего лишь подсказка для базовой системы, но если вы используете efs, то всегда rwx   -  person coderanger    schedule 26.02.2020
comment
Да, именно EFS.   -  person leebake    schedule 26.02.2020
comment
Как вы развернули efs-provisioner, не могли бы вы поделиться своим классом хранения по умолчанию?   -  person PjoterS    schedule 27.02.2020
comment
Я только что прикрепил конфигурацию PV. Мы не используем классы хранения.   -  person leebake    schedule 28.02.2020


Ответы (1)


Я могу только подтвердить, что я разделяю те же наблюдения, что и вы, на моем тестовом кластере EKS при использовании постоянных томов на основе EFS, динамически создаваемых с помощью спецификации запроса PVC: accessModes: ReadOnlyMany.

Как показано ниже, я могу одновременно записывать в один и тот же файл из двух разных модулей, запланированных на разных узлах:

Hello from test-deployment-6f954f9f67-ljghs at 1583239308 on ip-192-168-68-xyz.us-west-2.compute.internal node
Hello from test-deployment-6f954f9f67-bl99s at 1583239308 on ip-192-168-49-abc.us-west-2.compute.internal node

Вместо этого я бы скорее ожидал аналогичного поведения *, как и в случае других типов PV, поддерживающих все типы режимов доступа (RWO, RWX, ROX):

Warning  FailedAttachVolume  103s  attachdetach-controller  Multi-Attach error for volume "pvc-badb4724-5d5a-11ea-8395-42010aa80131"

 Multi-Attach error for volume "pvc-badb4724-5d5a-11ea-8395-42010aa80131" Volume is already used by pod(s) test-deployment-xyz-...

* происходит, когда планировщик пытается запланировать вторую реплику модуля с тем же PV.

Я думаю, что это заложено в природе хранилища на основе NFS, которое является основным типом хранилища для EFS-Provider.

Похоже, что мы не единственные, у кого есть проблемы с пониманием официальной документации по этому вопросу, пожалуйста, проверьте эти открытые проблемы с github: # 18714, # 60903.

person Community    schedule 03.03.2020