Есть ли какие-либо технические проблемы, если у меня есть один PVC для совместного использования одного тома для всех реплик с отслеживанием состояния?

Kubernetes создает один PersistentVolume для каждого определения VolumeClaimTemplate в наборе состояний. Благодаря этому каждый модуль с набором состояний имеет собственное хранилище, которое не используется совместно репликами. Однако я хотел бы использовать один и тот же том для всех реплик с отслеживанием состояния.

Похоже, подход должен быть следующим:

  1. Создайте PVC в том же пространстве имен.
  2. В наборе состояний используйте Volumes для привязки PVC
  3. Убедитесь, что PVC имеет значение ReadOnlyMany или ReadWriteMany.

Предполагая, что мое приложение может работать с любым параллелизмом на общем томе, есть ли какие-либо технические проблемы, если у меня есть один PVC для совместного использования одного и того же тома для всех реплик с отслеживанием состояния?


person yersan    schedule 04.05.2021    source источник
comment
Вы можете это сделать, это должно сработать. Нет необходимости использовать volumeClaimTemplates, если это не требуется вашему приложению.   -  person Jonas    schedule 04.05.2021
comment
Две очевидные проблемы заключаются в том, что ReadWrite Многие тома на самом деле немного сложно получить (такие вещи, как тома AWS EBS, доступны только для ReadWriteOnce), и что многие вещи, которые вы хотите запускать в StatefulSets (например, базы данных), требуют монопольного использования пространства своей файловой системы и блокировки файлов. чтобы обеспечить это.   -  person David Maze    schedule 04.05.2021


Ответы (1)


Я полностью согласен с комментариями @Jonas и @David Maze:

Вы можете это сделать, это должно сработать. Нет необходимости использовать volumeClaimTemplates, если это не требуется вашему приложению.

Две очевидные проблемы заключаются в том, что ReadWrite Многие тома на самом деле немного сложно получить (такие вещи, как тома AWS EBS, доступны только для ReadWriteOnce), и что многие вещи, которые вы хотите запускать в StatefulSets (например, базы данных), требуют монопольного использования пространства своей файловой системы и блокировки файлов. чтобы обеспечить это.


Отвечая на вопрос:

Есть ли какие-либо технические проблемы, если у меня есть один PVC для совместного использования одного тома для всех реплик с отслеживанием состояния?

Я бы сказал, что это в основном будет зависеть от:

  • Как приложение будет обрабатывать такой сценарий, когда у него есть единственный PVC (параллелизм записи).
  • Какие решения хранения поддерживаются вашим кластером Kubernetes (или могут быть реализованы).

Субъективно говоря, я не думаю, что должна быть проблема, когда вышеуказанные пункты подтверждаются и согласовываются с требованиями и конфигурацией, которые допускают кластер / приложения.


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

Мы также ничего не знаем о вашей инфраструктуре, поэтому может быть сложно указать вам на потенциальные проблемы. С точки зрения аппаратного обеспечения (кластер Kubernetes) это, по сути, приведет к исследованию конкретного решения для хранения данных, которое вы хотели бы использовать. Он может отличаться от поставщика облачных услуг к поставщику облачных услуг, а также от локальных решений. Вам нужно будет проверить требования вашего приложения, чтобы согласовать его с имеющимися у вас параметрами.

Продолжая тему Volumes, я считаю, что одной из важных вещей будет accessModes.

Ссылаясь на официальные документы:

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

PersistentVolume может быть установлен на хосте любым способом, поддерживаемым поставщиком ресурсов. Как показано в таблице ниже, провайдеры будут иметь разные возможности, и режимы доступа каждого PV установлены на определенные режимы, поддерживаемые этим конкретным томом. Например, NFS может поддерживать несколько клиентов чтения / записи, но конкретный PV NFS может быть экспортирован на сервер как доступный только для чтения. Каждый PV получает свой собственный набор режимов доступа, описывающих возможности этого конкретного PV.

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

  • ReadWriteOnce - том может быть смонтирован как чтение-запись одним узлом
  • ReadOnlyMany - том может быть установлен в режиме только для чтения многими узлами.
  • ReadWriteMany - том может быть смонтирован как чтение-запись многими узлами

В CLI режимы доступа сокращены до:

  • RWO - ReadWriteOnce
  • ROX - ReadOnlyMany
  • RWX - ReadWriteMany

Одна из проблем, с которой вы можете столкнуться, связана с ReadWriteOnce, когда PVC смонтирован на Node, а sts-X (Pod) запланирован на другой Node, но, судя по вопросу, я думаю, вы уже знаете об этом.


Однако я хотел бы использовать один и тот же том для всех реплик с отслеживанием состояния.

Пример StatefulSet с Volume, который будет использоваться всеми репликами, может быть следующим (измененный пример из документации Kubernetes):

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
      # VOLUME START 
        volumeMounts:
        - name: example-pvc
          mountPath: /usr/share/nginx/html
      volumes:
       - name: example-pvc
         persistentVolumeClaim:
           claimName: pvc-for-sts
      # VOLUME END 

Дополнительные ресурсы:

person Dawid Kruk    schedule 05.05.2021
comment
Привет @yersan. Это ответ на ваш вопрос? - person Wytrzymały Wiktor; 06.05.2021
comment
Да @ WytrzymałyWiktor, это развеивает мои сомнения - person yersan; 31.05.2021