Kubernetes NFS Persistent Volumes - несколько претензий на тот же объем? Претензия приостановлена?

Случай использования:

У меня есть каталог NFS, и я хочу использовать его для сохранения данных для нескольких развертываний и модулей.

Я создал PersistentVolume:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: http://mynfs.com
    path: /server/mount/point

Я хочу, чтобы несколько развертываний могли использовать этот PersistentVolume, поэтому я понимаю, что мне нужно создать несколько PersistentVolumeClaims которые все будут указывать на этот PersistentVolume.

kind: PersistentVolumeClaim
apiVersion: v1
metaData:
  name: nfs-pvc-1
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Mi

Я верю в это, чтобы создать заявку размером 50 МБ на PersistentVolume. Когда я запускаю kubectl get pvc, я вижу:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-1   Bound      nfs-pv    10Gi        RWX           35s

Я не понимаю, почему я вижу емкость 10Gi, а не 50Mi.

Когда я затем изменить PersistentVolumeClaim YAML развертывания для создания ПВХ с именем nfs-pvc-2 я получаю это:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-1   Bound      nfs-pv    10Gi        RWX           35s
nfs-pvc-2   Pending                                        10s

PVC2 никогда не связывается с PV. Это ожидаемое поведение? Могу ли я иметь несколько PVC, указывающих на один и тот же PV?

Когда я удаляю nfs-pvc-1, я вижу то же самое:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-2   Pending                                        10s

Опять же, это нормально?

Как правильно использовать/повторно использовать общий ресурс NFS между несколькими развертываниями/модулями?

Ответ 1

По сути, вы не можете делать то, что хотите, так как отношения PVC & lt; → PV один на один.

Если NFS - единственное доступное хранилище, для которого требуется несколько PV/PVC для одного экспорта nfs, используйте динамическую инициализацию и класс хранилища по умолчанию.

Это еще не в официальных K8s, но этот находится в инкубаторе, и я попробовал, и это работает хорошо: https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client

Это значительно упростит предоставление томов, так как вам нужно только позаботиться о PVC, и PV будет создан в качестве каталога на указанном вами сервере экспорта/сервера nfs.

Ответ 2

От: https://docs.openshift.org/latest/install_config/storage_examples/shared_storage.html

Как упомянул Baroudi Safwen, вы не можете привязать два пвх к одному и тому же пвх, но вы можете использовать один пвх в двух разных модулях.

volumes:
- name: nfsvol-2
  persistentVolumeClaim:
    claimName: nfs-pvc-1 <-- USE THIS ONE IN BOTH PODS   

Ответ 3

Постоянное требование тома связано исключительно с постоянным томом.
Вы не можете привязать 2 пвх к тому же пв.

Я думаю, вы заинтересованы в динамическом обеспечении. Я столкнулся с этой проблемой при развертывании наборов состояний, которые требуют динамической подготовки для модулей. Таким образом, вам необходимо развернуть в вашем кластере провайдера NFS, у провайдера NFS (pod) будет доступ к папке NFS (hostpath), и каждый раз, когда модуль запрашивает том, провайдер NFS будет монтировать его в каталог NFS от имени стручка.
Вот репозиторий github для его развертывания:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs/deploy/kubernetes
Но вы должны быть осторожны, вы должны убедиться, что поставщик nfs всегда работает на том же компьютере, где у вас есть папка NFS, используя селектор узлов, поскольку у вас том типа hostpath.

Ответ 4

несколько моментов о динамическом обеспечении.

использование динамической инициализации nfs не позволяет вам изменять любой из параметров монтирования nfs по умолчанию. На моей платформе это использует rsize/wsize 1M. это может вызвать огромные проблемы в некоторых приложениях, использующих небольшие файлы или блокировку чтения. (Я только что разобрался с этой проблемой)

Динамический это отличный вариант, если он соответствует вашим потребностям. Теперь я застрял с созданием 250 пар pv/pvc для моего приложения, которое обрабатывалось динамически из-за отношения 1-1.